Better mgt of external slices/users/sites + fixes
[sfa.git] / sfa / planetlab / pldriver.py
index 1d0a59e..5215c57 100644 (file)
@@ -27,7 +27,7 @@ from sfa.planetlab.plshell import PlShell
 import sfa.planetlab.peers as peers
 from sfa.planetlab.plaggregate import PlAggregate
 from sfa.planetlab.plslices import PlSlices
-from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname
+from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname, xrn_to_ext_slicename, top_auth
 
 
 def list_to_dict(recs, key):
@@ -773,12 +773,21 @@ class PlDriver (Driver):
                                    version=rspec.version)
 
     def delete_sliver (self, slice_urn, slice_hrn, creds, options):
-        slicename = hrn_to_pl_slicename(slice_hrn)
+
+        top_auth_hrn = top_auth(slice_hrn)
+        if top_auth_hrn == self.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+        else:
+            slicename = xrn_to_ext_slicename(slice_hrn)
+
         slices = self.shell.GetSlices({'name': slicename})
         if not slices:
             return True
         slice = slices[0]
-    
+        
+        # leases
+        leases = self.shell.GetLeases({'name': slicename})
+        leases_ids = [lease['lease_id'] for lease in leases ]
         # determine if this is a peer slice
         # xxx I wonder if this would not need to use PlSlices.get_peer instead 
         # in which case plc.peers could be deprecated as this here
@@ -788,13 +797,20 @@ class PlDriver (Driver):
             if peer:
                 self.shell.UnBindObjectFromPeer('slice', slice['slice_id'], peer)
             self.shell.DeleteSliceFromNodes(slicename, slice['node_ids'])
+            if len(leases_ids) > 0:
+                self.shell.DeleteLeases(leases_ids)
         finally:
             if peer:
                 self.shell.BindObjectToPeer('slice', slice['slice_id'], peer, slice['peer_slice_id'])
         return True
     
     def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options):
-        slicename = hrn_to_pl_slicename(slice_hrn)
+        top_auth_hrn = top_auth(slice_hrn)
+        if top_auth_hrn == self.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+        else:
+            slicename = xrn_to_ext_slicename(slice_hrn)
+
         slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
         if not slices:
             raise RecordNotFound(slice_hrn)
@@ -809,7 +825,12 @@ class PlDriver (Driver):
 
     # remove the 'enabled' tag 
     def start_slice (self, slice_urn, slice_hrn, creds):
-        slicename = hrn_to_pl_slicename(slice_hrn)
+        top_auth_hrn = top_auth(slice_hrn)
+        if top_auth_hrn == self.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+        else:
+            slicename = xrn_to_ext_slicename(slice_hrn)
+
         slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
         if not slices:
             raise RecordNotFound(slice_hrn)
@@ -822,7 +843,12 @@ class PlDriver (Driver):
 
     # set the 'enabled' tag to 0
     def stop_slice (self, slice_urn, slice_hrn, creds):
-        slicename = hrn_to_pl_slicename(slice_hrn)
+        top_auth_hrn = top_auth(slice_hrn)
+        if top_auth_hrn == self.hrn:
+            slicename = hrn_to_pl_slicename(slice_hrn)
+        else:
+            slicename = xrn_to_ext_slicename(slice_hrn)
+
         slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
         if not slices:
             raise RecordNotFound(slice_hrn)