+ #################### display config
+ def display (self):
+ self.display_pass (1)
+ self.display_pass (2)
+ return True
+
+ # entry point
+ def display_pass (self,passno):
+ for (key,val) in self.plc_spec.iteritems():
+ if passno == 2:
+ if key == 'sites':
+ for site in val:
+ self.display_site_spec(site)
+ for node in site['nodes']:
+ self.display_node_spec(node)
+ elif key=='initscripts':
+ for initscript in val:
+ self.display_initscript_spec (initscript)
+ elif key=='slices':
+ for slice in val:
+ self.display_slice_spec (slice)
+ elif key=='keys':
+ for key in val:
+ self.display_key_spec (key)
+ elif passno == 1:
+ if key not in ['sites','initscripts','slices','keys']:
+ print '* ',key,':',val
+
+ def display_site_spec (self,site):
+ print '* ======== site',site['site_fields']['name']
+ for (k,v) in site.iteritems():
+ if k=='nodes':
+ if v:
+ print '* ','nodes : ',
+ for node in v:
+ print node['node_fields']['hostname'],'',
+ print ''
+ elif k=='users':
+ if v:
+ print '* users : ',
+ for user in v:
+ print user['name'],'',
+ print ''
+ elif k == 'site_fields':
+ print '* login_base',':',v['login_base']
+ elif k == 'address_fields':
+ pass
+ else:
+ print '* ',k,
+ PrettyPrinter(indent=8,depth=2).pprint(v)
+
+ def display_initscript_spec (self,initscript):
+ print '* ======== initscript',initscript['initscript_fields']['name']
+
+ def display_key_spec (self,key):
+ print '* ======== key',key['name']
+
+ def display_slice_spec (self,slice):
+ print '* ======== slice',slice['slice_fields']['name']
+ for (k,v) in slice.iteritems():
+ if k=='nodenames':
+ if v:
+ print '* nodes : ',
+ for nodename in v:
+ print nodename,'',
+ print ''
+ elif k=='usernames':
+ if v:
+ print '* users : ',
+ for username in v:
+ print username,'',
+ print ''
+ elif k=='slice_fields':
+ print '* fields',':',
+ print 'max_nodes=',v['max_nodes'],
+ print ''
+ else:
+ print '* ',k,v
+
+ def display_node_spec (self,node):
+ print "* node",node['name'],"host_box=",node['host_box'],
+ print "hostname=",node['node_fields']['hostname'],
+ print "ip=",node['interface_fields']['ip']
+
+
+ # another entry point for just showing the boxes involved
+ def display_mapping (self):
+ TestPlc.display_mapping_plc(self.plc_spec)
+ return True
+
+ @staticmethod
+ def display_mapping_plc (plc_spec):
+ print '* MyPLC',plc_spec['name']
+ print '*\tvserver address = root@%s:/vservers/%s'%(plc_spec['hostname'],plc_spec['vservername'])
+ print '*\tIP = %s/%s'%(plc_spec['PLC_API_HOST'],plc_spec['vserverip'])
+ for site_spec in plc_spec['sites']:
+ for node_spec in site_spec['nodes']:
+ TestPlc.display_mapping_node(node_spec)
+
+ @staticmethod
+ def display_mapping_node (node_spec):
+ print '* NODE %s'%(node_spec['name'])
+ print '*\tqemu box %s'%node_spec['host_box']
+ print '*\thostname=%s'%node_spec['node_fields']['hostname']
+
+ ### utility methods for handling the pool of IP addresses allocated to plcs
+ # Logic
+ # (*) running plcs are recorded in the file named ~/running-test-plcs
+ # (*) this file contains a line for each running plc, older first
+ # (*) each line contains the vserver name + the hostname of the (vserver) testbox where it sits
+ # (*) the free_tracker method performs a vserver stop on the oldest entry
+ # (*) the record_tracker method adds an entry at the bottom of the file
+ # (*) the cleanup_tracker method stops all known vservers and removes the tracker file
+
+ TRACKER_FILE=os.environ['HOME']+"/running-test-plcs"
+ # how many concurrent plcs are we keeping alive - adjust with the IP pool size
+ TRACKER_KEEP_VSERVERS = 12
+
+ def record_tracker (self):
+ try:
+ lines=file(TestPlc.TRACKER_FILE).readlines()
+ except:
+ lines=[]
+
+ this_line="%s %s\n"%(self.vservername,self.test_ssh.hostname)
+ for line in lines:
+ if line==this_line:
+ print 'this vserver is already included in %s'%TestPlc.TRACKER_FILE
+ return True
+ if self.options.dry_run:
+ print 'dry_run: record_tracker - skipping tracker update'
+ return True
+ tracker=file(TestPlc.TRACKER_FILE,"w")
+ for line in lines+[this_line]:
+ tracker.write(line)
+ tracker.close()
+ print "Recorded %s in running plcs on host %s"%(self.vservername,self.test_ssh.hostname)