from TestUser import TestUser
from TestKey import TestKey
from TestSlice import TestSlice
-
-# inserts a backslash before each occurence of the following chars
-# \ " ' < > & | ; ( ) $ *
-def backslash_shell_specials (command):
- result=''
- for char in command:
- if char in "\\\"'<>&|;()$*":
- result +='\\'+char
- else:
- result +=char
- return result
+from TestSliver import TestSliver
+from TestBox import TestBox
# step methods must take (self, options) and return a boolean
+def standby(minutes):
+ utils.header('Entering StandBy for %d mn'%minutes)
+ time.sleep(60*minutes)
+ return True
+
+def standby_generic (func):
+ def actual(self,options):
+ minutes=int(func.__name__.split("_")[1])
+ return standby(minutes)
+ return actual
+
class TestPlc:
def __init__ (self,plc_spec):
if self.vserver:
return "vserver %s exec %s"%(self.vservername,command)
else:
- return "chroot /plc/root %s"%backslash_shell_specials(command)
+ 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.plc_spec['hostname'],backslash_shell_specials(command))
+ return "ssh %s %s"%(self.plc_spec['hostname'],utils.backslash_shell_specials(command))
def full_command(self,command):
return self.to_host(self.host_to_guest(command))
return site
raise Exception,"Cannot locate site %s"%sitename
+ def locate_node (self,nodename):
+ for site in self.plc_spec['sites']:
+ for node in site['nodes']:
+ if node['node_fields']['hostname'] == nodename:
+ return (site,node)
+ raise Exception,"Cannot locate node %s"%nodename
+
def locate_key (self,keyname):
for key in self.plc_spec['keys']:
if key['name'] == keyname:
return key
raise Exception,"Cannot locate key %s"%keyname
-
- # this should be run on the nodes' host_box, not locally to the plc
- def kill_all_vmwares(self):
- utils.header('Killing any running vmware or vmplayer instance')
- utils.system('pgrep vmware | xargs -r kill')
- utils.system('pgrep vmplayer | xargs -r kill ')
- utils.system('pgrep vmware | xargs -r kill -9')
- utils.system('pgrep vmplayer | xargs -r kill -9')
-
- def kill_all_qemus(self):
+
+ # all different hostboxes used in this plc
+ def gather_hostBoxes(self):
+ # maps on sites and nodes, return [ (host_box,test_node) ]
+ tuples=[]
for site_spec in self.plc_spec['sites']:
test_site = TestSite (self,site_spec)
for node_spec in site_spec['nodes']:
- TestNode (self,test_site,node_spec).stop_qemu()
+ test_node = TestNode (self, test_site, node_spec)
+ if not test_node.is_real():
+ tuples.append( (test_node.host_box(),test_node) )
+ # transform into a dict { 'host_box' -> [ hostnames .. ] }
+ result = {}
+ for (box,node) in tuples:
+ if not result.has_key(box):
+ result[box]=[node]
+ else:
+ result[box].append(node)
+ return result
+ # a step for checking this stuff
+ def showboxes (self,options):
+ print 'showboxes'
+ for (box,nodes) in self.gather_hostBoxes().iteritems():
+ print box,":"," + ".join( [ node.name() for node in nodes ] )
+ return True
+
+ # make this a valid step
+ def kill_all_qemus(self,options):
+ for (box,nodes) in self.gather_hostBoxes().iteritems():
+ # this is the brute force version, kill all qemus on that host box
+ TestBox(box).kill_all_qemus()
+ return True
+
+ # make this a valid step
+ def list_all_qemus(self,options):
+ for (box,nodes) in self.gather_hostBoxes().iteritems():
+ # push the script
+ TestBox(box).copy("qemu_kill.sh")
+ # this is the brute force version, kill all qemus on that host box
+ TestBox(box).run("./qemu_kill.sh -l")
+ return True
+
+ # kill only the right qemus
+ def kill_qemus(self,options):
+ for (box,nodes) in self.gather_hostBoxes().iteritems():
+ # push the script
+ TestBox(box).copy("qemu_kill.sh")
+ # the fine-grain version
+ for node in nodes:
+ node.kill_qemu()
+ return True
+
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
else:
utils.header("Creating nodes for site %s in %s"%(test_site.name(),self.name()))
for node_spec in site_spec['nodes']:
- utils.show_spec('Creating node %s'%node_spec,node_spec)
+ utils.pprint('Creating node %s'%node_spec,node_spec)
test_node = TestNode (self,test_site,node_spec)
test_node.create_node ()
return True
return hostnames
# gracetime : during the first <gracetime> minutes nothing gets printed
- def do_check_nodes (self, minutes, gracetime=2):
-
+ def do_nodes_booted (self, minutes, gracetime=2):
# compute timeout
timeout = datetime.datetime.now()+datetime.timedelta(minutes=minutes)
graceout = datetime.datetime.now()+datetime.timedelta(minutes=gracetime)
-
# the nodes that haven't checked yet - start with a full list and shrink over time
tocheck = self.all_hostnames()
utils.header("checking nodes %r"%tocheck)
# create a dict hostname -> status
status = dict ( [ (hostname,'undef') for hostname in tocheck ] )
-
while tocheck:
# get their status
tocheck_status=self.server.GetNodes(self.auth_root(), tocheck, ['hostname','boot_state' ] )
if boot_state == 'boot':
utils.header ("%s has reached the 'boot' state"%hostname)
else:
+ # if it's a real node, never mind
+ (site_spec,node_spec)=self.locate_node(hostname)
+ if TestNode.is_real_model(node_spec['node_fields']['model']):
+ utils.header("WARNING - Real node %s in %s - ignored"%(hostname,boot_state))
+ # let's cheat
+ boot_state = 'boot'
if datetime.datetime.now() > graceout:
utils.header ("%s still in '%s' state"%(hostname,boot_state))
+ graceout=datetime.datetime.now()+datetime.timedelta(1)
status[hostname] = boot_state
# refresh tocheck
tocheck = [ hostname for (hostname,boot_state) in status.iteritems() if boot_state != 'boot' ]
-
if not tocheck:
return True
if datetime.datetime.now() > timeout:
# only useful in empty plcs
return True
- def check_nodes(self,options):
- return self.do_check_nodes(minutes=5)
-
+ def nodes_booted(self,options):
+ return self.do_nodes_booted(minutes=5)
+
+ #to scan and store the nodes's public keys and avoid to ask for confirmation when ssh
+ def scan_publicKeys(self,hostnames):
+ try:
+ temp_knownhosts="/root/known_hosts"
+ remote_knownhosts="/root/.ssh/known_hosts"
+ self.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))
+ #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 )
+ except Exception, err:
+ print err
+
+ def do_check_nodesSsh(self,minutes):
+ # compute timeout
+ timeout = datetime.datetime.now()+datetime.timedelta(minutes=minutes)
+ tocheck = self.all_hostnames()
+ self.scan_publicKeys(tocheck)
+ utils.header("checking Connectivity on nodes %r"%tocheck)
+ 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 )
+ if (not access):
+ utils.header('The node %s is sshable -->'%hostname)
+ # refresh tocheck
+ tocheck.remove(hostname)
+ else:
+ (site_spec,node_spec)=self.locate_node(hostname)
+ if TestNode.is_real_model(node_spec['node_fields']['model']):
+ utils.header ("WARNING : check ssh access into real node %s - skipped"%hostname)
+ tocheck.remove(hostname)
+ if not tocheck:
+ return True
+ if datetime.datetime.now() > timeout:
+ for hostname in tocheck:
+ utils.header("FAILURE to ssh into %s"%hostname)
+ return False
+ # otherwise, sleep for a while
+ time.sleep(15)
+ # only useful in empty plcs
+ return True
+
+ def nodes_ssh(self, options):
+ return self.do_check_nodesSsh(minutes=2)
+
def bootcd (self, options):
for site_spec in self.plc_spec['sites']:
test_site = TestSite (self,site_spec)
test_node=TestNode (self,test_site,node_spec)
test_node.create_boot_cd(options.path)
return True
-
+
+ def do_check_intiscripts(self):
+ for site_spec in self.plc_spec['sites']:
+ test_site = TestSite (self,site_spec)
+ test_node = TestNode (self,test_site,site_spec['nodes'])
+ for slice_spec in self.plc_spec['slices']:
+ test_slice=TestSlice (self,test_site,slice_spec)
+ test_sliver=TestSliver(self,test_node,test_slice)
+ init_status=test_sliver.get_initscript(slice_spec)
+ if (not init_status):
+ return False
+ return init_status
+
+ def check_initscripts(self, options):
+ return self.do_check_intiscripts()
+
def initscripts (self, options):
for initscript in self.plc_spec['initscripts']:
- utils.show_spec('Adding Initscript in plc %s'%self.plc_spec['name'],initscript)
+ utils.pprint('Adding Initscript in plc %s'%self.plc_spec['name'],initscript)
self.server.AddInitScript(self.auth_root(),initscript['initscript_fields'])
return True
utils.header("Deleting slices in site %s"%test_site.name())
test_slice.delete_slice()
else:
- utils.show_spec("Creating slice",slice)
+ utils.pprint("Creating slice",slice)
test_slice.create_slice()
utils.header('Created Slice %s'%slice['slice_fields']['name'])
return True
site_spec = self.locate_site (slice_spec['sitename'])
test_site = TestSite(self,site_spec)
test_slice=TestSlice(self,test_site,slice_spec)
- status=test_slice.do_check_slices()
- return status
+ status=test_slice.do_check_slice(options)
+ if (not status):
+ return False
+ return status
def start_nodes (self, options):
- self.kill_all_vmwares()
- self.kill_all_qemus()
- utils.header("Starting vmware nodes")
+ utils.header("Starting nodes")
for site_spec in self.plc_spec['sites']:
TestSite(self,site_spec).start_nodes (options)
return True
def stop_nodes (self, options):
- self.kill_all_vmwares ()
self.kill_all_qemus()
return True
+ def check_tcp (self, options):
+ #we just need to create a sliver object nothing else
+ test_sliver=TestSliver(self,
+ TestNode(self, TestSite(self,self.plc_spec['sites'][0]),
+ self.plc_spec['sites'][0]['nodes'][0]),
+ TestSlice(self,TestSite(self,self.plc_spec['sites'][0]),
+ self.plc_spec['slices']))
+ return test_sliver.do_check_tcp(self.plc_spec['tcp_param'],options)
+
# returns the filename to use for sql dump/restore, using options.dbname if set
def dbfile (self, database, options):
# uses options.dbname if it is found
self.run_in_guest('service httpd start')
utils.header('Database restored from ' + dump)
+
+ @standby_generic
+ def standby_1(): pass
+ @standby_generic
+ def standby_2(): pass
+ @standby_generic
+ def standby_3(): pass
+ @standby_generic
+ def standby_4(): pass
+ @standby_generic
+ def standby_5(): pass
+ @standby_generic
+ def standby_6(): pass
+ @standby_generic
+ def standby_7(): pass
+ @standby_generic
+ def standby_8(): pass
+ @standby_generic
+ def standby_9(): pass
+ @standby_generic
+ def standby_10(): pass
+ @standby_generic
+ def standby_11(): pass
+ @standby_generic
+ def standby_12(): pass
+ @standby_generic
+ def standby_13(): pass
+ @standby_generic
+ def standby_14(): pass
+ @standby_generic
+ def standby_15(): pass
+ @standby_generic
+ def standby_16(): pass
+ @standby_generic
+ def standby_17(): pass
+ @standby_generic
+ def standby_18(): pass
+ @standby_generic
+ def standby_19(): pass
+ @standby_generic
+ def standby_20(): pass
+