pagkage /etc/sfa/api_versions.xml
[sfa.git] / sfa / openstack / osaggregate.py
index 8a16304..332976f 100644 (file)
@@ -57,7 +57,6 @@ class OSAggregate:
             zones = [zone.name for zone in zones]
         return zones
 
-
     def list_resources(self, version=None, options={}):
         version_manager = VersionManager()
         version = version_manager.get_version(version)
@@ -72,17 +71,25 @@ class OSAggregate:
         tenant_name = OSXrn(xrn=urns[0], type='slice').get_tenant_name()
         self.driver.shell.nova_manager.connect(tenant=tenant_name)
         instances = self.get_instances(urns)
-        if len(instances) == 0:
-            raise SliverDoesNotExist("You have not allocated any slivers here")
+        # lookup the sliver allocations
+        sliver_ids = [sliver['sliver_id'] for sliver in slivers]
+        constraint = SliverAllocation.sliver_id.in_(sliver_ids)
+        sliver_allocations = dbsession.query(SliverAllocation).filter(constraint)
+        sliver_allocation_dict = {}
+        for sliver_allocation in sliver_allocations:
+            sliver_allocation_dict[sliver_allocation.sliver_id] = sliver_allocation
+
         geni_slivers = []
         rspec_nodes = []
         for instance in instances:
             rspec_nodes.append(self.instance_to_rspec_node(instance))
-            geni_slivers.append(self.instance_to_geni_sliver(instance))
+            geni_sliver = self.instance_to_geni_sliver(instance, sliver_sllocation_dict)
+            geni_slivers.append(geni_sliver)
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
         rspec = RSpec(version=rspec_version, user_options=options)
+        rspec.xml.set('expires',  datetime_to_string(utcparse(time.time())))
         rspec.version.add_nodes(rspec_nodes)
         result = {'geni_urn': Xrn(urns[0]).get_urn(),
                   'geni_rspec': rspec.toxml(), 
@@ -96,19 +103,20 @@ class OSAggregate:
         ids = set()
         for urn in urns:
             xrn = OSXrn(xrn=urn)
-            names.add(xrn.get_slice_name())
-            if xrn.id:
-                ids.add(xrn.id)
+            if xrn.type == 'slice':
+                names.add(xrn.get_slice_name())
+            elif xrn.type == 'sliver':
+                ids.add(xrn.leaf)
 
         # look up instances
         instances = []
-        for name in name:
-            servers = self.driver.shell.nova_manager.servers.findall(name=name)
-            instances.extend(servers)
-
-        # filter on id
+        filter = {}
+        if names:
+            filter['name'] = names
         if ids:
-            instances = [server for server in servers if server.id in ids]
+            filter['id'] = ids   
+        servers = self.driver.shell.nova_manager.servers.findall(**filter)
+        instances.extend(servers)
 
         return instances
 
@@ -191,9 +199,10 @@ class OSAggregate:
 
     def instance_to_sliver(self, instance, xrn=None):
         if xrn:
-            xrn = Xrn(xrn=slice_xrn, type='slice', id=instance.id).get_urn()
+            sliver_hrn = '%s.%s' % (self.driver.hrn, instance.id)
+            sliver_id = Xrn(sliver_hrn, type='sliver').urn
 
-        sliver = Sliver({'sliver_id': xrn.get_urn(),
+        sliver = Sliver({'sliver_id': sliver_id,
                          'name': instance.name,
                          'type': instance.name,
                          'cpus': str(instance.vcpus),
@@ -201,22 +210,32 @@ class OSAggregate:
                          'storage':  str(instance.disk)})
         return sliver   
 
-    def instance_to_geni_sliver(self, instance):
-        op_status = "geni_unknown"
-        state = instance.state.lower()
-        if state == 'active':
-            op_status = 'geni_ready'
-        elif state == 'building': 
-            op_status = 'geni_configuring'
-        elif state == 'failed':
-            op_status =' geni_failed'
-        
-        sliver_hrn = '%s.%s' % (root_hrn, instance.id)
-        sliver_id = Xrn(sliver_hrn, type='sliver').urn 
+    def instance_to_geni_sliver(self, instance, sliver_allocations = {}):
+        sliver_hrn = '%s.%s' % (self.driver.hrn, instance.id)
+        sliver_id = Xrn(sliver_hrn, type='sliver').urn
+        # set sliver allocation and operational status
+        sliver_allocation = sliver_allocations[sliver_id]
+        if sliver_allocation:
+            allocation_status = sliver_allocation.allocation_state
+            if allocation_status == 'geni_allocated':
+                op_status =  'geni_pending_allocation'
+            elif allocation_status == 'geni_provisioned':
+                state = instance.state.lower()
+                if state == 'active':
+                    op_status = 'geni_ready'
+                elif state == 'building':
+                    op_status = 'geni_notready'
+                elif state == 'failed':
+                    op_status =' geni_failed'
+                else:
+                    op_status = 'geni_unknown'
+            else:
+                allocation_status = 'geni_unallocated'    
         # required fields
         geni_sliver = {'geni_sliver_urn': sliver_id, 
                        'geni_expires': None,
-                       'geni_allocation_status': 'geni_provisioned',
+                       'geni_allocation_status': allocation_status,
                        'geni_operational_status': op_status,
                        'geni_error': None,
                        'plos_created_at': datetime_to_string(utcparse(instance.created)),
@@ -250,7 +269,7 @@ class OSAggregate:
                 sliver = self.instance_to_sliver(instance)
                 sliver['disk_image'] = disk_images
                 slivers.append(sliver)
-        
+            rspec_node['available'] = 'true'
             rspec_node['slivers'] = slivers
             rspec_nodes.append(rspec_node) 
 
@@ -335,6 +354,7 @@ class OSAggregate:
         rspec = RSpec(rspec)
         requested_instances = defaultdict(list)
         # iterate over clouds/zones/nodes
+        slivers = []
         for node in rspec.version.get_nodes_with_slivers():
             instances = node.get('slivers', [])
             if not instances:
@@ -354,39 +374,41 @@ class OSAggregate:
                         metadata['component_id'] = node['component_id']
                     if node.get('client_id'):
                         metadata['client_id'] = node['client_id'] 
-                    self.driver.shell.nova_manager.servers.create(flavor=flavor_id,
+                    server = self.driver.shell.nova_manager.servers.create(
+                                                            flavor=flavor_id,
                                                             image=image_id,
                                                             key_name = key_name,
                                                             security_groups = [group_name],
                                                             files=files,
                                                             meta=metadata, 
                                                             name=instance_name)
+                    slivers.append(server)
                 except Exception, err:    
                     logger.log_exc(err)                                
                            
+        return slivers        
 
-
-    def delete_instance(self, tenant_name, instance_name, id=None):
+    def delete_instance(self, instance):
     
-        def _delete_security_group(instance):
-            security_group = instance.metadata.get('security_groups', '')
+        def _delete_security_group(inst):
+            security_group = inst.metadata.get('security_groups', '')
             if security_group:
                 manager = SecurityGroup(self.driver)
                 timeout = 10.0 # wait a maximum of 10 seconds before forcing the security group delete
                 start_time = time.time()
                 instance_deleted = False
                 while instance_deleted == False and (time.time() - start_time) < timeout:
-                    inst = self.driver.shell.nova_manager.servers.findall(id=instance.id)
-                    if not inst:
+                    tmp_inst = self.driver.shell.nova_manager.servers.findall(id=inst.id)
+                    if not tmp_inst:
                         instance_deleted = True
                     time.sleep(.5)
                 manager.delete_security_group(security_group)
 
-        thread_manager = ThreadManager() 
-        self.driver.shell.nova_manager.connect(tenant=tenant_name)
-        args = {'name': instance_name}
-        if id:
-            args['id'] = id
+        thread_manager = ThreadManager()
+        tenant = self.driver.shell.auth_manager.tenants.find(id=instance.tenant_id)  
+        self.driver.shell.nova_manager.connect(tenant=tenant.name)
+        args = {'name': instance.name,
+                'id': instance.id}
         instances = self.driver.shell.nova_manager.servers.findall(**args)
         security_group_manager = SecurityGroup(self.driver)
         for instance in instances: