Update PlanetLab reservation oriented Rspecs: the leases were expressed an atomic...
authorMohamed Larabi <mohamed.larabi@inria.fr>
Wed, 26 Sep 2012 13:43:02 +0000 (15:43 +0200)
committerMohamed Larabi <mohamed.larabi@inria.fr>
Wed, 26 Sep 2012 13:43:02 +0000 (15:43 +0200)
sfa/planetlab/plaggregate.py
sfa/planetlab/pldriver.py
sfa/planetlab/plslices.py
sfa/rspecs/elements/versions/sfav1Lease.py

index b22a94b..c4f2db8 100644 (file)
@@ -278,7 +278,7 @@ class PlAggregate:
             site_id=lease['site_id']
             site=sites_dict[site_id]
 
-            rspec_lease['lease_id'] = lease['lease_id']
+            #rspec_lease['lease_id'] = lease['lease_id']
             rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
             slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name'])
             slice_urn = hrn_to_urn(slice_hrn, 'slice')
index 49a325d..abfcb92 100644 (file)
@@ -742,20 +742,22 @@ class PlDriver (Driver):
         slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
 
         # add/remove leases
-        requested_leases = []
-        kept_leases = []
-        for lease in rspec.version.get_leases():
-            requested_lease = {}
-            if not lease.get('lease_id'):
-               requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip())
-               requested_lease['start_time'] = lease.get('start_time')
-               requested_lease['duration'] = lease.get('duration')
-            else:
-               kept_leases.append(int(lease['lease_id']))
-            if requested_lease.get('hostname'):
-                requested_leases.append(requested_lease)
-
-        leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer)
+        rspec_requested_leases = rspec.version.get_leases()
+        leases = slices.verify_slice_leases(slice, rspec_requested_leases, peer)
+        #requested_leases = []
+        #kept_leases = []
+        #for lease in rspec.version.get_leases():
+        #    requested_lease = {}
+        #    if not lease.get('lease_id'):
+        #       requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip())
+        #       requested_lease['start_time'] = lease.get('start_time')
+        #       requested_lease['duration'] = lease.get('duration')
+        #    else:
+        #       kept_leases.append(int(lease['lease_id']))
+        #    if requested_lease.get('hostname'):
+        #        requested_leases.append(requested_lease)
+
+        #leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer)
     
         # handle MyPLC peer association.
         # only used by plc and ple.
index be540bb..30e9797 100644 (file)
@@ -8,7 +8,9 @@ from sfa.util.xrn import Xrn, get_leaf, get_authority, urn_to_hrn
 from sfa.rspecs.rspec import RSpec
 
 from sfa.planetlab.vlink import VLink
-from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename
+from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname
+
+import time
 
 MAXINT =  2L**31-1
 
@@ -159,19 +161,51 @@ class PlSlices:
 
         return sfa_peer
 
-    def verify_slice_leases(self, slice, requested_leases, kept_leases, peer):
-        
-        leases = self.driver.shell.GetLeases({'name':slice['name']}, ['lease_id'])
+    def verify_slice_leases(self, slice, rspec_requested_leases, peer):
+
+        leases = self.driver.shell.GetLeases({'name':slice['name'], 'clip':int(time.time())}, ['lease_id','name', 'hostname', 't_from', 't_until'])
         grain = self.driver.shell.GetLeaseGranularity()
-        current_leases = [lease['lease_id'] for lease in leases]
-        deleted_leases = list(set(current_leases).difference(kept_leases))
+
+        requested_leases = []
+        for lease in rspec_requested_leases:
+             requested_lease = {}
+             slice_name = hrn_to_pl_slicename(lease['slice_id'])
+             if slice_name != slice['name']:
+                 continue
+             hostname = xrn_to_hostname(lease['component_id'])
+             # fill the requested node with nitos ids
+             requested_lease['name'] = slice['name']
+             requested_lease['hostname'] = hostname
+             requested_lease['t_from'] = int(lease['start_time'])
+             requested_lease['t_until'] = int(lease['duration']) * grain + int(lease['start_time'])
+             requested_leases.append(requested_lease)
+
+
+
+        # prepare actual slice leases by lease_id  
+        leases_by_id = {}
+        for lease in leases:
+             leases_by_id[lease['lease_id']] = {'name': lease['name'], 'hostname': lease['hostname'], \
+                                                't_from': lease['t_from'], 't_until': lease['t_until']}
+        
+        added_leases = []
+        kept_leases_id = []
+        deleted_leases_id = []
+        for lease_id in leases_by_id:
+             if leases_by_id[lease_id] not in requested_leases:
+                 deleted_leases_id.append(lease_id)
+             else:
+                 kept_leases_id.append(lease_id)
+                 requested_leases.remove(leases_by_id[lease_id])
+        added_leases = requested_leases
+   
 
         try:
             if peer:
                 self.driver.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname'])
-            deleted=self.driver.shell.DeleteLeases(deleted_leases)
-            for lease in requested_leases:
-                added=self.driver.shell.AddLeases(lease['hostname'], slice['name'], int(lease['start_time']), int(lease['duration']) * grain + int(lease['start_time']))
+            self.driver.shell.DeleteLeases(deleted_leases_id)
+            for lease in added_leases:
+                self.driver.shell.AddLeases(lease['hostname'], slice['name'], lease['t_from'], lease['t_until'])
 
         except: 
             logger.log_exc('Failed to add/remove slice leases')
index 8dffdfd..03a4342 100644 (file)
@@ -32,12 +32,43 @@ class SFAv1Lease:
         else:
             network_elem = xml
          
-        lease_elems = []       
-        for lease in leases:
-            lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration']
-            lease_elem = network_elem.add_instance('lease', lease, lease_fields)
+        # group the leases by slice and timeslots
+        grouped_leases = []
+
+        while leases:
+             slice_id = leases[0]['slice_id']
+             start_time = leases[0]['start_time']
+             duration = leases[0]['duration']
+             group = []
+
+             for lease in leases:
+                  if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
+                      group.append(lease)
+
+             grouped_leases.append(group)
+
+             for lease1 in group:
+                  leases.remove(lease1)
+
+        lease_elems = []
+        for lease in grouped_leases:
+            #lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration']
+            lease_fields = ['slice_id', 'start_time', 'duration']
+            lease_elem = network_elem.add_instance('lease', lease[0], lease_fields)
             lease_elems.append(lease_elem)
 
+            # add nodes of this lease
+            for node in lease:
+                 lease_elem.add_instance('node', node, ['component_id'])
+
+
+
+#        lease_elems = []       
+#        for lease in leases:
+#            lease_fields = ['lease_id', 'component_id', 'slice_id', 'start_time', 'duration']
+#            lease_elem = network_elem.add_instance('lease', lease, lease_fields)
+#            lease_elems.append(lease_elem)
+
 
     @staticmethod
     def get_leases(xml, filter={}):
@@ -47,16 +78,34 @@ class SFAv1Lease:
 
     @staticmethod
     def get_lease_objs(lease_elems):
-        leases = []    
+        leases = []
         for lease_elem in lease_elems:
-            lease = Lease(lease_elem.attrib, lease_elem)
-            if lease.get('lease_id'):
-               lease['lease_id'] = lease_elem.attrib['lease_id']
-            lease['component_id'] = lease_elem.attrib['component_id']
-            lease['slice_id'] = lease_elem.attrib['slice_id']
-            lease['start_time'] = lease_elem.attrib['start_time']
-            lease['duration'] = lease_elem.attrib['duration']
-
-            leases.append(lease)
-        return leases            
+            #get nodes
+            node_elems = lease_elem.xpath('./default:node | ./node')
+            for node_elem in node_elems:
+                 lease = Lease(lease_elem.attrib, lease_elem)
+                 lease['slice_id'] = lease_elem.attrib['slice_id']
+                 lease['start_time'] = lease_elem.attrib['start_time']
+                 lease['duration'] = lease_elem.attrib['duration']
+                 lease['component_id'] = node_elem.attrib['component_id']
+                 leases.append(lease)
+
+        return leases
+
+
+
+
+
+#        leases = []    
+#        for lease_elem in lease_elems:
+#            lease = Lease(lease_elem.attrib, lease_elem)
+#            if lease.get('lease_id'):
+#               lease['lease_id'] = lease_elem.attrib['lease_id']
+#            lease['component_id'] = lease_elem.attrib['component_id']
+#            lease['slice_id'] = lease_elem.attrib['slice_id']
+#            lease['start_time'] = lease_elem.attrib['start_time']
+#            lease['duration'] = lease_elem.attrib['duration']
+
+#            leases.append(lease)
+#        return leases