def Delete(self, api, xrn, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" def _Delete(server, xrn, creds, options): return server.Delete(xrn, creds, options) (hrn, type) = urn_to_hrn(xrn[0]) # get the callers hrn valid_cred = api.auth.checkCredentials(creds, 'deletesliver', hrn)[0] caller_hrn = Credential(cred=valid_cred).get_gid_caller().get_hrn() # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential() multiclient = MultiClient() for aggregate in api.aggregates: # prevent infinite loop. Dont send request back to caller # unless the caller is the aggregate's SM if caller_hrn == aggregate and aggregate != api.hrn: continue interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) multiclient.run(_Delete, server, xrn, [cred], options) results = [] for result in multiclient.get_results(): results += ReturnValue.get_value(result) return results
def Describe(self, api, creds, urns, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" version_manager = VersionManager() rspec_version = version_manager.get_version(options.get('geni_rspec_version')) options['creds']=creds return api.driver.describe(urns, rspec_version, options)
def Provision(self, api, xrn, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" version_manager = VersionManager() def _Provision(aggregate, server, xrn, credential, options): tStart = time.time() try: # Need to call GetVersion at an aggregate to determine the supported # rspec type/format beofre calling CreateSliver at an Aggregate. server_version = api.get_cached_server_version(server) result = server.Provision(xrn, credential, options) return {"aggregate": aggregate, "result": result, "elapsed": time.time()-tStart, "status": "success"} except: logger.log_exc('Something wrong in _Allocate with URL %s'%server.url) return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception", "exc_info": sys.exc_info()} # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential() # get the callers hrn valid_cred = api.auth.checkCredentials(creds, 'createsliver', xrn)[0] caller_hrn = Credential(cred=valid_cred).get_gid_caller().get_hrn() multiclient = MultiClient() for aggregate in api.aggregates: # prevent infinite loop. Dont send request back to caller # unless the caller is the aggregate's SM if caller_hrn == aggregate and aggregate != api.hrn: continue interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) # Just send entire RSpec to each aggregate multiclient.run(_Provision, aggregate, server, xrn, [cred], options) results = multiclient.get_results() manifest_version = version_manager._get_version('GENI', '3', 'manifest') result_rspec = RSpec(version=manifest_version) geni_slivers = [] geni_urn = None for result in results: self.add_slicemgr_stat(result_rspec, "Provision", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None)) if result["status"]=="success": try: res = result['result']['value'] geni_urn = res['geni_urn'] result_rspec.version.merge(ReturnValue.get_value(res['geni_rspec'])) geni_slivers.extend(res['geni_slivers']) except: api.logger.log_exc("SM.Provision: Failed to merge aggregate rspec") return { 'geni_urn': geni_urn, 'geni_rspec': result_rspec.toxml(), 'geni_slivers': geni_slivers }
def Allocate(self, api, xrn, creds, rspec_string, expiration, options): """ Allocate resources as described in a request RSpec argument to a slice with the named URN. """ call_id = options.get('call_id') if Callids().already_handled(call_id): return "" options['creds']=creds return api.driver.allocate(xrn, rspec_string, expiration, options)
def CreateSliver(self, api, slice_xrn, creds, rspec_string, users, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" #TODO: create real CreateSliver response rspec ret = self.create_slice(api, slice_xrn, creds, rspec_string, users) if ret: return self.get_rspec(api, creds, slice_xrn) else: return "<?xml version=\"1.0\" ?> <RSpec type=\"SFA\"> Error! </RSpec>"
def Renew(self, api, xrns, creds, expiration_time, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return True # extend as long as possible if options.get('geni_extend_alap'): now = datetime.datetime.now() requested = utcparse(expiration_time) max = adjust_datetime(now, days=int(api.config.SFA_MAX_SLICE_RENEW)) if requested > max: expiration_time = max options['creds']=creds return api.driver.renew(xrns, expiration_time, options)
def Renew(self, api, xrn, creds, expiration_time, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return True def _Renew(aggregate, server, xrn, creds, expiration_time, options): try: result=server.Renew(xrn, creds, expiration_time, options) if type(result)!=dict: result = {'code': {'geni_code': 0}, 'value': result} result['aggregate'] = aggregate return result except: logger.log_exc('Something wrong in _Renew with URL %s'%server.url) return {'aggregate': aggregate, 'exc_info': traceback.format_exc(), 'code': {'geni_code': -1}, 'value': False, 'output': ""} # get the callers hrn valid_cred = api.auth.checkCredentials(creds, 'renewsliver', xrn)[0] caller_hrn = Credential(cred=valid_cred).get_gid_caller().get_hrn() # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential(minimumExpiration=31*86400) multiclient = MultiClient() for aggregate in api.aggregates: # prevent infinite loop. Dont send request back to caller # unless the caller is the aggregate's SM if caller_hrn == aggregate and aggregate != api.hrn: continue interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) multiclient.run(_Renew, aggregate, server, xrn, [cred], expiration_time, options) results = multiclient.get_results() geni_code = 0 geni_output = ",".join([x.get('output',"") for x in results]) geni_value = reduce (lambda x,y: x and y, [result.get('value',False) for result in results], True) for agg_result in results: agg_geni_code = agg_result['code'].get('geni_code',0) if agg_geni_code: geni_code = agg_geni_code results = {'aggregates': results, 'code': {'geni_code': geni_code}, 'value': geni_value, 'output': geni_output} return results
def ListResources(self, api, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" version_manager = VersionManager() def _ListResources(aggregate, server, credential, options): forward_options = copy(options) tStart = time.time() try: version = api.get_cached_server_version(server) # force ProtoGENI aggregates to give us a v2 RSpec forward_options['geni_rspec_version'] = options.get('geni_rspec_version') result = server.ListResources(credential, forward_options) return {"aggregate": aggregate, "result": result, "elapsed": time.time()-tStart, "status": "success"} except Exception, e: api.logger.log_exc("ListResources failed at %s" %(server.url)) return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception", "exc_info": sys.exc_info()}
def Provision(self, api, xrns, creds, options): """ Create the sliver[s] (slice) at this aggregate. Verify HRN and initialize the slice record in PLC if necessary. """ call_id = options.get('call_id') if Callids().already_handled(call_id): return "" # make sure geni_rspec_version is specified in options if 'geni_rspec_version' not in options: msg = 'geni_rspec_version is required and must be set in options struct' raise SfaInvalidArgument(msg, 'geni_rspec_version') # make sure we support the requested rspec version version_manager = VersionManager() rspec_version = version_manager.get_version(options['geni_rspec_version']) if not rspec_version: raise InvalidRSpecVersion(options['geni_rspec_version']) options['creds']=creds return api.driver.provision(xrns, options)
def Describe(self, api, creds, xrns, options): def _Describe(server, xrn, creds, options): return server.Describe(xrn, creds, options) call_id = options.get('call_id') if Callids().already_handled(call_id): return {} # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential() multiclient = MultiClient() for aggregate in api.aggregates: interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) multiclient.run (_Describe, server, xrns, [cred], options) results = [ReturnValue.get_value(result) for result in multiclient.get_results()] # get rid of any void result - e.g. when call_id was hit, where by convention we return {} results = [ result for result in results if result and result.get('geni_urn')] # do not try to combine if there's no result if not results : return {} # otherwise let's merge stuff version_manager = VersionManager() manifest_version = version_manager._get_version('GENI', '3', 'manifest') result_rspec = RSpec(version=manifest_version) geni_slivers = [] geni_urn = None for result in results: try: geni_urn = result['geni_urn'] result_rspec.version.merge(ReturnValue.get_value(result['geni_rspec'])) geni_slivers.extend(result['geni_slivers']) except: api.logger.log_exc("SM.Provision: Failed to merge aggregate rspec") return { 'geni_urn': geni_urn, 'geni_rspec': result_rspec.toxml(), 'geni_slivers': geni_slivers }
def ListResources(self, api, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" # get the rspec's return format from options version_manager = VersionManager() rspec_version = version_manager.get_version(options.get('geni_rspec_version')) version_string = self.get_rspec_version_string(rspec_version, options) # look in cache first cached_requested = options.get('cached', True) if cached_requested and api.driver.cache: rspec = api.driver.cache.get(version_string) if rspec: logger.debug("%s.ListResources returning cached advertisement" % (api.driver.__module__)) return rspec options['creds']=creds rspec = api.driver.list_resources (rspec_version, options) if api.driver.cache: logger.debug("%s.ListResources stores advertisement in cache" % (api.driver.__module__)) api.driver.cache.add(version_string, rspec) return rspec
def Status(self, api, slice_xrn, creds, options): def _Status(server, xrn, creds, options): return server.Status(xrn, creds, options) call_id = options.get('call_id') if Callids().already_handled(call_id): return {} # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential() multiclient = MultiClient() for aggregate in api.aggregates: interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) multiclient.run (_Status, server, slice_xrn, [cred], options) results = [ReturnValue.get_value(result) for result in multiclient.get_results()] # get rid of any void result - e.g. when call_id was hit, where by convention we return {} results = [ result for result in results if result and result['geni_slivers']] # do not try to combine if there's no result if not results : return {} # otherwise let's merge stuff geni_slivers = [] geni_urn = None for result in results: try: geni_urn = result['geni_urn'] geni_slivers.extend(result['geni_slivers']) except: api.logger.log_exc("SM.Provision: Failed to merge aggregate rspec") return { 'geni_urn': geni_urn, 'geni_slivers': geni_slivers }
def Status (self, api, urns, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return {} options['creds']=creds return api.driver.status (urns, options=options)
def Delete(self, api, xrns, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return True options['creds']=creds return api.driver.delete(xrns, options)
def PerformOperationalAction(self, api, xrns, creds, action, options={}): call_id = options.get('call_id') if Callids().already_handled(call_id): return True options['creds']=creds return api.driver.perform_operational_action(xrns, action, options)
def Shutdown(self, api, xrn, creds, options={}): call_id = options.get('call_id') if Callids().already_handled(call_id): return True options['creds']=creds return api.driver.shutdown(xrn, options)
def Allocate(self, api, xrn, creds, rspec_str, expiration, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" version_manager = VersionManager() def _Allocate(aggregate, server, xrn, credential, rspec, options): tStart = time.time() try: # Need to call GetVersion at an aggregate to determine the supported # rspec type/format beofre calling CreateSliver at an Aggregate. #server_version = api.get_cached_server_version(server) #if 'sfa' not in server_version and 'geni_api' in server_version: # sfa aggregtes support both sfa and pg rspecs, no need to convert # if aggregate supports sfa rspecs. otherwise convert to pg rspec #rspec = RSpec(RSpecConverter.to_pg_rspec(rspec, 'request')) #filter = {'component_manager_id': server_version['urn']} #rspec.filter(filter) #rspec = rspec.toxml() result = server.Allocate(xrn, credential, rspec, options) return {"aggregate": aggregate, "result": result, "elapsed": time.time()-tStart, "status": "success"} except: logger.log_exc('Something wrong in _Allocate with URL %s'%server.url) return {"aggregate": aggregate, "elapsed": time.time()-tStart, "status": "exception", "exc_info": sys.exc_info()} # Validate the RSpec against PlanetLab's schema --disabled for now # The schema used here needs to aggregate the PL and VINI schemas # schema = "/var/www/html/schemas/pl.rng" rspec = RSpec(rspec_str) # schema = None # if schema: # rspec.validate(schema) # if there is a <statistics> section, the aggregates don't care about it, # so delete it. self.drop_slicemgr_stats(rspec) # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: cred = api.getCredential() # get the callers hrn hrn, type = urn_to_hrn(xrn) valid_cred = api.auth.checkCredentials(creds, 'createsliver', hrn)[0] caller_hrn = Credential(cred=valid_cred).get_gid_caller().get_hrn() multiclient = MultiClient() for aggregate in api.aggregates: # prevent infinite loop. Dont send request back to caller # unless the caller is the aggregate's SM if caller_hrn == aggregate and aggregate != api.hrn: continue interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) # Just send entire RSpec to each aggregate multiclient.run(_Allocate, aggregate, server, xrn, [cred], rspec.toxml(), options) results = multiclient.get_results() manifest_version = version_manager._get_version(rspec.version.type, rspec.version.version, 'manifest') result_rspec = RSpec(version=manifest_version) geni_urn = None geni_slivers = [] for result in results: self.add_slicemgr_stat(result_rspec, "Allocate", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None)) if result["status"]=="success": try: res = result['result']['value'] geni_urn = res['geni_urn'] result_rspec.version.merge(ReturnValue.get_value(res['geni_rspec'])) geni_slivers.extend(res['geni_slivers']) except: api.logger.log_exc("SM.Allocate: Failed to merge aggregate rspec") return { 'geni_urn': geni_urn, 'geni_rspec': result_rspec.toxml(), 'geni_slivers': geni_slivers }
def ListResources(self, api, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" # version_string = "rspec_%s" % (rspec_version.get_version_name()) slice_urn = options.get('geni_slice_urn') return self.get_rspec(api, creds, slice_urn)
def DeleteSliver(self, api, xrn, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return "" return self.delete_slice(api, xrn, creds)
def SliverStatus(self, api, slice_xrn, creds, options): call_id = options.get('call_id') if Callids().already_handled(call_id): return {} return self.slice_status(api, slice_xrn, creds)