From e16c6f6d0f0a6dd14d8ad8d05ebcbd030a9d9fff Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Tue, 18 Mar 2008 17:25:49 +0000 Subject: [PATCH] first draft for getting all the remote, local and others commands into the same class --- system/TestBox.py | 24 +++--------- system/TestPlc.py | 90 +++++++++++++++++--------------------------- system/TestSlice.py | 22 +++++++---- system/TestSliver.py | 23 +++++++---- system/TestSsh.py | 62 ++++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 90 deletions(-) create mode 100644 system/TestSsh.py diff --git a/system/TestBox.py b/system/TestBox.py index 7413474..9945f0c 100644 --- a/system/TestBox.py +++ b/system/TestBox.py @@ -2,8 +2,8 @@ # this models a box that hosts qemu nodes # could probably also be used for boxes that host plc instances import os.path - import utils +from TestSsh import TestSsh class TestBox: @@ -11,7 +11,8 @@ class TestBox: self.hostname_value=hostname self.buildname=buildname self.key=key - + self.test_ssh=TestSsh(self) + def hostname (self): return self.hostname_value @@ -26,25 +27,10 @@ class TestBox: return False def run_in_buildname (self,command): - if self.is_local(): - return utils.system(command) - ssh_comand="ssh " - if self.key: - ssh_comand += "-i %s.rsa "%(self.key) - ssh_command += "%s/%s"%(self.buildname,utils.backslash_shell_specials(command)) - return utils.system(ssh_command) - + return self.test_ssh.run_in_buildname (command) # should use rsync instead def copy (self,local_file,recursive=False): - if self.is_local(): - return 0 - command="scp " - if recursive: command += "-r " - if self.key: - command += "-i %s.rsa " - command +="%s %s:%s/%s"%(local_file,self.hostname(),self.buildname, - os.path.basename(local_file) or ".") - return utils.system(command) + return self.test_ssh.copy (local_file,recursive=False) def clean_dir (self): if self.is_local(): diff --git a/system/TestPlc.py b/system/TestPlc.py index 6c2195b..cb56023 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -16,6 +16,7 @@ from TestKey import TestKey from TestSlice import TestSlice from TestSliver import TestSliver from TestBox import TestBox +from TestSsh import TestSsh # step methods must take (self, options) and return a boolean @@ -35,6 +36,7 @@ class TestPlc: def __init__ (self,plc_spec): self.plc_spec=plc_spec self.path=os.path.dirname(sys.argv[0]) + self.test_ssh=TestSsh(self) try: self.vserverip=plc_spec['vserverip'] self.vservername=plc_spec['vservername'] @@ -64,32 +66,13 @@ class TestPlc: def connect (self): pass - # command gets run in the chroot/vserver + #command gets run in the chroot/vserver def host_to_guest(self,command): if self.vserver: return "vserver %s exec %s"%(self.vservername,command) else: return "chroot /plc/root %s"%utils.backslash_shell_specials(command) - - # command gets run on the right box - def to_host(self,command): - if self.is_local(): - return command - else: - return "ssh %s %s"%(self.hostname(),utils.backslash_shell_specials(command)) - - def full_command(self,command): - return self.to_host(self.host_to_guest(command)) - - def run_in_guest (self,command): - return utils.system(self.full_command(command)) - def run_in_host (self,command): - return utils.system(self.to_host(command)) - - # xxx quick n dirty - def run_in_guest_piped (self,local,remote): - return utils.system(local+" | "+self.full_command(remote)) - + # copy a file to the myplc root image - pass in_data=True if the file must go in /plc/data def copy_in_guest (self, localfile, remotefile, in_data=False): if in_data: @@ -189,8 +172,8 @@ class TestPlc: def clear_ssh_config (self,options): # install local ssh_config file as root's .ssh/config - ssh should be quiet # dir might need creation first - self.run_in_guest("mkdir /root/.ssh") - self.run_in_guest("chmod 700 /root/.ssh") + self.test_ssh.run_in_guest("mkdir /root/.ssh") + self.test_ssh.run_in_guest("chmod 700 /root/.ssh") # this does not work - > redirection somehow makes it until an argument to cat #self.run_in_guest_piped("cat ssh_config","cat > /root/.ssh/config") self.copy_in_guest("ssh_config","/root/.ssh/config",True) @@ -200,22 +183,19 @@ class TestPlc: ### uninstall def uninstall_chroot(self,options): - self.run_in_host('service plc safestop') + self.test_ssh.run_in_host('service plc safestop') #####detecting the last myplc version installed and remove it - self.run_in_host('rpm -e myplc') + self.test_ssh.run_in_host('rpm -e myplc') ##### Clean up the /plc directory - self.run_in_host('rm -rf /plc/data') + self.test_ssh.run_in_host('rm -rf /plc/data') + ##### stop any running vservers + self.test_ssh.run_in_host('for vserver in $(ls /vservers/* | sed -e s,/vservers/,,) ; do vserver $vserver stop ; done') return True def uninstall_vserver(self,options): - self.run_in_host("vserver --silent %s delete"%self.vservername) + self.test_ssh.run_in_host("vserver --silent %s delete"%self.vservername) return True - def stop_all_vservers (self,options): - ##### stop any running vservers - self.run_in_host('for vserver in $(ls -d /vservers/* | sed -e s,/vservers/,,) ; do echo Stopping $vserver; vserver $vserver stop ; done') - return True - def uninstall(self,options): # if there's a chroot-based myplc running, and then a native-based myplc is being deployed # it sounds safer to have the former uninstalled too @@ -225,7 +205,6 @@ class TestPlc: self.uninstall_chroot(options) else: self.uninstall_chroot(options) - self.stop_all_vservers(options) return True ### install @@ -243,16 +222,15 @@ class TestPlc: # use a standard name - will be relative to HOME build_dir="tests-system-build" build_checkout = "svn checkout %s %s"%(options.build_url,build_dir) - if self.run_in_host(build_checkout) != 0: + if self.test_ssh.run_in_host(build_checkout) != 0: raise Exception,"Cannot checkout build dir" # the repo url is taken from myplc-url # with the last two steps (i386/myplc...) removed repo_url = options.myplc_url repo_url = os.path.dirname(repo_url) - repo_url = os.path.dirname(repo_url) create_vserver="%s/vtest-init-vserver.sh %s %s -- --interface eth0:%s"%\ (build_dir,self.vservername,repo_url,self.vserverip) - if self.run_in_host(create_vserver) != 0: + if self.test_ssh.run_in_host(create_vserver) != 0: raise Exception,"Could not create vserver for %s"%self.vservername return True @@ -264,9 +242,9 @@ class TestPlc: ### install_rpm def cache_rpm(self,url): - self.run_in_host('rm -rf *.rpm') + self.test_ssh.run_in_host('rm -rf *.rpm') utils.header('Curling rpm from %s'%url) - id= self.run_in_host('curl -O '+url) + id= self.test_ssh.run_in_host('curl -O '+url) if (id != 0): raise Exception,"Could not get rpm from %s"%url return False @@ -277,12 +255,12 @@ class TestPlc: if (not os.path.isfile(rpm)): self.cache_rpm(options.myplc_url) utils.header('Installing the : %s'%rpm) - self.run_in_host('rpm -Uvh '+rpm) - self.run_in_host('service plc mount') + self.test_ssh.run_in_host('rpm -Uvh '+rpm) + self.test_ssh.run_in_host('service plc mount') return True def install_rpm_vserver(self,options): - self.run_in_guest("yum -y install myplc-native") + self.test_ssh.run_in_guest("yum -y install myplc-native") return True def install_rpm(self,options): @@ -311,23 +289,23 @@ class TestPlc: fileconf.write('q\n') fileconf.close() utils.system('cat %s'%tmpname) - self.run_in_guest_piped('cat %s'%tmpname,'plc-config-tty') + self.test_ssh.run_in_guest_piped('cat %s'%tmpname,'plc-config-tty') utils.system('rm %s'%tmpname) return True # the chroot install is slightly different to this respect def start(self, options): if self.vserver: - self.run_in_guest('service plc start') + self.test_ssh.run_in_guest('service plc start') else: - self.run_in_host('service plc start') + self.test_ssh.run_in_host('service plc start') return True def stop(self, options): if self.vserver: - self.run_in_guest('service plc stop') + self.test_ssh.run_in_guest('service plc stop') else: - self.run_in_host('service plc stop') + self.test_ssh.run_in_host('service plc stop') return True # could use a TestKey class @@ -467,14 +445,14 @@ class TestPlc: try: temp_knownhosts="/root/known_hosts" remote_knownhosts="/root/.ssh/known_hosts" - self.run_in_host("touch %s"%temp_knownhosts ) + self.test_ssh.run_in_host("touch %s"%temp_knownhosts ) for hostname in hostnames: utils.header("Scan Public %s key and store it in the known_host file(under the root image) "%hostname) - scan=self.run_in_host('ssh-keyscan -t rsa %s >> %s '%(hostname,temp_knownhosts)) + scan=self.test_ssh.run_in_host('ssh-keyscan -t rsa %s >> %s '%(hostname,temp_knownhosts)) #Store the public keys in the right root image self.copy_in_guest(temp_knownhosts,remote_knownhosts,True) #clean the temp keys file used - self.run_in_host('rm -f %s '%temp_knownhosts ) + self.test_ssh.run_in_host('rm -f %s '%temp_knownhosts ) except Exception, err: print err @@ -487,7 +465,7 @@ class TestPlc: while tocheck: for hostname in tocheck: # try to ssh in nodes - access=self.run_in_guest('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s date'%hostname ) + access=self.test_ssh.run_in_guest('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s date'%hostname ) if (not access): utils.header('The node %s is sshable -->'%hostname) # refresh tocheck @@ -607,20 +585,20 @@ class TestPlc: def db_dump(self, options): dump=self.dbfile("planetab4",options) - self.run_in_guest('pg_dump -U pgsqluser planetlab4 -f '+ dump) + self.test_ssh.run_in_guest('pg_dump -U pgsqluser planetlab4 -f '+ dump) utils.header('Dumped planetlab4 database in %s'%dump) return True def db_restore(self, options): dump=self.dbfile("planetab4",options) ##stop httpd service - self.run_in_guest('service httpd stop') + self.test_ssh.run_in_guest('service httpd stop') # xxx - need another wrapper - self.run_in_guest_piped('echo drop database planetlab4','psql --user=pgsqluser template1') - self.run_in_guest('createdb -U postgres --encoding=UNICODE --owner=pgsqluser planetlab4') - self.run_in_guest('psql -U pgsqluser planetlab4 -f '+dump) + self.test_ssh.run_in_guest_piped('echo drop database planetlab4','psql --user=pgsqluser template1') + self.test_ssh.run_in_guest('createdb -U postgres --encoding=UNICODE --owner=pgsqluser planetlab4') + self.test_ssh.run_in_guest('psql -U pgsqluser planetlab4 -f '+dump) ##starting httpd service - self.run_in_guest('service httpd start') + self.test_ssh.run_in_guest('service httpd start') utils.header('Database restored from ' + dump) diff --git a/system/TestSlice.py b/system/TestSlice.py index 81ad596..122c1ba 100644 --- a/system/TestSlice.py +++ b/system/TestSlice.py @@ -6,6 +6,7 @@ import time from TestKey import TestKey from TestUser import TestUser from TestNode import TestNode +from TestSsh import TestSsh class TestSlice: @@ -13,10 +14,17 @@ class TestSlice: self.test_plc=test_plc self.test_site=test_site self.slice_spec=slice_spec - + self.test_ssh=TestSsh(self) + def name(self): return self.slice_spec['slice_fields']['name'] - + + def is_local(self): + return self.test_plc.is_local() + + def host_to_guest(self,command): + return self.test_plc.host_to_guest(command) + def get_slice(self,slice_name): for slice_spec in self.test_plc.plc_spec['slices']: if(slice_spec['slice_fields']['name']== slice_name): @@ -59,7 +67,7 @@ class TestSlice: utils.header("Messing with known_hosts for slice %s"%self.name()) # scan nodenames for nodename in self.slice_spec['nodenames']: - self.test_plc.run_in_guest("sed -i -e /^%s/d /root/.ssh/known_hosts"%nodename) + self.test_ssh.run_in_guest("sed -i -e /^%s/d /root/.ssh/known_hosts"%nodename) #scan public key and update the known_host file in the root image self.test_plc.scan_publicKeys(self.slice_spec['nodenames']) @@ -79,7 +87,7 @@ class TestSlice: #create dir in plc root image remote_privatekey="/root/keys/%s.rsa"%keyname if not os.path.isfile(remote_privatekey): - self.test_plc.run_in_guest("mkdir -p /root/keys" ) + self.test_ssh.run_in_guest("mkdir -p /root/keys" ) self.test_plc.copy_in_guest(privatekey,remote_privatekey,True) return (found,remote_privatekey) @@ -101,7 +109,7 @@ class TestSlice: break while (bool): utils.header('trying to connect to %s@%s'%(self.name(),hostname)) - Date=self.test_plc.run_in_guest('ssh -i %s %s@%s date'%(remote_privatekey,self.name(),hostname)) + Date=self.test_ssh.run_in_guest('ssh -i %s %s@%s date'%(remote_privatekey,self.name(),hostname)) if (Date==0): break elif ( start_time <= dead_time ) : @@ -109,13 +117,13 @@ class TestSlice: time.sleep(45) elif (options.forcenm): utils.header('%s@%s : restarting nm in case is in option on %s'%(self.name(),hostname,hostname)) - access=self.test_plc.run_in_guest('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%hostname) + access=self.test_ssh.run_in_guest('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%hostname) if (access==0): utils.header('nm restarted on %s'%hostname) else: utils.header('%s@%s : Failed to restart the NM on %s'%(self.name(),hostname,hostname)) utils.header('Try to reconnect to %s@%s after the tentative of restarting NM'%(self.name(),hostname)) - connect=self.test_plc.run_in_guest('ssh -i %s %s@%s date'%(remote_privatekey,self.name(),hostname)) + connect=self.test_ssh.run_in_guest('ssh -i %s %s@%s date'%(remote_privatekey,self.name(),hostname)) if (not connect): utils.header('connected to %s@%s -->'%(self.name(),hostname)) break diff --git a/system/TestSliver.py b/system/TestSliver.py index 865b0ba..01b05ea 100644 --- a/system/TestSliver.py +++ b/system/TestSliver.py @@ -2,7 +2,7 @@ import utils import os, os.path import datetime import time - +from TestSsh import TestSsh class TestSliver: @@ -10,7 +10,14 @@ class TestSliver: self.test_plc=test_plc self.test_node=test_node self.test_slice=test_slice - + self.test_ssh =TestSsh(self) + + def is_local(self): + return self.test_plc.is_local() + + def host_to_guest(self,command): + return self.test_plc.host_to_guest(command) + def get_privateKey(self,slice_spec): try: (found,remote_privatekey)=self.test_slice.locate_key(slice_spec) @@ -25,7 +32,7 @@ class TestSliver: for hostname in slice_spec['nodenames']: utils.header("Checking initiscript %s on the slice %s@%s" %(slice_spec['initscriptname'],self.test_slice.name(),hostname)) - init_file=self.test_plc.run_in_guest('ssh -i %s %s@%s ls -l /tmp/init* ' + init_file=self.test_ssh.run_in_guest('ssh -i %s %s@%s ls -l /tmp/init* ' %(remote_privatekey,self.test_slice.name(),hostname)) if ( init_file): return False @@ -36,13 +43,13 @@ class TestSliver: if peer_spec['peer_name']=="server": tcp_command="ssh -i %s %s@%s ./tcptest.py server -t 10"%(remote_privatekey, peer_spec['slice_name'], peer_spec['server_name']) - return self.test_plc.run_in_guest(tcp_command) + return self.test_ssh.run_in_guest(tcp_command) else: tcp_command="ssh -i %s %s@%s ./tcptest.py client -a %s -p %d"%(remote_privatekey, peer_spec['slice_name'], peer_spec['client_name'],peer_spec['peer_server'], peer_spec['server_port']) - return self.test_plc.run_in_guest(tcp_command) + return self.test_ssh.run_in_guest(tcp_command) @@ -60,7 +67,7 @@ class TestSliver: (found,remote_privatekey)=self.get_privateKey(slice_spec) cp_server_command="scp -i %s ./tcptest.py %s@%s:"%(remote_privatekey,peer_param['slice_name'], peer_param['server_name']) - self.test_plc.run_in_guest(cp_server_command) + self.test_ssh.run_in_guest(cp_server_command) serv_status=self.run_tcpcheck(peer_param,remote_privatekey) if (serv_status): utils.header("FAILED to check loop Connexion on the %s server side"%peer_param['server_name']) @@ -73,7 +80,7 @@ class TestSliver: (found,remote_privatekey)=self.get_privateKey(slice_spec) cp_client_command="scp -i %s ./tcptest.py %s@%s:"%(remote_privatekey, peer_param['slice_name'], peer_param['client_name']) - self.test_plc.run_in_guest(cp_client_command) + self.test_ssh.run_in_guest(cp_client_command) client_status=self.run_tcpcheck(peer_param,remote_privatekey) if ( serv_status): utils.header("FAILED to Contact the server %s from the client side %s"%(peer_param['peer_server'], @@ -81,7 +88,7 @@ class TestSliver: return False - self.test_plc.run_in_guest("rm -rf tcptest.py") + self.test_ssh.run_in_guest("rm -rf tcptest.py") return True diff --git a/system/TestSsh.py b/system/TestSsh.py new file mode 100644 index 0000000..dd0d324 --- /dev/null +++ b/system/TestSsh.py @@ -0,0 +1,62 @@ +#this class is used for any ssh command and +#also for any remote or a local command independently +#on which box this must be done. +#new TestSsh object take like an argument an instance +#of the class where it was created + +import os.path +import utils + +class TestSsh: + + def __init__(self,caller): + self.caller=caller + + + def hostanme(self): + return self.caller.hostname() + def is_local(self): + return self.caller.is_local() + def buildname(self): + return self.caller.buildname() + + # command gets run on the right box + def to_host(self,command): + if self.caller.is_local(): + return command + else: + return "ssh %s %s"%(self.hostname(),utils.backslash_shell_specials(command)) + + def full_command(self,command): + return self.to_host(self.caller.host_to_guest(command)) + + def run_in_guest (self,command): + return utils.system(self.full_command(command)) + + def run_in_host (self,command): + return utils.system(self.to_host(command)) + + # xxx quick n dirty + def run_in_guest_piped (self,local,remote): + return utils.system(local+" | "+self.full_command(remote)) + + def run_in_buildname (self,command): + if self.is_local(): + return utils.system(command) + ssh_comand="ssh " + if self.caller.key: + ssh_comand += "-i %s.rsa "%(self.caller.key) + ssh_command += "%s/%s"%(self.buildname,utils.backslash_shell_specials(command)) + return utils.system(ssh_command) + + def copy (self,local_file,recursive=False): + if self.is_local(): + return 0 + command="scp " + if recursive: command += "-r " + if self.caller.key: + command += "-i %s.rsa " + command +="%s %s:%s/%s"%(local_file,self.hostname(),self.buildname, + os.path.basename(local_file) or ".") + return utils.system(command) + -- 2.43.0