X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fopenstack%2Fnova_driver.py;h=56f0334b3c2dae7efe35041aea92efcdb36bb75d;hb=8cc9cc93600c8136e8dc46b21676234643b8abc2;hp=d1d2c1a447a3bb563c2ce252cd084ee0c9589449;hpb=fab6934308a826b06aead94b676fe02b2ba908fb;p=sfa.git diff --git a/sfa/openstack/nova_driver.py b/sfa/openstack/nova_driver.py index d1d2c1a4..56f0334b 100644 --- a/sfa/openstack/nova_driver.py +++ b/sfa/openstack/nova_driver.py @@ -2,13 +2,12 @@ import time import datetime from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \ - RecordNotFound, SfaNotImplemented, SliverDoesNotExist, \ - SfaInvalidArgument + RecordNotFound, SfaNotImplemented, SfaInvalidArgument from sfa.util.sfalogging import logger from sfa.util.defaultdict import defaultdict from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch -from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf, urn_to_sliver_id +from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf from sfa.openstack.osxrn import OSXrn, hrn_to_os_slicename, hrn_to_os_tenant_name from sfa.util.cache import Cache from sfa.trust.credential import Credential @@ -316,125 +315,26 @@ 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, - } - - 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) + return {} - # 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, 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 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) - 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? - result['plos_expires'] = None - result['geni_expires'] = None - - resources = [] - for instance in instances: - res = {} - # 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)) - 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.status.lower() == 'active': - res['boot_state'] = 'ready' - res['geni_status'] = 'ready' - else: - res['boot_state'] = 'unknown' - res['geni_status'] = 'unknown' - 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): + def describe(self, urns, version, options): + aggregate = OSAggregate(self) + return aggregate.describe(urns, version=version, options=options) + + def status (self, urns, options={}): + aggregate = OSAggregate(self) + desc = aggregate.describe(urns) + return desc['geni_slivers'] + def allocate (self, urn, rspec_string, options): + xrn = Xrn(urn) aggregate = OSAggregate(self) # assume first user is the caller and use their context @@ -442,9 +342,10 @@ class NovaDriver(Driver): # key as the project key. key_name = None if len(users) > 1: - key_name = aggregate.create_instance_key(slice_hrn, users[0]) + key_name = aggregate.create_instance_key(xrn.get_hrn(), users[0]) # collect public keys + users = options.get('geni_users', []) pubkeys = [] for user in users: pubkeys.extend(user['keys']) @@ -454,35 +355,38 @@ class NovaDriver(Driver): 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): + def provision(self, urns, version, 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, tenant_name) + return aggregate.describe(urns, version=version, options=options) - 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() + def delete (self, urns, options): aggregate = OSAggregate(self) - return aggregate.update_instances(name) - - def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options): - return True - - def start_slice (self, slice_urn, slice_hrn, creds): + for urn in urns: + xrn = OSXrn(xrn=urn, type='slice') + tenant_name = xrn.get_tenant_name() + project_name = xrn.get_slicename() + id = xrn.id + aggregate.delete_instance(tenant_name, project_name, id) 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, tenant_name) + def renew (self, urns, expiration_time, options): + return True - def reset_slice (self, slice_urn, slice_hrn, creds): - raise SfaNotImplemented ("reset_slice not available at this interface") - + def perform_operational_action (self, urns, action, options): + pass + + def shutdown(self, xrn, options): + xrn = OSXrn(xrn=xrn, type='slice') + tenant_name = xrn.get_tenant_name() + name = xrn.get_slicename() + self.driver.shell.nova_manager.connect(tenant=tenant_name) + instances = self.driver.shell.nova_manager.servers.findall(name=name) + for instance in instances: + self.driver.shell.nova_manager.servers.shutdown(instance) + return True + # xxx this code is quite old and has not run for ages # it is obviously totally broken and needs a rewrite def get_ticket (self, slice_urn, slice_hrn, creds, rspec_string, options):