fix allocation states
[sfa.git] / sfa / planetlab / plaggregate.py
index 5bf0950..17abcb0 100644 (file)
@@ -3,7 +3,7 @@ from collections import defaultdict
 from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn
 from sfa.util.sfatime import utcparse, datetime_to_string
 from sfa.util.sfalogging import logger
-
+from sfa.util.faults import SliverDoesNotExist
 from sfa.rspecs.rspec import RSpec
 from sfa.rspecs.elements.hardware_type import HardwareType
 from sfa.rspecs.elements.node import Node
@@ -129,8 +129,10 @@ class PlAggregate:
         if names:
             filter['name'] = list(names)
         if slice_ids:
-            filter['slice_id'] = list(slice_ids) 
+            filter['slice_id'] = list(slice_ids)
         slices = self.driver.shell.GetSlices(filter)
+        if not slices:
+            return []
         slice = slices[0]
         if node_ids:
             slice['node_ids'] = node_ids
@@ -236,7 +238,7 @@ class PlAggregate:
             nodes_dict[node['node_id']] = node
         return nodes_dict
 
-    def rspec_node_to_geni_sliver(self, rspec_node):
+    def rspec_node_to_geni_sliver(self, rspec_node, allocation_status=None):
         op_status = "geni_unknown"
         state = rspec_node['boot_state'].lower()
         if state == 'boot':
@@ -244,10 +246,13 @@ class PlAggregate:
         else:
             op_status =' geni_failed'
 
+        if not allocation_status:
+            allocation_status = 'provisioned'
+
         # required fields
         geni_sliver = {'geni_sliver_urn': rspec_node['sliver_id'],
                        'geni_expires': rspec_node['expires'],
-                       'geni_allocation_status': 'geni_provisioned',
+                       'geni_allocation_status': allocation_status,
                        'geni_operational_status': op_status,
                        'geni_error': None,
                        }
@@ -326,7 +331,7 @@ class PlAggregate:
             rspec.version.add_links(links)
         return rspec.toxml()
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options={}, allocation_status=None):
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
@@ -336,7 +341,7 @@ class PlAggregate:
         geni_slivers = []
         slivers = self.get_slivers(urns, options) 
         if len(slivers) == 0:
-            raise SliverDoesNotExist("You have not allocated any slivers here")
+            raise SliverDoesNotExist("You have not allocated any slivers here for %s" % str(urns))
         rspec.xml.set('expires',  datetime_to_string(utcparse(slivers[0]['expires'])))
       
         if not options.get('list_leases') or options['list_leases'] != 'leases':
@@ -359,7 +364,7 @@ class PlAggregate:
                 if sliver['slice_ids_whitelist'] and sliver['slice_id'] not in sliver['slice_ids_whitelist']:
                     continue
                 rspec_node = self.sliver_to_rspec_node(sliver, sites, interfaces, node_tags, pl_initscripts)
-                geni_sliver = self.rspec_node_to_geni_sliver(rspec_node)
+                geni_sliver = self.rspec_node_to_geni_sliver(rspec_node, allocation_status=allocation_status)
                 rspec_nodes.append(rspec_node) 
                 geni_slivers.append(geni_sliver)
             rspec.version.add_nodes(rspec_nodes)