allow allocate to receive an empty rspec, which is the only way a user can release...
Thierry Parmentelat [Wed, 20 Aug 2014 11:00:58 +0000 (13:00 +0200)]
sfa/methods/Allocate.py
sfa/planetlab/pldriver.py

index a7dc8f9..e386b30 100644 (file)
@@ -47,10 +47,11 @@ class Allocate(Method):
         
         self.api.logger.debug("Allocate, received expiration from credential: %s"%expiration)
 
-        # make sure request is not empty
-        slivers = RSpec(rspec).version.get_nodes_with_slivers()
-        if not slivers:
-            raise InvalidRSpec("Missing <sliver_type> or <sliver> element. Request rspec must explicitly allocate slivers")    
+# turned off, as passing an empty rspec is indeed useful for cleaning up the slice
+#        # make sure request is not empty
+#        slivers = RSpec(rspec).version.get_nodes_with_slivers()
+#        if not slivers:
+#            raise InvalidRSpec("Missing <sliver_type> or <sliver> element. Request rspec must explicitly allocate slivers")    
 
         # flter rspec through sfatables
         if self.api.interface in ['aggregate']:
@@ -61,9 +62,10 @@ class Allocate(Method):
         actual_caller_hrn = the_credential.actual_caller_hrn()
         self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, actual_caller_hrn, xrn.get_hrn(), self.name)) 
         rspec = run_sfatables(chain_name, xrn.get_hrn(), actual_caller_hrn, rspec)
-        slivers = RSpec(rspec).version.get_nodes_with_slivers()
-        if not slivers:
-            raise SfatablesRejected(slice_xrn)
+# turned off, as passing an empty rspec is indeed useful for cleaning up the slice
+#        slivers = RSpec(rspec).version.get_nodes_with_slivers()
+#        if not slivers:
+#            raise SfatablesRejected(slice_xrn)
 
         # pass this to the driver code in case they need it
         options['actual_caller_hrn'] = actual_caller_hrn
index 53f1256..88c41fe 100644 (file)
@@ -692,17 +692,19 @@ class PlDriver (Driver):
         slivers = aggregate.get_slivers(urns)
         if not slivers:
             sliver_id_parts = Xrn(urns[0]).get_sliver_id_parts()
-            filter = {}
-            try:
-                filter['slice_id'] = int(sliver_id_parts[0])
-            except ValueError:
-                filter['name'] = sliver_id_parts[0]
-            slices = self.shell.GetSlices(filter,['hrn'])
-            if not slices:
-                raise Forbidden("Unable to locate slice record for sliver:  %s" % xrn)
-            slice = slices[0]
-            slice_urn = hrn_to_urn(slice['hrn'], type='slice')
-            urns = [slice_urn]          
+            # allow to be called with an empty rspec, meaning flush reservations
+            if sliver_id_parts:
+                filter = {}
+                try:
+                    filter['slice_id'] = int(sliver_id_parts[0])
+                except ValueError:
+                    filter['name'] = sliver_id_parts[0]
+                slices = self.shell.GetSlices(filter,['hrn'])
+                if not slices:
+                    raise Forbidden("Unable to locate slice record for sliver:  %s" % xrn)
+                slice = slices[0]
+                slice_urn = hrn_to_urn(slice['hrn'], type='slice')
+                urns = [slice_urn]          
         else:    
             slice_id = slivers[0]['slice_id']
             slice_hrn = self.shell.GetSliceHrn(slice_id)