9 from TestSite import TestSite
10 from TestNode import TestNode
11 from TestUser import TestUser
13 # step methods must take (self, options) and return a boolean
17 def __init__ (self,plc_spec):
18 self.plc_spec=plc_spec
19 self.url="https://%s:443/PLCAPI/"%plc_spec['hostname']
20 self.server=xmlrpclib.Server(self.url,allow_none=True)
21 self.path=os.path.dirname(sys.argv[0])
23 self.vserver=plc_spec['vserver']
28 return self.plc_spec['name']
31 # tricky : define les methodes de l'API sur cet object
35 return {'Username':self.plc_spec['PLC_ROOT_USER'],
36 'AuthMethod':'password',
37 'AuthString':self.plc_spec['PLC_ROOT_PASSWORD'],
38 'Role' : self.plc_spec['role']
40 def display_results(self, test_case_name, status, timers):
41 timers=datetime.datetime.now()
42 fileHandle = open (self.path+'/results.txt', 'a' )
43 fileHandle.write ( str(test_case_name)+'\t' +str(status)+'\t'+str(timers)+'\n')
46 def init_node (self,test_site,node_spec,path):
48 test_node = TestNode(self, test_site, node_spec)
49 test_node.create_node (test_site.locate_user("pi"))
50 test_node.create_node ("tech")
51 test_node.create_boot_cd(path)
54 def locate_site (self,sitename):
55 for site in self.plc_spec['sites']:
56 if site['site_fields']['name'] == sitename:
58 if site['site_fields']['login_base'] == sitename:
60 raise Exception,"Cannot locate site %s"%sitename
62 def locate_key (self,keyname):
63 for key in self.plc_spec['keys']:
64 if key['name'] == keyname:
66 raise Exception,"Cannot locate key %s"%keyname
68 def kill_all_vmwares(self):
69 utils.header('Killing any running vmware or vmplayer instance')
70 os.system('pgrep vmware | xargs -r kill')
71 os.system('pgrep vmplayer | xargs -r kill ')
72 os.system('pgrep vmware | xargs -r kill -9')
73 os.system('pgrep vmplayer | xargs -r kill -9')
76 def uninstall(self,options):
77 os.system('set -x; service plc safestop')
78 #####detecting the last myplc version installed and remove it
79 os.system('set -x; rpm -e myplc')
80 ##### Clean up the /plc directory
81 os.system('set -x; rm -rf /plc/data')
84 def install(self,options):
85 utils.header('Installing from %s'%options.myplc_url)
87 os.system('set -x; rpm -Uvh '+url)
88 os.system('set -x; service plc mount')
91 def configure(self,options):
92 tmpname='/tmp/plc-config-tty-%d'%os.getpid()
93 fileconf=open(tmpname,'w')
94 for var in [ 'PLC_NAME',
98 'PLC_MAIL_SUPPORT_ADDRESS',
105 fileconf.write ('e %s\n%s\n'%(var,self.plc_spec[var]))
106 fileconf.write('w\n')
107 fileconf.write('q\n')
109 os.system('set -x ; cat %s'%tmpname)
110 os.system('set -x ; chroot /plc/root plc-config-tty < %s'%tmpname)
111 os.system('set -x ; service plc start')
112 os.system('set -x; service sendmail stop')
113 os.system('set -x; chroot /plc/root service sendmail restart')
114 os.system('set -x; rm %s'%tmpname)
117 def sites (self,options):
118 return self.do_sites(options)
120 def clean_sites (self,options):
121 return self.do_sites(options,"delete")
123 def do_sites (self,options,action="add"):
124 for site_spec in self.plc_spec['sites']:
125 test_site = TestSite (self,site_spec)
126 if (action == "delete"):
127 utils.header("Deleting site %s in %s"%(test_site.name(),self.name()))
128 test_site.delete_site()
129 # deleted with the site
130 #test_site.delete_users()
133 utils.header("Creating site %s & users in %s"%(test_site.name(),self.name()))
134 test_site.create_site()
135 test_site.create_users()
138 def nodes (self, options):
139 for site_spec in self.plc_spec['sites']:
140 test_site = TestSite (self,site_spec)
141 utils.header("Creating nodes for site %s in %s"%(test_site.name(),self.name()))
142 for node_spec in site_spec['nodes']:
143 utils.header('Creating node %s'%node_spec)
144 pprint.PrettyPrinter(indent=4).pprint(node_spec)
145 test_node = TestNode (self,test_site,node_spec)
146 test_node.create_node ()
149 def bootcd (self, options):
150 for site_spec in self.plc_spec['sites']:
151 test_site = TestSite (self,site_spec)
152 for node_spec in site_spec['nodes']:
153 test_node=TestNode (self,test_site,node_spec)
154 test_node.create_boot_cd(options.path)
157 def initscripts (self, options):
158 for initscript in self.plc_spec['initscripts']:
159 utils.header('Adding Initscript %s in plc %s'%\
160 (initscript['name'],self.plc_spec['name']))
161 pprint.PrettyPrinter(indent=4).pprint(initscript)
162 self.server.AddInitScript(self.auth_root(),initscript['initscript_fields'])
165 def slices (self, options):
166 return self.do_slices()
168 def clean_slices (self, options):
169 return self.do_slices("delete")
171 ### would need a TestSlice class
172 def do_slices (self, add_or_delete="add"):
173 for slice in self.plc_spec['slices']:
174 site_spec = self.locate_site (slice['sitename'])
175 test_site = TestSite(self,site_spec)
176 owner_spec = test_site.locate_user(slice['owner'])
177 auth = TestUser(self,test_site,owner_spec).auth()
178 slice_fields = slice['slice_fields']
179 slice_name = slice_fields['name']
180 if (add_or_delete == "delete"):
181 self.server.DeleteSlice(auth,slice_fields['name'])
182 utils.header("Deleted slice %s"%slice_fields['name'])
184 pprint.PrettyPrinter(indent=4).pprint(slice_fields)
185 self.server.AddSlice(auth,slice_fields)
186 utils.header('Created Slice %s'%slice_fields['name'])
187 for username in slice['usernames']:
188 user_spec=test_site.locate_user(username)
189 test_user=TestUser(self,test_site,user_spec)
190 self.server.AddPersonToSlice(auth, test_user.name(), slice_name)
193 for nodename in slice['nodenames']:
194 node_spec=test_site.locate_node(nodename)
195 test_node=TestNode(self,test_site,node_spec)
196 hostnames += [test_node.name()]
197 utils.header("Adding %r in %s"%(hostnames,slice_name))
198 self.server.AddSliceToNodes(auth, slice_name, hostnames)
199 if slice.has_key('initscriptname'):
200 isname=slice['initscriptname']
201 utils.header("Adding initscript %s in %s"%(isname,slice_name))
202 self.server.AddSliceAttribute(self.auth_root(), slice_name,
206 def start_nodes (self, options):
207 self.kill_all_vmwares()
208 utils.header("Starting vmware nodes")
209 for site_spec in self.plc_spec['sites']:
210 TestSite(self,site_spec).start_nodes (options)
213 def stop_nodes (self, options):
214 self.kill_all_vmwares ()
217 def db_dump(self, options):
218 # uses options.dbname if it is found
222 t=datetime.datetime.now()
225 dump='/data/%s.sql'%name
226 os.system('chroot /plc/root pg_dump -U pgsqluser planetlab4 -f '+ dump)
227 utils.header('Dumped planetlab4 database in %s'%dump)