#!/usr/bin/env python3 # This script aims to help to run locktests with several clients. # # Report bugs to Vincent ROQUETA : vincent.roqueta@ext.bull.net import encodings import shutil import os, sys import getopt, sys import string import socket from stat import * from sys import * from os import * NFS4_PATH="/mnt/nfsv4" NFS4_SERVER="" TEST_HOME="/home/vincent/locks/" testfile=NFS4_PATH+"/testfile" app="locktests" SRC="locktests.tar.gz" SRC_PATH="deploy" install="'tar xzf "+SRC+"; cd locks; make `" user="root" class Machine: def mkdir(self,dir): self.command="mkdir -p "+dir self.do() def rmdir(self,dir): self.command="rm -rf "+dir self.do() def printc(self): print("->"+self.command) print("\n") class Client(Machine): def __init__(self, machine): self.command="" self.machine=machine self.mountPath=NFS4_PATH def do(self): self.command="ssh "+user+"@"+self.machine+" "+self.command os.system(self.command) def isomount(self, dir): export=NFS4_SERVER mntpoint=NFS4_PATH self.command="'mkdir -p "+mntpoint+"; mount -t nfs4 "+export+" "+mntpoint+"'" self.do() def umount(self, dir): mntpoint=self.mountPath+"/"+dir self.command="umount "+mntpoint self.do() def install(self, path): self.command="'cd "+path+"; tar xzf "+SRC+"; cd locks; make'" self.do() def run(self, appli): self.command=appli self.do() def cp(self, fichier, path): command="scp "+fichier+" "+user+"@"+self.machine+":"+path os.system(command) class Serveur(Machine): def __init__(self, ip, exportPath): self.SERVEUR=ip self.exportPath=exportPath def do(self): self.command="ssh "+self.SERVEUR+" "+self.command os.system(self.command) def configure(self, dir): exportDir=self.exportPath+'/'+dir self. mkdir(exportDir) #self.printc() self.export(exportDir) #self.printc() def clean(self, dir): unexportDir=self.exportPath+'/'+dir self.unexport(unexportDir) self.rmdir(unexportDir) def usage(): print("\n") print("usage:") print("locktests.py <-n process -f testfile ><--setup -s fs_server> -c host1, host2, host3 ... ") print("--setup : setup the configuration, deploy test on other test machines; This option also requires -c and -s") print("-c <machine> : host list to deploy/run/clean the test") print("-s <machine> : NFS server to use to setup the test") print("-n <num> : number of processes each test machine will lauch to perform the test") print("-f <file> : test file. This must be the same on each machine") print(" ") print("Example :") print("=========") print("*Setup machines for testing") print("./locktests.py --setup -c testmachine1 testmachine2 testmachine3 -s my_nfs_server:/") print("\n") print("*Run test on testmachine1,testmachine2 with 50 process on each machine using /mnt/nfsv4/testfile") print("./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2") print("\n") print("_________________________________") print("Vincent ROQUETA - Bull SA - 2005\n") return 0 def setup(): path=os.path.abspath(".") fichier=SRC_PATH+"/"+SRC commande="" for i in clients: print("Setting up machine "+i) c=Client(i) c.mkdir(path) c.cp(fichier, path) c.install(path) c.isomount(NFS4_PATH) #Setup localhost print("Setting up localhost") commande="make; mkdir -p "+NFS4_PATH+" ; mount -t nfs4 "+NFS4_SERVER+" "+NFS4_PATH+" &" os.system(commande) def run(): path=os.path.abspath(".") nbreClients=len(clients) hostname=socket.gethostname() # Lancement du serveur en local # Launch the server locally commande=path+"/"+app+" -n "+nbreProcess+" -f "+filename+" -c "+str(nbreClients)+" &" os.system(commande) commande=path+"/locks/"+app+" --server "+hostname for i in clients: c=Client(i) c.run(commande) def clean(): for i in clients: client.umount(NFS4_PATH) args=sys.argv[1:] rge=list(range(len(args))) a="" r=True s=False nfsServer=False c=False f=False n=False clients=[] for i in rge: if args[i] in ("--install", "-i", "--setup"): r=False s=True continue if args[i] in ("-s", "--server"): a="nfsServer" nfsServer=True continue if args[i] in ("-h", "--help"): usage() sys.exit(1) if args[i] in ("--clients", "-c"): a="clients" c=True continue if args[i] == "-n": a="nbre" n=True continue if args[i] == "-f": a="file" f=True continue if a=="clients": clients.append(args[i]) continue if a=="file": filename=args[i] continue if a=="nbre": nbreProcess=args[i] continue if a=="nfsServer": NFS4_SERVER=args[i] continue usage() # For ... if s: if (not c) or (not nfsServer): usage() sys.exit(1) print("Setup") print(NFS4_SERVER) setup() print("Setup complete") if r: if (not c) or (not f) or (not n): usage() sys.exit(1) print("Running test") run()