+ 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 _RenewSliver 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)
+ threads = ThreadManager()
+ 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)
+ threads.run(_Renew, aggregate, server, xrn, [cred], expiration_time, options)
+
+ results = threads.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)
+ # 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()
+ threads = ThreadManager()
+ 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)
+ threads.run(_DeleteSliver, server, xrn, [cred], options)
+ threads.get_results()
+ return 1
+
+
+ # 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()
+ threads = ThreadManager()
+ for aggregate in api.aggregates:
+ interface = api.aggregates[aggregate]
+ server = api.server_proxy(interface, cred)
+ threads.run (_Status, server, slice_xrn, [cred], options)
+ results = [ReturnValue.get_value(result) for result in threads.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']]