Test framework reworked for
[tests.git] / system / TestSite.py
1 import os
2 import sys
3 import datetime
4 import time
5 import xmlrpclib
6 import traceback
7
8 import utils
9 from TestNode import TestNode
10 from TestUser import TestUser
11
12 class TestSite:
13
14     def __init__ (self,test_plc,site_spec):
15         self.test_plc=test_plc
16         self.site_spec=site_spec
17         
18     def name(self):
19         return self.site_spec['site_fields']['login_base']
20
21     def create_site (self):
22         print self.test_plc.auth_root()
23         self.site_id = self.test_plc.server.AddSite(self.test_plc.auth_root(),
24                                                     self.site_spec['site_fields'])
25         self.test_plc.server.AddSiteAddress(self.test_plc.auth_root(),self.site_id,
26                                             self.site_spec['address_fields'])
27             
28         return self.site_id
29             
30     def create_users (self):
31         for user_spec in self.site_spec['users']:
32             test_user=TestUser(self.test_plc,self,user_spec)
33             test_user.create_user()
34             test_user.add_keys()            
35         
36
37     def delete_site (self):
38         print self.test_plc.auth_root()
39         self.test_plc.server.DeleteSite(self.test_plc.auth_root(),self.name())
40         return True
41             
42     def delete_users(self):
43         for user_spec in self.site_spec['users']:
44             test_user=TestUser(self.test_plc,self,user_spec)
45             test_user.delete_user()
46
47     def locate_user (self,username):
48         for user in self.site_spec['users']:
49             if user['name'] == username:
50                 return user
51             if user['user_fields']['email'] == username:
52                 return user
53         raise Exception,"Cannot locate user %s"%username
54         
55     def locate_node (self,nodename):
56         for node in self.site_spec['nodes']:
57             if node['node_fields']['hostname'] == nodename:
58                 return node
59         raise Exception,"Cannot locate node %s"%nodename
60         
61     # left as-is, i.e. crappy
62     def check_nodes(self):
63         # should filter out nodes not under vmware not qemu
64         node_specs=self.site_spec['nodes']
65         bool=True
66         try:
67             ret_value=True    
68             filter=['boot_state']
69             bt={'boot_state':'boot'}
70             dbg={'boot_state':'dbg'}
71             secondes=15
72             start_time = datetime.datetime.now() ##geting the current time
73             dead_time=datetime.datetime.now()+ datetime.timedelta(minutes=5)
74             utils.header("Starting checking for nodes in site %s"%self.name())
75             
76             for node_spec in node_specs :
77                 hostname=node_spec['node_fields']['hostname']
78                 while (bool):
79                     node_status=self.test_plc.server.GetNodes(self.test_plc.auth_root(),hostname, filter)
80                     utils.header('Actual status for node %s is [%s]'%(hostname,node_status))
81                     try:
82                         if (node_status[0] == bt):
83                             test_name='Test Installation Node hosted: '+hostname
84                             self.test_plc.display_results(test_name, 'Successful', '')
85                             break ##for existing and renaming virtual file to just installed
86                         elif (node_status[0] ==dbg):
87                             test_name='Test Installation Node hosted: '+hostname
88                             self.test_plc.display_results(test_name, 'En Debug', '')
89                             bool=False
90                             break ##for existing and renaming virtual file to just installed
91                         elif ( start_time  <= dead_time ) :
92                             start_time=datetime.datetime.now()+ datetime.timedelta(minutes=2)
93                             time.sleep(secondes)
94                         else: bool=False
95                     except OSError ,e :
96                         bool=False
97                         str(e)
98                 if (bool):
99                     utils.header("Node %s correctly installed and booted"%hostname)
100                 else :
101                     utils.header("Node %s not fully booted"%hostname)
102                     ret_value=False
103                     test_name='Test Installation Node Hosted: ',hostname
104                     self.test_plc.display_results(test_name, 'Failure', '')
105             
106             utils.header("End checking for nodes in site %s"%self.name())
107             return ret_value
108         except Exception, e:
109             traceback.print_exc()
110             utils.header("will kill vmware in 10 seconds")
111             time.sleep(5)
112             self.tst_plc.kill_all_vmwares()
113             raise 
114             
115     def start_nodes (self,options):
116         for node_spec in self.site_spec['nodes']:
117             TestNode(self.test_plc, self, node_spec).start_node(options)
118         return True
119            
120     def delete_known_hosts(self):
121         utils.header("Messing with known_hosts (cleaning hostnames starting with 'test[0-9]')")
122         sed_command="sed -i -e '/^test[0-9]/d' /root/.ssh/known_hosts"
123         os.system("set -x ; " + sed_command)
124
125     # xxx should be attached to TestPlc
126     def check_slices(self):
127         
128         bool=True
129         bool1=True
130         secondes=15
131         self.delete_known_hosts()
132         start_time = datetime.datetime.now()
133         dead_time=start_time + datetime.timedelta(minutes=3)##adding 3minutes
134         for slice_spec in self.test_plc.plc_spec['slices']:
135             for hostname in slice_spec['nodenames']:
136                 slicename=slice_spec['slice_fields']['name']
137                 while(bool):
138                     utils.header('restarting nm on %s'%hostname)
139                     access=os.system('set -x; ssh -i /etc/planetlab/root_ssh_key.rsa  root@%s service nm restart'%hostname )
140                     if (access==0):
141                         utils.header('nm restarted on %s'%hostname)
142                         while(bool1):
143                             utils.header('trying to connect to %s@%s'%(slicename,hostname))
144                             Date=os.system('set -x; ssh -i ~/.ssh/slices.rsa %s@%s date'%(slicename,hostname))
145                             if (Date==0):
146                                 break
147                             elif ( start_time  <= dead_time ) :
148                                 start_time=datetime.datetime.now()+ datetime.timedelta(seconds=30)
149                                 time.sleep(secondes)
150                             else:
151                                 bool1=False
152                         if(bool1):
153                             utils.header('connected to %s@%s -->'%(slicename,hostname))
154                         else:
155                             utils.header('%s@%s : last chance - restarting nm on %s'%(slicename,hostname,hostname))
156                             access=os.system('set -x; ssh -i /etc/planetlab/root_ssh_key.rsa  root@%s service nm restart'%hostname)
157                             if (access==0):
158                                 utils.header('trying to connect (2) to %s@%s'%(slicename,hostname))
159                                 Date=os.system('set -x; ssh -i ~/.ssh/slices.rsa %s@%s date'%(slicename,hostname))
160                                 if (Date==0):
161                                     utils.header('connected to %s@%s -->'%(slicename,hostname))
162                                 else:
163                                     utils.header('giving up with to %s@%s -->'%(slicename,hostname))
164                                     sys.exit(1)
165                             else :
166                                 utils.header('Last chance failed on %s@%s -->'%(slicename,hostname))
167                         break
168                     elif ( start_time  <= dead_time ) :
169                         start_time=datetime.datetime.now()+ datetime.timedelta(minutes=1)
170                         time.sleep(secondes)
171                     else:
172                         bool=False
173                             
174         return bool