+
+
+ 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 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
+
+
+ # first draft at a merging SliverStatus
+ 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 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 PerformOperationalAction(self, api, xrn, creds, action, options):
+ # get the callers hrn
+ valid_cred = api.auth.checkCredentials(creds, 'createsliver', 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()
+ 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(server.PerformOperationalAction, xrn, [cred], action, options)
+ multiclient.get_results()
+ return 1
+
+ def Shutdown(self, api, xrn, creds, options={}):
+ xrn = Xrn(xrn)
+ # get the callers hrn
+ valid_cred = api.auth.checkCredentials(creds, 'stopslice', xrn.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(server.Shutdown, xrn.urn, cred)
+ multiclient.get_results()
+ return 1
+