X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fopenstack%2Fnova_driver.py;h=6786fd78ca5c870501505dded255d15b577a5ce8;hb=db5e2034e15c72434fdf67ee40d32b980f971705;hp=e4ef96105cce68fa6b687ef1b3cdd36c4032d8a0;hpb=b8843890f35056ab7fe42b0765cb3e0ac114c3cf;p=sfa.git diff --git a/sfa/openstack/nova_driver.py b/sfa/openstack/nova_driver.py index e4ef9610..6786fd78 100644 --- a/sfa/openstack/nova_driver.py +++ b/sfa/openstack/nova_driver.py @@ -43,7 +43,7 @@ class NovaDriver(Driver): def __init__ (self, config): Driver.__init__(self, config) - self.shell = Shell(config) + self.shell = Shell(config=config) self.cache=None if config.SFA_AGGREGATE_CACHING: if NovaDriver.cache is None: @@ -90,7 +90,9 @@ class NovaDriver(Driver): for researcher in researchers: name = Xrn(researcher).get_leaf() user = self.shell.auth_manager.users.find(name=name) + self.shell.auth_manager.roles.add_user_role(user, 'Member', tenant) self.shell.auth_manager.roles.add_user_role(user, 'user', tenant) + pis = sfa_record.get('pis', []) for pi in pis: @@ -314,89 +316,40 @@ class NovaDriver(Driver): def testbed_name (self): return "openstack" - # 'geni_request_rspec_versions' and 'geni_ad_rspec_versions' are mandatory def aggregate_version (self): - version_manager = VersionManager() - ad_rspec_versions = [] - request_rspec_versions = [] - for rspec_version in version_manager.versions: - if rspec_version.content_type in ['*', 'ad']: - ad_rspec_versions.append(rspec_version.to_dict()) - if rspec_version.content_type in ['*', 'request']: - request_rspec_versions.append(rspec_version.to_dict()) - return { - 'testbed':self.testbed_name(), - 'geni_request_rspec_versions': request_rspec_versions, - 'geni_ad_rspec_versions': ad_rspec_versions, - } + return {} def list_slices (self, creds, options): - # look in cache first - if self.cache: - slices = self.cache.get('slices') - if slices: - logger.debug("OpenStackDriver.list_slices returns from cache") - return slices - # get data from db instance_urns = [] instances = self.shell.nova_manager.servers.findall() for instance in instances: if instance.name not in instance_urns: instance_urns.append(OSXrn(instance.name, type='slice').urn) - - # cache the result - if self.cache: - logger.debug ("OpenStackDriver.list_slices stores value in cache") - self.cache.add('slices', instance_urns) - return instance_urns # first 2 args are None in case of resource discovery - def list_resources (self, slice_urn, slice_hrn, creds, options): - cached_requested = options.get('cached', True) - - version_manager = VersionManager() - # get the rspec's return format from options - rspec_version = version_manager.get_version(options.get('geni_rspec_version')) - version_string = "rspec_%s" % (rspec_version) - - #panos adding the info option to the caching key (can be improved) - if options.get('info'): - version_string = version_string + "_"+options.get('info', 'default') - - # look in cache first - if cached_requested and self.cache and not slice_hrn: - rspec = self.cache.get(version_string) - if rspec: - logger.debug("OpenStackDriver.ListResources: returning cached advertisement") - return rspec - - #panos: passing user-defined options - #print "manager options = ",options + def list_resources (self, creds, version, options): aggregate = OSAggregate(self) - rspec = aggregate.get_rspec(slice_xrn=slice_urn, version=rspec_version, - options=options) - - # cache the result - if self.cache and not slice_hrn: - logger.debug("OpenStackDriver.ListResources: stores advertisement in cache") - self.cache.add(version_string, rspec) - + rspec = aggregate.list_resources(version=version, options=options) return rspec + + def describe(self, creds, urns, version, options): + aggregate = OSAggregate(self) + return aggregate.describe(urns, version=version, options=options) def sliver_status (self, slice_urn, slice_hrn): + # update nova connection + tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name() + self.shell.nova_manager.connect(tenant=tenant_name) + # find out where this slice is currently running project_name = hrn_to_os_slicename(slice_hrn) - project = self.shell.auth_manager.get_project(project_name) - instances = self.shell.db.instance_get_all_by_project(project_name) + instances = self.shell.nova_manager.servers.findall(name=project_name) if len(instances) == 0: raise SliverDoesNotExist("You have not allocated any slivers here") result = {} - top_level_status = 'unknown' - if instances: - top_level_status = 'ready' result['geni_urn'] = slice_urn result['plos_login'] = 'root' # do we need real dates here? @@ -409,32 +362,29 @@ class NovaDriver(Driver): # instances are accessed by ip, not hostname. We need to report the ip # somewhere so users know where to ssh to. res['geni_expires'] = None - res['plos_hostname'] = instance.hostname - res['plos_created_at'] = datetime_to_string(utcparse(instance.created_at)) - res['plos_boot_state'] = instance.vm_state - res['plos_sliver_type'] = instance.instance_type.name - sliver_id = Xrn(slice_urn).get_sliver_id(instance.project_id, \ - instance.hostname, instance.id) + #res['plos_hostname'] = instance.hostname + res['plos_created_at'] = datetime_to_string(utcparse(instance.created)) + res['plos_boot_state'] = instance.status + res['plos_sliver_type'] = self.shell.nova_manager.flavors.find(id=instance.flavor['id']).name + sliver_id = Xrn(slice_urn).get_sliver_id(instance.id) res['geni_urn'] = sliver_id - if instance.vm_state == 'running': + if instance.status.lower() == 'active': res['boot_state'] = 'ready' res['geni_status'] = 'ready' else: res['boot_state'] = 'unknown' res['geni_status'] = 'unknown' + res['geni_allocation_status'] = 'geni_provisioned' resources.append(res) - result['geni_status'] = top_level_status result['geni_resources'] = resources return result def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options): aggregate = OSAggregate(self) - rspec = RSpec(rspec_string) - instance_name = hrn_to_os_slicename(slice_hrn) - + # assume first user is the caller and use their context # for the ec2/euca api connection. Also, use the first users # key as the project key. @@ -447,17 +397,22 @@ class NovaDriver(Driver): for user in users: pubkeys.extend(user['keys']) - aggregate.run_instances(instance_name, rspec_string, key_name, pubkeys) + rspec = RSpec(rspec_string) + instance_name = hrn_to_os_slicename(slice_hrn) + tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name() + aggregate.run_instances(instance_name, tenant_name, rspec_string, key_name, pubkeys) - return aggregate.get_rspec(slice_xrn=slice_urn, version=rspec.version) + return aggregate.describe(slice_xrn=slice_urn, version=rspec.version) def delete_sliver (self, slice_urn, slice_hrn, creds, options): aggregate = OSAggregate(self) + tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name() project_name = hrn_to_os_slicename(slice_hrn) - return aggregate.delete_instances(project_name) + return aggregate.delete_instances(project_name, tenant_name) def update_sliver(self, slice_urn, slice_hrn, rspec, creds, options): name = hrn_to_os_slicename(slice_hrn) + tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name() aggregate = OSAggregate(self) return aggregate.update_instances(name) @@ -468,9 +423,10 @@ class NovaDriver(Driver): return 1 def stop_slice (self, slice_urn, slice_hrn, creds): + tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name() name = OSXrn(xrn=slice_urn).name aggregate = OSAggregate(self) - return aggregate.stop_instances(name) + return aggregate.stop_instances(name, tenant_name) def reset_slice (self, slice_urn, slice_hrn, creds): raise SfaNotImplemented ("reset_slice not available at this interface")