*Create new TestSlice class.
authorTony Mack <tmack@cs.princeton.edu>
Wed, 30 Jan 2008 13:42:38 +0000 (13:42 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Wed, 30 Jan 2008 13:42:38 +0000 (13:42 +0000)
*Now we manage slices in both  TestPlc and TestSlice classes.
*Clean TestSite class nothing to deal with slices.

system/TestPlc.py
system/TestSite.py
system/TestSlice.py [new file with mode: 0644]

index 8244d4c..2ac008f 100644 (file)
@@ -13,6 +13,7 @@ from TestSite import TestSite
 from TestNode import TestNode
 from TestUser import TestUser
 from TestKey import TestKey
+from TestSlice import TestSlice
 
 # step methods must take (self, options) and return a boolean
 
@@ -340,7 +341,7 @@ class TestPlc:
                 test_node=TestNode (self,test_site,node_spec)
                 test_node.create_boot_cd(options.path)
         return True
-            
+                
     def initscripts (self, options):
         for initscript in self.plc_spec['initscripts']:
             utils.show_spec('Adding Initscript in plc %s'%self.plc_spec['name'],initscript)
@@ -353,41 +354,28 @@ class TestPlc:
     def clean_slices (self, options):
         return self.do_slices("delete")
 
-    ### would need a TestSlice class
-    def do_slices (self, add_or_delete="add"):
+    def do_slices (self,  action="add"):
         for slice in self.plc_spec['slices']:
             site_spec = self.locate_site (slice['sitename'])
             test_site = TestSite(self,site_spec)
-            owner_spec = test_site.locate_user(slice['owner'])
-            auth = TestUser(self,test_site,owner_spec).auth()
-            slice_fields = slice['slice_fields']
-            slice_name = slice_fields['name']
-            if (add_or_delete == "delete"):
-                self.server.DeleteSlice(auth,slice_fields['name'])
-                utils.header("Deleted slice %s"%slice_fields['name'])
-                continue
-            utils.show_spec("Creating slice",slice_fields)
-            self.server.AddSlice(auth,slice_fields)
-            utils.header('Created Slice %s'%slice_fields['name'])
-            for username in slice['usernames']:
-                user_spec=test_site.locate_user(username)
-                test_user=TestUser(self,test_site,user_spec)
-                self.server.AddPersonToSlice(auth, test_user.name(), slice_name)
-
-            hostnames=[]
-            for nodename in slice['nodenames']:
-                node_spec=test_site.locate_node(nodename)
-                test_node=TestNode(self,test_site,node_spec)
-                hostnames += [test_node.name()]
-            utils.header("Adding %r in %s"%(hostnames,slice_name))
-            self.server.AddSliceToNodes(auth, slice_name, hostnames)
-            if slice.has_key('initscriptname'):
-                isname=slice['initscriptname']
-                utils.header("Adding initscript %s in %s"%(isname,slice_name))
-                self.server.AddSliceAttribute(self.auth_root(), slice_name,
-                                              'initscript',isname)
+            test_slice=TestSlice(self,test_site,slice)
+            if action != "add":
+                utils.header("Deleting slices in site %s"%test_site.name())
+                test_slice.delete_slice()
+            else:    
+                utils.show_spec("Creating slice",slice)
+                test_slice.create_slice()
+                utils.header('Created Slice %s'%slice['slice_fields']['name'])
         return True
         
+    def check_slices(self, options):
+        for slice_spec in self.plc_spec['slices']:
+            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
+    
     def start_nodes (self, options):
         self.kill_all_vmwares()
         self.kill_all_qemus()
index f52a28e..a167ebf 100644 (file)
@@ -59,73 +59,4 @@ class TestSite:
             TestNode(self.test_plc, self, node_spec).start_node(options)
         return True
            
-    def delete_known_hosts(self):
-        utils.header("Messing with known_hosts (cleaning hostnames starting with 'test[0-9]')")
-        sed_command="sed -i -e '/^test[0-9]/d' /root/.ssh/known_hosts"
-        utils.system(sed_command)
-
-    # xxx should be attached to TestPlc
-    def check_slices(self):
-        
-        bool=True
-        bool1=True
-        secondes=15
-        self.delete_known_hosts()
-        start_time = datetime.datetime.now()
-        dead_time=start_time + datetime.timedelta(minutes=3)##adding 3minutes
-        for slice_spec in self.test_plc.plc_spec['slices']:
-            for hostname in slice_spec['nodenames']:
-                slicename=slice_spec['slice_fields']['name']
-                # locate the first avail. key
-                found=False
-                for username in slice_spec['usernames']:
-                    user_spec=self.locate_user(username)
-                    for keyname in user_spec['keynames']:
-                        key_spec=self.test_plc.locate_key(keyname)
-                        publickey=TestKey(self.test_plc,key_spec).publicpath()
-                        privatekey=TestKey(self.test_plc,key_spec).privatepath()
-                        if os.path.isfile(publickey) and os.path.isfile(privatekey):
-                            found=True
-                            break
-                if not found:
-                    raise Exception,"Cannot find a valid key for slice %s"%slicename
-
-                while(bool):
-                    utils.header('restarting nm on %s'%hostname)
-                    access=utils.system('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%hostname )
-                    if (access==0):
-                        utils.header('nm restarted on %s'%hostname)
-                        while(bool1):
-                            utils.header('trying to connect to %s@%s'%(slicename,hostname))
-                            ### should use saved keys instead of this hard-coded stuff
-                            Date=utils.system('ssh -i %s %s@%s date'%(privatekey,slicename,hostname))
-                            if (Date==0):
-                                break
-                            elif ( start_time  <= dead_time ) :
-                                start_time=datetime.datetime.now()+ datetime.timedelta(seconds=30)
-                                time.sleep(secondes)
-                            else:
-                                bool1=False
-                        if(bool1):
-                            utils.header('connected to %s@%s -->'%(slicename,hostname))
-                        else:
-                            utils.header('%s@%s : last chance - restarting nm on %s'%(slicename,hostname,hostname))
-                            access=utils.system('ssh -i /etc/planetlab/root_ssh_key.rsa  root@%s service nm restart'%hostname)
-                            if (access==0):
-                                utils.header('trying to connect (2) to %s@%s'%(slicename,hostname))
-                                Date=utils.system('ssh -i ~/.ssh/slices.rsa %s@%s date'%(slicename,hostname))
-                                if (Date==0):
-                                    utils.header('connected to %s@%s -->'%(slicename,hostname))
-                                else:
-                                    utils.header('giving up with to %s@%s -->'%(slicename,hostname))
-                                    return False
-                            else :
-                                utils.header('Last chance failed on %s@%s -->'%(slicename,hostname))
-                        break
-                    elif ( start_time  <= dead_time ) :
-                        start_time=datetime.datetime.now()+ datetime.timedelta(minutes=1)
-                        time.sleep(secondes)
-                    else:
-                        bool=False
-                            
-        return bool
+    
diff --git a/system/TestSlice.py b/system/TestSlice.py
new file mode 100644 (file)
index 0000000..f8eaed8
--- /dev/null
@@ -0,0 +1,121 @@
+import utils
+import os, os.path
+import datetime
+import time
+
+from TestKey import TestKey
+from TestUser import TestUser
+from TestNode import TestNode
+
+class TestSlice:
+
+    def __init__ (self,test_plc,test_site,slice_spec):
+       self.test_plc=test_plc
+        self.test_site=test_site
+       self.slice_spec=slice_spec
+
+    def delete_slice(self):
+        owner_spec = self.test_site.locate_user(self.slice_spec['owner'])
+        auth = TestUser(self,self.test_site,owner_spec).auth()
+        slice_fields = self.slice_spec['slice_fields']
+        slice_name = slice_fields['name']
+        self.test_plc.server.DeleteSlice(auth,slice_fields['name'])
+        utils.header("Deleted slice %s"%slice_fields['name'])
+
+    
+    def create_slice(self):
+        owner_spec = self.test_site.locate_user(self.slice_spec['owner'])
+        auth = TestUser(self,self.test_site,owner_spec).auth()
+        slice_fields = self.slice_spec['slice_fields']
+        slice_name = slice_fields['name']
+
+        self.test_plc.server.AddSlice(auth,slice_fields)
+        for username in self.slice_spec['usernames']:
+                user_spec=self.test_site.locate_user(username)
+                test_user=TestUser(self,self.test_site,user_spec)
+                self.test_plc.server.AddPersonToSlice(auth, test_user.name(), slice_name)
+
+        hostnames=[]
+        for nodename in self.slice_spec['nodenames']:
+            node_spec=self.test_site.locate_node(nodename)
+            test_node=TestNode(self,self.test_site,node_spec)
+            hostnames += [test_node.name()]
+        utils.header("Adding %r in %s"%(hostnames,slice_name))
+        self.test_plc.server.AddSliceToNodes(auth, slice_name, hostnames)
+        if self.slice_spec.has_key('initscriptname'):
+            isname=self.slice_spec['initscriptname']
+            utils.header("Adding initscript %s in %s"%(isname,slice_name))
+            self.test_plc.server.AddSliceAttribute(self.test_plc.auth_root(), slice_name,'initscript',isname)
+            
+        
+    def delete_known_hosts(self):
+        utils.header("Messing with known_hosts (cleaning hostnames starting with 'test[0-9]')")
+        sed_command="sed -i -e '/^test[0-9]/d' /root/.ssh/known_hosts"
+        utils.system(sed_command)
+        
+    ###the logic is quit wrong, must be rewritten
+    def do_check_slices(self):
+        utils.header("wainting for the node to fully boot")
+        time.sleep(120)
+        bool=bool1=True
+        secondes=15
+        self.delete_known_hosts()
+        start_time = datetime.datetime.now()
+        dead_time=start_time + datetime.timedelta(minutes=5)##adding 3minutes
+        for slice_spec in self.test_plc.plc_spec['slices']:
+            for hostname in slice_spec['nodenames']:
+                slicename=slice_spec['slice_fields']['name']
+                # locate the first avail. key
+                found=False
+                for username in slice_spec['usernames']:
+                    user_spec=self.test_site.locate_user(username)
+                    for keyname in user_spec['keynames']:
+                        key_spec=self.test_plc.locate_key(keyname)
+                        publickey=TestKey(self.test_plc,key_spec).publicpath()
+                        privatekey=TestKey(self.test_plc,key_spec).privatepath()
+                        if os.path.isfile(publickey) and os.path.isfile(privatekey):
+                            found=True
+                            break
+                if not found:
+                    raise Exception,"Cannot find a valid key for slice %s"%slicename
+    
+                while(bool):
+                    utils.header('restarting nm on %s'%hostname)
+                    access=utils.system('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%hostname )
+                    if (access==0):
+                        utils.header('nm restarted on %s'%hostname)
+                        while(bool1):
+                            utils.header('trying to connect to %s@%s'%(slicename,hostname))
+                            Date=utils.system('ssh -i %s %s@%s date'%(privatekey,slicename,hostname))
+                            if (Date==0):
+                                break
+                            elif ( start_time  <= dead_time ) :
+                                start_time=datetime.datetime.now()+ datetime.timedelta(seconds=30)
+                                time.sleep(secondes)
+                            else:
+                                bool1=False
+                        if(bool1):
+                            utils.header('connected to %s@%s -->'%(slicename,hostname))
+                        else:
+                            utils.header('%s@%s : last chance - restarting nm on %s'%(slicename,hostname,hostname))
+                            access=utils.system('ssh -i /etc/planetlab/root_ssh_key.rsa  root@%s service nm restart'%hostname)
+                            time.sleep(120)##temoprally adding some delay due to the network slowness 
+                            if (access==0):
+                                utils.header('trying to connect (2) to %s@%s'%(slicename,hostname))
+                                Date=utils.system('ssh -i %s %s@%s date'%(privatekey,slicename,hostname))
+                                if (Date==0):
+                                    utils.header('connected to %s@%s -->'%(slicename,hostname))
+                                else:
+                                    utils.header('giving up with to %s@%s -->'%(slicename,hostname))
+                                    return False
+                            else :
+                                utils.header('Last chance failed on %s@%s -->'%(slicename,hostname))
+                        break
+                    elif ( start_time  <= dead_time ) :
+                        start_time=datetime.datetime.now()+ datetime.timedelta(minutes=1)
+                        time.sleep(secondes)
+                    else:
+                        bool=False
+                            
+        return bool
+