From ffcfb206d0f4ea9788c9f4dea7b2951e55ff513a Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Thu, 7 Feb 2013 22:57:08 -0500 Subject: [PATCH] better support for reporting available api versions --- config/api_versions.xml | 3 ++ setup.py | 1 + sfa/managers/aggregate_manager.py | 5 +++- sfa/server/api_versions.py | 47 +++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 config/api_versions.xml create mode 100644 sfa/server/api_versions.py diff --git a/config/api_versions.xml b/config/api_versions.xml new file mode 100644 index 00000000..6b30f4ed --- /dev/null +++ b/config/api_versions.xml @@ -0,0 +1,3 @@ + + + diff --git a/setup.py b/setup.py index 5c12af08..1fe5a332 100755 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ initscripts = [ 'sfa', 'sfa-cm' ] data_files = [ ('/etc/sfa/', [ 'config/aggregates.xml', 'config/registries.xml', 'config/default_config.xml', + 'config/api_versions.xml', 'config/sfi_config', 'config/topology', 'sfa/managers/pl/pl.rng', diff --git a/sfa/managers/aggregate_manager.py b/sfa/managers/aggregate_manager.py index cb8b2a6b..6893131b 100644 --- a/sfa/managers/aggregate_manager.py +++ b/sfa/managers/aggregate_manager.py @@ -5,6 +5,7 @@ from sfa.util.xrn import Xrn from sfa.util.callids import Callids from sfa.util.sfalogging import logger from sfa.util.faults import SfaInvalidArgument, InvalidRSpecVersion +from sfa.server.api_versions import ApiVersions class AggregateManager: @@ -49,13 +50,15 @@ class AggregateManager: xrn=Xrn(api.hrn, type='authority') 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.append({'3': 'http://%s:%s' % (socket.gethostname(), api.config.sfa_aggregate_port)}) version_generic = { 'testbed': self.driver.testbed_name(), 'interface':'aggregate', 'hrn':xrn.get_hrn(), 'urn':xrn.get_urn(), 'geni_api': 3, - 'geni_api_versions': {'3': 'http://%s:%s' % (socket.gethostname(), api.config.sfa_aggregate_port)}, + 'geni_api_versions': geni_api_versions, 'geni_single_allocation': 0, # Accept operations that act on as subset of slivers in a given state. 'geni_allocate': 'geni_many',# Multiple slivers can exist and be incrementally added, including those which connect or overlap in some way. 'geni_credential_types': cred_types, diff --git a/sfa/server/api_versions.py b/sfa/server/api_versions.py new file mode 100644 index 00000000..2f1ccf73 --- /dev/null +++ b/sfa/server/api_versions.py @@ -0,0 +1,47 @@ +import os +from sfa.util.xml import XML +from sfa.util.config import Config + +class ApiVersions: + + required_fields = ['version', 'url'] + + template = """ + +""" + + def __init__(self, string=None, filename=None, create=False): + self.xml = None + + if create: + self.create() + elif string: + self.load(string) + elif filename: + self.load(filename) + else: + # load the default file + c = Config() + api_versions_file = os.path.sep.join([c.config_path, 'api_versions.xml']) + self.load(api_versions_file) + + def create(self): + self.xml = XML(string=ApiVersions.template) + + def load(self, source): + self.xml = XML(source) + + def get_versions(self): + versions = [] + for value in self.xml.todict().values(): + if not value: + continue + if isinstance(value, list): + for item in value: + if isinstance(item, dict) and \ + set(ApiVersions.required_fields).issubset(item.keys()): + api_version = {str(item['version']): item['url']} + versions.append(api_version) + return versions + + -- 2.43.0