X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Fslice_manager.py;h=dcd5e5e090565b81a916a44c4a2e480a437ba396;hb=ca48929768093b728c44c51911516df9fb73c8bb;hp=dcf64a686337c0cdfa385a244f93d21333936617;hpb=8ccd5feb24978a74bc0ae06cb6a530ade9b3a3af;p=sfa.git diff --git a/sfa/managers/slice_manager.py b/sfa/managers/slice_manager.py index dcf64a68..dcd5e5e0 100644 --- a/sfa/managers/slice_manager.py +++ b/sfa/managers/slice_manager.py @@ -116,6 +116,7 @@ class SliceManager: forward_options['rspec_version'] = version_manager.get_version('SFA 1').to_dict() else: forward_options['rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict() + forward_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} rspec = server.ListResources(credential, forward_options) return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"} except Exception, e: @@ -134,7 +135,7 @@ class SliceManager: # look in cache first cached_requested = options.get('cached', True) - if not xrn and self.cache and cached_request: + if not xrn and self.cache and cached_requested: rspec = self.cache.get(version_string) if rspec: api.logger.debug("SliceManager.ListResources returns cached advertisement") @@ -260,18 +261,28 @@ class SliceManager: call_id = options.get('call_id') if Callids().already_handled(call_id): return True - def _RenewSliver(server, xrn, creds, expiration_time, options): - return server.RenewSliver(xrn, creds, expiration_time, options) - - (hrn, type) = urn_to_hrn(xrn) + def _RenewSliver(aggregate, server, xrn, creds, expiration_time, options): + try: + result=server.RenewSliver(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': ""} + + (hrn, urn_type) = urn_to_hrn(xrn) # get the callers hrn valid_cred = api.auth.checkCredentials(creds, 'renewsliver', hrn)[0] caller_hrn = Credential(string=valid_cred).get_gid_caller().get_hrn() - + # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: - cred = api.getCredential() + cred = api.getCredential(minimumExpiration=31*86400) threads = ThreadManager() for aggregate in api.aggregates: # prevent infinite loop. Dont send request back to caller @@ -280,13 +291,24 @@ class SliceManager: continue interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) - threads.run(_RenewSliver, server, xrn, [cred], expiration_time, options) - # 'and' the results - results = [ReturnValue.get_value(result) for result in threads.get_results()] - return reduce (lambda x,y: x and y, results , True) - + threads.run(_RenewSliver, 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 DeleteSliver(self, api, xrn, creds, options): - call_id = options.get('call_id') + call_id = options.get('call_id') if Callids().already_handled(call_id): return "" def _DeleteSliver(server, xrn, creds, options): @@ -296,7 +318,7 @@ class SliceManager: # get the callers hrn valid_cred = api.auth.checkCredentials(creds, 'deletesliver', hrn)[0] caller_hrn = Credential(string=valid_cred).get_gid_caller().get_hrn() - + # attempt to use delegated credential first cred = api.getDelegatedCredential(creds) if not cred: @@ -315,9 +337,9 @@ class SliceManager: # first draft at a merging SliverStatus - def SliverStatus(self, api, slice_xrn, creds, options): - def _SliverStatus(server, xrn, creds, options): - return server.SliverStatus(xrn, creds, options) + 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 {} @@ -329,7 +351,7 @@ class SliceManager: for aggregate in api.aggregates: interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) - threads.run (_SliverStatus, server, slice_xrn, [cred], options) + 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 {} @@ -343,7 +365,14 @@ class SliceManager: # mmh, it is expected that all results carry the same urn overall['geni_urn'] = results[0]['geni_urn'] - overall['pl_login'] = results[0]['pl_login'] + overall['pl_login'] = None + for result in results: + if result.get('pl_login'): + overall['pl_login'] = result['pl_login'] + break + elif isinstance(result.get('value'), dict) and result['value'].get('pl_login'): + overall['pl_login'] = result['value']['pl_login'] + break # append all geni_resources overall['geni_resources'] = \ reduce (lambda x,y: x+y, [ result['geni_resources'] for result in results] , [])