+ 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 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