initial checkin
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 1 Feb 2012 02:15:57 +0000 (21:15 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Wed, 1 Feb 2012 02:15:57 +0000 (21:15 -0500)
sfa/openstack/osaggregate.py [new file with mode: 0644]

diff --git a/sfa/openstack/osaggregate.py b/sfa/openstack/osaggregate.py
new file mode 100644 (file)
index 0000000..521cbb8
--- /dev/null
@@ -0,0 +1,88 @@
+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.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):
+        self.driver = driver
+
+    def instance_to_sliver(instance, slice_xrn=None):
+        sliver_id = None
+        if slice_xrn:
+            xrn = OSXrn(slice_xrn, 'slice')
+            sliver_id = xrn.sliver_id(instance.instance_id, "")
+
+        # should include: 
+        # * instance.image_ref
+        # * instance.kernel_id
+        # * instance.ramdisk_id 
+        name=None
+        if hasattr(instance, 'name'):
+            name = instance.name
+        elif hasattr(instance, 'display_name'):
+            name = instance.display_name 
+        sliver = Sliver({'slice_id': sliver_id,
+                         'name': xrn.name,
+                         'type': 'plos-' + instance.name,
+                         'tags': []})
+        return sliver
+
+    def get_rspec(self, slice_xrn=None, vsersion=None, options={}):
+        version_manager = VersionManager()
+        version = version_manager.get_version(version)
+        if not slice_xrn:
+            rspec_version = version_manager._get_version(version.type, version.version, 'ad')
+            nodes = self.get_aggregate_nodes()
+        else:
+            rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
+            nodes = self.get_slice_nodes(slice_xrn)
+        
+        rspec.version.add_nodes(nodes)
+        return rspec.toxml()
+
+    def get_slice_nodes(self, slice_xrn):
+        name = OSXrn(xrn = slice_xrn).name
+        instances = self.driver.instance_get_all_by_project(name)
+        rspec_nodes = []
+        for instance in instances:
+            rspec_node = Node()
+            xrn = OSXrn(instance.hostname, 'node')
+            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) 
+            rspec_node['slivers'] = [sliver]
+            rspec_nodes.append(rspec_node)
+        return slivers
+
+    def get_aggregate_nodes(self):
+                
+        zones = self.driver.zone_get_all()
+        if not zones:
+            zones = ['cloud']
+        else:
+            zones = [zone.name for zone in zones]
+
+        rspec_nodes = []
+        for zone in zones:
+            rspec_node = Node()
+            xrn = OSXrn(zone, 'node')
+            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()
+            rspec_node['exclusive'] = 'false'
+            rspec_node['hardware_types'] = [HardwareType({'name': 'plos-pc'}),
+                                                HardwareType({'name': 'pc'})]
+            instances = self.driver.instance_type_get_all().values()
+            slivers = [self.instance_to_sliver(inst) for inst in instances]
+            rspec_node['slivers'] = slivers
+            rspec_nodes.append(rspec_node) 
+
+        return rspec_node