fix AttributeError
[sfa.git] / sfa / openstack / osaggregate.py
1 from sfa.rspecs.rspec import RSpec
2 from sfa.rspecs.elements.hardware_type import HardwareType
3 from sfa.rspecs.elements.node import Node
4 from sfa.rspecs.elements.sliver import Sliver
5 from sfa.rspecs.elements.login import Login
6 from sfa.rspecs.elements.services import Services
7 from sfa.util.xrn import Xrn
8 from sfa.util.osxrn import OSXrn
9 from sfa.rspecs.version_manager import VersionManager
10
11 class OSAggregate:
12
13     def __init__(self, driver):
14         self.driver = driver
15
16     def instance_to_sliver(instance, slice_xrn=None):
17         sliver_id = None
18         if slice_xrn:
19             xrn = OSXrn(slice_xrn, 'slice')
20             sliver_id = xrn.sliver_id(instance.instance_id, "")
21
22         # should include: 
23         # * instance.image_ref
24         # * instance.kernel_id
25         # * instance.ramdisk_id 
26         name=None
27         if hasattr(instance, 'name'):
28             name = instance.name
29         elif hasattr(instance, 'display_name'):
30             name = instance.display_name 
31         sliver = Sliver({'slice_id': sliver_id,
32                          'name': xrn.name,
33                          'type': 'plos-' + instance.name,
34                          'tags': []})
35         return sliver
36
37     def get_rspec(self, slice_xrn=None, vsersion=None, options={}):
38         version_manager = VersionManager()
39         version = version_manager.get_version(version)
40         if not slice_xrn:
41             rspec_version = version_manager._get_version(version.type, version.version, 'ad')
42             nodes = self.get_aggregate_nodes()
43         else:
44             rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
45             nodes = self.get_slice_nodes(slice_xrn)
46         
47         rspec.version.add_nodes(nodes)
48         return rspec.toxml()
49
50     def get_slice_nodes(self, slice_xrn):
51         name = OSXrn(xrn = slice_xrn).name
52         instances = self.driver.shell.instance_get_all_by_project(name)
53         rspec_nodes = []
54         for instance in instances:
55             rspec_node = Node()
56             xrn = OSXrn(instance.hostname, 'node')
57             rspec_node['component_id'] = xrn.urn
58             rspec_node['component_name'] = xrn.name
59             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()   
60             sliver = self.instance_to_sliver(instance) 
61             rspec_node['slivers'] = [sliver]
62             rspec_nodes.append(rspec_node)
63         return slivers
64
65     def get_aggregate_nodes(self):
66                 
67         zones = self.driver.shell.zone_get_all()
68         if not zones:
69             zones = ['cloud']
70         else:
71             zones = [zone.name for zone in zones]
72
73         rspec_nodes = []
74         for zone in zones:
75             rspec_node = Node()
76             xrn = OSXrn(zone, 'node')
77             rspec_node['component_id'] = xrn.urn
78             rspec_node['component_name'] = xrn.name
79             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
80             rspec_node['exclusive'] = 'false'
81             rspec_node['hardware_types'] = [HardwareType({'name': 'plos-pc'}),
82                                                 HardwareType({'name': 'pc'})]
83             instances = self.driver.shell.instance_type_get_all().values()
84             slivers = [self.instance_to_sliver(inst) for inst in instances]
85             rspec_node['slivers'] = slivers
86             rspec_nodes.append(rspec_node) 
87
88         return rspec_node