Test framework reworked for
[tests.git] / system / TestPlc.py
1 # $Id$
2 import os
3 import sys
4 import xmlrpclib
5 import datetime
6 import pprint
7 import traceback
8 import utils
9 from TestSite import TestSite
10 from TestNode import TestNode
11 from TestUser import TestUser
12
13 # step methods must take (self, options) and return a boolean
14
15 class TestPlc:
16
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])
22         try:
23             self.vserver=plc_spec['vserver']
24         except:
25             self.vserver=None
26         
27     def name(self):
28         return self.plc_spec['name']
29
30     def connect (self):
31         # tricky : define les methodes de l'API sur cet object
32         pass
33     
34     def auth_root (self):
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']
39                 }
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')
44         fileHandle.close()
45         
46     def init_node (self,test_site,node_spec,path):
47
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)
52         return test_node
53     
54     def locate_site (self,sitename):
55         for site in self.plc_spec['sites']:
56             if site['site_fields']['name'] == sitename:
57                 return site
58             if site['site_fields']['login_base'] == sitename:
59                 return site
60         raise Exception,"Cannot locate site %s"%sitename
61         
62     def locate_key (self,keyname):
63         for key in self.plc_spec['keys']:
64             if key['name'] == keyname:
65                 return key
66         raise Exception,"Cannot locate key %s"%keyname
67         
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')
74         
75     # step methods
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')
82         return True
83         
84     def install(self,options):
85         utils.header('Installing from %s'%options.myplc_url)
86         url=options.myplc_url
87         os.system('set -x; rpm -Uvh '+url)
88         os.system('set -x; service plc mount')
89         return True
90
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',
95                      'PLC_ROOT_PASSWORD',
96                      'PLC_ROOT_USER',
97                      'PLC_MAIL_ENABLED',
98                      'PLC_MAIL_SUPPORT_ADDRESS',
99                      'PLC_DB_HOST',
100                      'PLC_API_HOST',
101                      'PLC_WWW_HOST',
102                      'PLC_BOOT_HOST',
103                      'PLC_NET_DNS1',
104                      'PLC_NET_DNS2']:
105             fileconf.write ('e %s\n%s\n'%(var,self.plc_spec[var]))
106         fileconf.write('w\n')
107         fileconf.write('q\n')
108         fileconf.close()
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)
115         return True
116         
117     def sites (self,options):
118         return self.do_sites(options)
119     
120     def clean_sites (self,options):
121         return self.do_sites(options,"delete")
122     
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()
131                 continue
132             else:
133                 utils.header("Creating site %s & users in %s"%(test_site.name(),self.name()))
134                 test_site.create_site()
135                 test_site.create_users()
136         return True
137
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 ()
147         return True
148
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)
155         return True
156             
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'])
163         return True
164
165     def slices (self, options):
166         return self.do_slices()
167
168     def clean_slices (self, options):
169         return self.do_slices("delete")
170
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'])
183                 continue
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)
191
192             hostnames=[]
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,
203                                               'initscript',isname)
204         return True
205         
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)
211         return True
212
213     def stop_nodes (self, options):
214         self.kill_all_vmwares ()
215         return True
216
217     def db_dump(self, options):
218         # uses options.dbname if it is found
219         try:
220             name=options.dbname
221         except:
222             t=datetime.datetime.now()
223             d=t.date()
224             name=str(d)
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)
228         return True
229