reorganized
[sfa.git] / sfa / openstack / osaggregate.py
index fb3f17b..12aca55 100644 (file)
@@ -1,15 +1,17 @@
-
+from nova.exception import ImageNotFound
 from sfa.util.faults import SfaAPIError
 from sfa.rspecs.rspec import RSpec
 from sfa.rspecs.elements.hardware_type import HardwareType
 from sfa.rspecs.elements.node import Node
 from sfa.rspecs.elements.sliver import Sliver
 from sfa.rspecs.elements.login import Login
+from sfa.rspecs.elements.disk_image import DiskImage
 from sfa.rspecs.elements.services import Services
 from sfa.util.xrn import Xrn
 from sfa.util.osxrn import OSXrn
 from sfa.rspecs.version_manager import VersionManager
 
+
 class OSAggregate:
 
     def __init__(self, driver):
@@ -45,6 +47,28 @@ class OSAggregate:
                          'tags': []})
         return sliver
 
+    def get_disk_images(self, image_id=None):
+        # get image records
+        if image_id:
+            try:
+                images = [self.driver.shell.image_manager.show(image_id)]
+            except ImageNotFound:
+                images = []
+        else:
+            images = self.driver.shell.image_manager.detail()
+            
+        disk_images = []
+        # create disk image objects 
+        for image in images:
+            if image['container_format'] == 'ami':
+                img = DiskImage()
+                img['name'] = image['name']
+                img['description'] = image['name']
+                img['os'] = image['name']
+                img['version'] = image['name']
+                disk_images.append(img)
+        return disk_images
+
     def get_rspec(self, slice_xrn=None, version=None, options={}):
         version_manager = VersionManager()
         version = version_manager.get_version(version)
@@ -68,7 +92,8 @@ class OSAggregate:
             rspec_node['component_id'] = xrn.urn
             rspec_node['component_name'] = xrn.name
             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()   
-            sliver = self.instance_to_sliver(instance) 
+            sliver = self.instance_to_sliver(instance)
+            sliver['disk_images'] = self.get_disk_images(instance.image_ref) 
             rspec_node['slivers'] = [sliver]
             rspec_nodes.append(rspec_node)
         return rspec_nodes
@@ -81,6 +106,11 @@ class OSAggregate:
         else:
             zones = [zone.name for zone in zones]
 
+        # available sliver/instance/vm types
+        instances = self.driver.shell.db.instance_type_get_all().values()
+        # available images
+        disk_images = self.get_disk_images()
+        
         rspec_nodes = []
         for zone in zones:
             rspec_node = Node()
@@ -91,8 +121,12 @@ class OSAggregate:
             rspec_node['exclusive'] = 'false'
             rspec_node['hardware_types'] = [HardwareType({'name': 'plos-pc'}),
                                                 HardwareType({'name': 'pc'})]
-            instances = self.driver.shell.db.instance_type_get_all().values()
-            slivers = [self.instance_to_sliver(inst) for inst in instances]
+            slivers = []
+            for instance in instances:
+                sliver = self.instance_to_sliver(instance)
+                sliver['disk_images'] = disk_images
+                slivers.append(sliver)
+        
             rspec_node['slivers'] = slivers
             rspec_nodes.append(rspec_node)