1 from nova.exception import ImageNotFound
2 from sfa.util.faults import SfaAPIError
3 from sfa.rspecs.rspec import RSpec
4 from sfa.rspecs.elements.hardware_type import HardwareType
5 from sfa.rspecs.elements.node import Node
6 from sfa.rspecs.elements.sliver import Sliver
7 from sfa.rspecs.elements.login import Login
8 from sfa.rspecs.elements.disk_image import DiskImage
9 from sfa.rspecs.elements.services import Services
10 from sfa.util.xrn import Xrn
11 from sfa.util.osxrn import OSXrn
12 from sfa.rspecs.version_manager import VersionManager
17 def __init__(self, driver):
20 def instance_to_sliver(self, instance, slice_xrn=None):
22 # * instance.image_ref
23 # * instance.kernel_id
24 # * instance.ramdisk_id
25 import nova.db.sqlalchemy.models
29 if isinstance(instance, dict):
30 # this is an isntance type dict
31 name = instance['name']
32 type = instance['name']
33 elif isinstance(instance, nova.db.sqlalchemy.models.Instance):
34 # this is an object that describes a running instance
35 name = instance.display_name
36 type = instance.instance_type.name
38 raise SfaAPIError("instnace must be an instance_type dict or" + \
39 " a nova.db.sqlalchemy.models.Instance object")
41 xrn = Xrn(slice_xrn, 'slice')
42 sliver_id = xrn.get_sliver_id(instance.project_id, instance.hostname, instance.id)
44 sliver = Sliver({'slice_id': sliver_id,
46 'type': 'plos-' + type,
50 def get_disk_images(self, image_id=None):
54 images = [self.driver.shell.image_manager.show(image_id)]
58 images = self.driver.shell.image_manager.detail()
61 # create disk image objects
63 if image['container_format'] == 'ami':
65 img['name'] = image['name']
66 img['description'] = image['name']
67 img['os'] = image['name']
68 img['version'] = image['name']
69 disk_images.append(img)
72 def get_rspec(self, slice_xrn=None, version=None, options={}):
73 version_manager = VersionManager()
74 version = version_manager.get_version(version)
76 rspec_version = version_manager._get_version(version.type, version.version, 'ad')
77 nodes = self.get_aggregate_nodes()
79 rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
80 nodes = self.get_slice_nodes(slice_xrn)
81 rspec = RSpec(version=rspec_version, user_options=options)
82 rspec.version.add_nodes(nodes)
85 def get_slice_nodes(self, slice_xrn):
86 name = OSXrn(xrn = slice_xrn).name
87 instances = self.driver.shell.db.instance_get_all_by_project(name)
89 for instance in instances:
91 xrn = OSXrn(instance.hostname, 'node')
92 rspec_node['component_id'] = xrn.urn
93 rspec_node['component_name'] = xrn.name
94 rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
95 sliver = self.instance_to_sliver(instance)
96 sliver['disk_images'] = self.get_disk_images(instance.image_ref)
97 rspec_node['slivers'] = [sliver]
98 rspec_nodes.append(rspec_node)
101 def get_aggregate_nodes(self):
103 zones = self.driver.shell.db.zone_get_all()
107 zones = [zone.name for zone in zones]
109 # available sliver/instance/vm types
110 instances = self.driver.shell.db.instance_type_get_all().values()
112 disk_images = self.get_disk_images()
117 xrn = OSXrn(zone, 'node')
118 rspec_node['component_id'] = xrn.urn
119 rspec_node['component_name'] = xrn.name
120 rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
121 rspec_node['exclusive'] = 'false'
122 rspec_node['hardware_types'] = [HardwareType({'name': 'plos-pc'}),
123 HardwareType({'name': 'pc'})]
125 for instance in instances:
126 sliver = self.instance_to_sliver(instance)
127 sliver['disk_images'] = disk_images
128 slivers.append(sliver)
130 rspec_node['slivers'] = slivers
131 rspec_nodes.append(rspec_node)
136 def verify_slice(self, slicename, users, options={}):
138 Create the slice if it doesn't alredy exist
140 import nova.exception.ProjectNotFound
142 slice = self.driver.shell.auth_manager.get_project(slicename)
143 except nova.exception.ProjectNotFound:
144 # convert urns to user names
145 usernames = [Xrn(user['urn']).get_leaf() for user in users]
146 # assume that the first user is the project manager
147 proj_manager = usernames[0]
148 self.driver.shell.auth_manager.create_project(slicename, proj_manager)
150 def verify_slice_users(self, slicename, users, options={}):
152 Add requested users to the specified slice.
155 # There doesn't seem to be an effcient way to
156 # look up all the users of a project, so lets not
157 # attempt to remove stale users . For now lets just
158 # ensure that the specified users exist
160 username = Xrn(user['urn']).get_leaf()
162 self.driver.shell.auth_manager.get_user(username)
163 except nova.exception.UserNotFound:
164 self.driver.shell.auth_manager.create_user(username)
165 self.verify_user_keys(username, user['keys'], options)
167 def verify_user_keys(self, username, keys, options={}):
171 append = options.get('append', True)
172 existing_keys = self.driver.shell.db.key_pair_get_all_by_user(username)
173 existing_pub_keys = [key.public_key for key in existing_keys]
174 removed_pub_keys = set(existing_pub_keys).difference(keys)
175 added_pub_keys = set(keys).difference(existing_pub_keys)
178 for public_key in added_pub_keys:
180 key['user_id'] = username
181 key['name'] = username
182 key['public'] = public_key
183 self.driver.shell.db.key_pair_create(key)
187 for key in existing_keys:
188 if key.public_key in removed_pub_keys:
189 self.driver.shell.db.key_pair_destroy(username, key.name)
191 def verify_instances(self, slicename, rspec):
193 nodes = rspec.version.get_nodes_with_slivers()
194 old_instances = self.driver.shell.db.instance_get_all_by_project(name)
196 for slivers in node.get('slivers', []):