+ request_rspec_versions.append(rspec_version.to_dict())
+ return {
+ 'geni_request_rspec_versions': request_rspec_versions,
+ 'geni_ad_rspec_versions': ad_rspec_versions,
+ }
+
+ def get_rspec_version_string(self, rspec_version, options=None):
+ if options is None:
+ options = {}
+ version_string = "rspec_%s" % (rspec_version)
+
+ # panos adding the info option to the caching key (can be improved)
+ if options.get('info'):
+ version_string = version_string + \
+ "_" + options.get('info', 'default')
+
+ # Adding the list_leases option to the caching key
+ if options.get('list_leases'):
+ version_string = version_string + "_" + \
+ options.get('list_leases', 'default')
+
+ # Adding geni_available to caching key
+ if options.get('geni_available'):
+ version_string = version_string + "_" + \
+ str(options.get('geni_available'))
+
+ return version_string
+
+ def GetVersion(self, api, options):
+ xrn = Xrn(api.hrn, type='authority+am')
+ version = version_core()
+ cred_types = [{'geni_type': 'geni_sfa',
+ 'geni_version': str(i)} for i in range(4)[-2:]]
+ geni_api_versions = ApiVersions().get_versions()
+ geni_api_versions['3'] = \
+ 'https://%s:%s' % (api.config.sfa_aggregate_host, api.config.sfa_aggregate_port)
+ version_generic = {
+ 'testbed': api.driver.testbed_name(),
+ 'interface': 'aggregate',
+ 'sfa': 3,
+ 'hrn': xrn.get_hrn(),
+ 'urn': xrn.get_urn(),
+ 'geni_api': 3,
+ 'geni_api_versions': geni_api_versions,
+ # Accept operations that act on as subset of slivers in a given
+ # state.
+ 'geni_single_allocation': 0,
+ # Multiple slivers can exist and be incrementally added, including
+ # those which connect or overlap in some way.
+ 'geni_allocate': 'geni_many',
+ 'geni_credential_types': cred_types,
+ 'geni_handles_speaksfor': True, # supports 'speaks for' credentials
+ }
+ version.update(version_generic)
+ version.update(self.rspec_versions())
+ testbed_version = api.driver.aggregate_version()
+ version.update(testbed_version)
+ return version
+
+ 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
+
+ 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 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'))
+ return api.driver.describe(urns, rspec_version, options)
+
+ def Status(self, api, urns, creds, options):
+ call_id = options.get('call_id')
+ if Callids().already_handled(call_id):
+ return {}
+ return api.driver.status(urns, options=options)
+
+ def Allocate(self, api, xrn, creds, rspec_string, expiration, options):