From 6f9d637f2a7f110c5268a02399d745f6ced1063e Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Mon, 11 Jul 2011 19:33:28 -0400 Subject: [PATCH] properly merge ProtoGENI v2 rspec with SFA rspec --- sfa/managers/slice_manager_pl.py | 23 ++++++++++++----------- sfa/rspecs/pg_rspec.py | 6 +++--- sfa/rspecs/pg_rspec_converter.py | 2 +- sfa/rspecs/rspec_converter.py | 2 +- sfa/rspecs/rspec_parser.py | 2 ++ sfa/rspecs/sfa_rspec.py | 7 +++++++ 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/sfa/managers/slice_manager_pl.py b/sfa/managers/slice_manager_pl.py index ac687060..f23d4d82 100644 --- a/sfa/managers/slice_manager_pl.py +++ b/sfa/managers/slice_manager_pl.py @@ -84,10 +84,16 @@ def GetVersion(api): def ListResources(api, creds, options, call_id): - def _ListResources(server, credential, my_opts, call_id): + def _ListResources(server, credential, opts, call_id): + + my_opts = copy(opts) args = [credential, my_opts] if _call_id_supported(api, server): args.append(call_id) + version = api.get_cached_server_version(server) + # force ProtoGENI aggregates to give us a v2 RSpec + if 'sfa' not in version.keys(): + my_opts['rspec_version'] = pg_rspec_ad_version try: return server.ListResources(*args) except Exception, e: @@ -98,13 +104,9 @@ def ListResources(api, creds, options, call_id): # get slice's hrn from options xrn = options.get('geni_slice_urn', '') (hrn, type) = urn_to_hrn(xrn) - my_opts = copy(options) - if 'geni_compressed' in my_opts: - del(my_opts['geni_compressed']) + if 'geni_compressed' in options: + del(options['geni_compressed']) - if 'rspec_version' in my_opts: - del my_opts['rspec_version'] - # get the rspec's return format from options rspec_version = RSpecVersion(options.get('rspec_version')) version_string = "rspec_%s" % (rspec_version.get_version_name()) @@ -133,11 +135,10 @@ def ListResources(api, creds, options, call_id): # get the rspec from the aggregate server = api.aggregates[aggregate] - #threads.run(server.ListResources, credentials, my_opts, call_id) - threads.run(_ListResources, server, credentials, my_opts, call_id) + threads.run(_ListResources, server, credentials, options, call_id) results = threads.get_results() - rspec_version = RSpecVersion(my_opts.get('rspec_version')) + rspec_version = RSpecVersion(options.get('rspec_version')) if rspec_version['type'] == pg_rspec_ad_version['type']: rspec = PGRSpec() else: @@ -146,7 +147,7 @@ def ListResources(api, creds, options, call_id): try: rspec.merge(result) except: - api.logger.info("SM.ListResources: Failed to merge aggregate rspec") + api.logger.log_exc("SM.ListResources: Failed to merge aggregate rspec") # cache the result if caching and api.cache and not xrn: diff --git a/sfa/rspecs/pg_rspec.py b/sfa/rspecs/pg_rspec.py index 82d2d8b8..a55fe10d 100755 --- a/sfa/rspecs/pg_rspec.py +++ b/sfa/rspecs/pg_rspec.py @@ -67,13 +67,13 @@ class PGRSpec(RSpec): def get_network(self): network = None - nodes = self.xml.xpath('//rspecv2:node[@component_manager_uuid][1]', namespaces=self.namespaces) + nodes = self.xml.xpath('//rspecv2:node[@component_manager_id][1]', namespaces=self.namespaces) if nodes: - network = nodes[0].get('component_manager_uuid') + network = nodes[0].get('component_manager_id') return network def get_networks(self): - networks = self.xml.xpath('//rspecv2:node[@component_manager_uuid]/@component_manager_uuid', namespaces=self.namespaces) + networks = self.xml.xpath('//rspecv2:node[@component_manager_id]/@component_manager_id', namespaces=self.namespaces) return set(networks) def get_node_element(self, hostname, network=None): diff --git a/sfa/rspecs/pg_rspec_converter.py b/sfa/rspecs/pg_rspec_converter.py index e9a34ebe..586c02ba 100755 --- a/sfa/rspecs/pg_rspec_converter.py +++ b/sfa/rspecs/pg_rspec_converter.py @@ -52,7 +52,7 @@ class PGRSpecConverter: i = 1 for pg_node_element in pg_nodes_elements: node_element = sfa_rspec.add_element('node', {'id': 'n'+str(i)}, parent=network_element) - urn = pg_node_element.xpath('@component_uuid | @component_id') + urn = pg_node_element.xpath('@component_id', namespaces=pg_rspec.namespaces) if urn: urn = urn[0] hostname = Xrn.urn_split(urn)[-1] diff --git a/sfa/rspecs/rspec_converter.py b/sfa/rspecs/rspec_converter.py index 89f03a47..6f96d4f2 100755 --- a/sfa/rspecs/rspec_converter.py +++ b/sfa/rspecs/rspec_converter.py @@ -17,7 +17,7 @@ class RSpecConverter: elif rspec.version['type'] == pg_rspec_ad_version['type']: return PGRSpecConverter.to_sfa_rspec(in_rspec) else: - return in_rspec + return in_rspec @staticmethod def to_pg_rspec(in_rspec): diff --git a/sfa/rspecs/rspec_parser.py b/sfa/rspecs/rspec_parser.py index 8e3bced8..b29329bf 100755 --- a/sfa/rspecs/rspec_parser.py +++ b/sfa/rspecs/rspec_parser.py @@ -12,11 +12,13 @@ def parse_rspec(in_rspec): if rspec.xml.xpath('//network'): #out_rspec = SfaRSpec(in_rspec) out_rspec = SfaRSpec() + out_rspec.type = 'SFA' out_rspec.xml = rspec.xml else: #out_rspec = PGRSpec(in_rspec) # TODO: determine if this is an ad or request out_rspec = PGRSpec() + out_rspec.type = 'ProtoGENI' out_rspec.xml = rspec.xml return out_rspec diff --git a/sfa/rspecs/sfa_rspec.py b/sfa/rspecs/sfa_rspec.py index 57c626bc..16fa3e8b 100755 --- a/sfa/rspecs/sfa_rspec.py +++ b/sfa/rspecs/sfa_rspec.py @@ -317,6 +317,12 @@ class SfaRSpec(RSpec): Merge contents for specified rspec with current rspec """ + from sfa.rspecs.rspec_parser import parse_rspec + rspec = parse_rspec(in_rspec) + if rspec.type.lower() == 'protogeni': + from sfa.rspecs.rspec_converter import RSpecConverter + in_rspec = RSpecConverter.to_sfa_rspec(in_rspec) + # just copy over all networks current_networks = self.get_networks() rspec = SfaRSpec(rspec=in_rspec) @@ -326,6 +332,7 @@ class SfaRSpec(RSpec): if not current_network in current_networks: self.xml.append(network) current_networks.append(current_network) + -- 2.47.0