From 5daf08641a6363cb0c05d3c92cdf2bf95dd09366 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Sun, 27 Nov 2011 20:25:17 -0500 Subject: [PATCH] use sfa.client.return_value.ReturnValue to parse aggregate return values --- sfa/client/sfi.py | 34 +++++++++++++-------- sfa/managers/slice_manager.py | 19 ++++++------ sfa/rspecs/elements/versions/pgv2Link.py | 19 ++++++------ sfa/rspecs/elements/versions/sfav1Node.py | 8 +++-- sfa/rspecs/elements/versions/sfav1Sliver.py | 6 ++-- sfa/rspecs/pg_rspec_converter.py | 23 ++++++++------ sfa/rspecs/versions/pgv2.py | 2 +- sfa/server/sfaapi.py | 12 +++++--- sfa/util/config.py | 3 ++ 9 files changed, 75 insertions(+), 51 deletions(-) diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 9ed3c848..f89c5e05 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -28,6 +28,7 @@ from sfa.util.config import Config from sfa.util.version import version_core from sfa.util.cache import Cache from sfa.rspecs.version_manager import VersionManager +from sfa.client.return_value import ReturnValue AGGREGATE_PORT=12346 CM_PORT=12346 @@ -419,13 +420,13 @@ class Sfi: version = cache.get(cache_key) if not version: - version = server.GetVersion() + result = server.GetVersion() + version= ReturnValue.get_value(result) # cache version for 24 hours cache.add(cache_key, version, ttl= 60*60*24) self.logger.info("Updating cache file %s" % cache_file) cache.save_to_file(cache_file) - return version @@ -912,7 +913,8 @@ class Sfi: server=self.registry else: server = self.server_proxy_from_opts(opts) - version=server.GetVersion() + result = server.GetVersion() + version = ReturnValue.get_value(result) for (k,v) in version.iteritems(): print "%-20s: %s"%(k,v) if opts.file: @@ -933,8 +935,9 @@ class Sfi: if self.server_supports_options_arg(server): options = {'call_id': unique_call_id()} call_args.append(options) - results = server.ListSlices(*call_args) - display_list(results) + result = server.ListSlices(*call_args) + value = ReturnValue.get_value(result) + display_list(value) return # show rspec for named slice @@ -972,10 +975,11 @@ class Sfi: call_args = [creds, options] result = server.ListResources(*call_args) + value = ReturnValue.get_value(result) if opts.file is None: - display_rspec(result, opts.format) + display_rspec(value, opts.format) else: - save_rspec_to_file(result, opts.file) + save_rspec_to_file(value, opts.file) return # created named slice with given rspec @@ -1027,11 +1031,12 @@ class Sfi: options = {'call_id': unique_call_id()} call_args.append(options) result = server.CreateSliver(*call_args) + value = ReturnValue.get_value(result) if opts.file is None: - print result + print value else: - save_rspec_to_file (result, opts.file) - return result + save_rspec_to_file (value, opts.file) + return value # get a ticket for the specified slice def get_ticket(self, opts, args): @@ -1153,7 +1158,9 @@ class Sfi: if self.server_supports_options_arg(server): options = {'call_id': unique_call_id()} call_args.append(options) - return server.RenewSliver(*call_args) + result = server.RenewSliver(*call_args) + value = ReturnValue.get_value(result) + return value def status(self, opts, args): @@ -1170,9 +1177,10 @@ class Sfi: options = {'call_id': unique_call_id()} call_args.append(options) result = server.SliverStatus(*call_args) - print result + value = ReturnValue.get_value(result) + print value if opts.file: - save_variable_to_file(result, opts.file, opts.fileformat) + save_variable_to_file(value, opts.file, opts.fileformat) def shutdown(self, opts, args): diff --git a/sfa/managers/slice_manager.py b/sfa/managers/slice_manager.py index 7c58a688..36d5183f 100644 --- a/sfa/managers/slice_manager.py +++ b/sfa/managers/slice_manager.py @@ -12,20 +12,18 @@ from sfa.util.sfalogging import logger from sfa.util.xrn import Xrn, urn_to_hrn from sfa.util.version import version_core from sfa.util.callids import Callids - from sfa.server.threadmanager import ThreadManager - from sfa.rspecs.rspec_converter import RSpecConverter from sfa.rspecs.version_manager import VersionManager from sfa.rspecs.rspec import RSpec from sfa.client.client_helper import sfa_to_pg_users_arg +from sfa.client.return_value import ReturnValue class SliceManager: def __init__ (self): # self.caching=False self.caching=True - def _options_supported(self, api, server): """ Returns true if server support the optional call_id arg, false otherwise. @@ -124,7 +122,9 @@ class SliceManager: try: version = api.get_cached_server_version(server) # force ProtoGENI aggregates to give us a v2 RSpec - if 'sfa' not in version.keys(): + if 'sfa' in version.keys(): + my_opts['rspec_version'] = version_manager.get_version('SFA 1').to_dict() + else: my_opts['rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict() rspec = server.ListResources(*args) return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"} @@ -182,7 +182,7 @@ class SliceManager: self.add_slicemgr_stat(rspec, "ListResources", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None)) if result["status"]=="success": try: - rspec.version.merge(result["rspec"]) + rspec.version.merge(ReturnValue.get_value(result["rspec"])) except: api.logger.log_exc("SM.ListResources: Failed to merge aggregate rspec") @@ -261,7 +261,7 @@ class SliceManager: self.add_slicemgr_stat(result_rspec, "CreateSliver", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None)) if result["status"]=="success": try: - result_rspec.version.merge(result["rspec"]) + result_rspec.version.merge(ReturnValue.get_value(rresult["rspec"])) except: api.logger.log_exc("SM.CreateSliver: Failed to merge aggregate rspec") return result_rspec.toxml() @@ -296,7 +296,8 @@ class SliceManager: server = api.server_proxy(interface, cred) threads.run(_RenewSliver, server, xrn, [cred], expiration_time, call_id) # 'and' the results - return reduce (lambda x,y: x and y, threads.get_results() , True) + results = [ReturnValue.get_value(result) for result in threads.get_results()] + return reduce (lambda x,y: x and y, results , True) def DeleteSliver(self, api, xrn, creds, options={}): def _DeleteSliver(server, xrn, creds, options={}): @@ -350,7 +351,7 @@ class SliceManager: interface = api.aggregates[aggregate] server = api.server_proxy(interface, cred) threads.run (_SliverStatus, server, slice_xrn, [cred], call_id) - results = threads.get_results() + 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 {} results = [ result for result in results if result and result['geni_resources']] @@ -410,7 +411,7 @@ class SliceManager: threads.run(_ListSlices, server, [cred], options) # combime results - results = threads.get_results() + results = [ReturnValue.get_value(result) for result in threads.get_results()] slices = [] for result in results: slices.extend(result) diff --git a/sfa/rspecs/elements/versions/pgv2Link.py b/sfa/rspecs/elements/versions/pgv2Link.py index 65513d0f..44317be2 100644 --- a/sfa/rspecs/elements/versions/pgv2Link.py +++ b/sfa/rspecs/elements/versions/pgv2Link.py @@ -15,15 +15,16 @@ class PGv2Link: if 'component_manager' in link and link['component_manager']: cm_element = link_elem.add_element('component_manager', name=link['component_manager']) # set interface_ref elements - for if_ref in [link['interface1'], link['interface2']]: - link_elem.add_instance('interface_ref', if_ref, Interface.fields) - # set property elements - prop1 = link_elem.add_element('property', source_id = link['interface1']['component_id'], - dest_id = link['interface2']['component_id'], capacity=link['capacity'], - latency=link['latency'], packet_loss=link['packet_loss']) - prop2 = link_elem.add_element('property', source_id = link['interface2']['component_id'], - dest_id = link['interface1']['component_id'], capacity=link['capacity'], - latency=link['latency'], packet_loss=link['packet_loss']) + if link.get('interface1') and link.get('interface2'): + for if_ref in [link['interface1'], link['interface2']]: + link_elem.add_instance('interface_ref', if_ref, Interface.fields) + # set property elements + prop1 = link_elem.add_element('property', source_id = link['interface1']['component_id'], + dest_id = link['interface2']['component_id'], capacity=link['capacity'], + latency=link['latency'], packet_loss=link['packet_loss']) + prop2 = link_elem.add_element('property', source_id = link['interface2']['component_id'], + dest_id = link['interface1']['component_id'], capacity=link['capacity'], + latency=link['latency'], packet_loss=link['packet_loss']) if link.get('type'): type_elem = link_elem.add_element('link_type', name=link['type']) diff --git a/sfa/rspecs/elements/versions/sfav1Node.py b/sfa/rspecs/elements/versions/sfav1Node.py index 26d41a97..bf093059 100644 --- a/sfa/rspecs/elements/versions/sfav1Node.py +++ b/sfa/rspecs/elements/versions/sfav1Node.py @@ -62,9 +62,11 @@ class SFAv1Node: # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) PGv2Services.add_services(node_elem, node.get('services', [])) - for tag in node.get('tags', []): - tag_elem = node_elem.add_element(tag['tagname']) - tag_elem.set_text(tag['value']) + tags = node.get('tags', []) + if tags: + for tag in tags: + tag_elem = node_elem.add_element(tag['tagname']) + tag_elem.set_text(tag['value']) SFAv1Sliver.add_slivers(node_elem, node.get('slivers', [])) @staticmethod diff --git a/sfa/rspecs/elements/versions/sfav1Sliver.py b/sfa/rspecs/elements/versions/sfav1Sliver.py index d1519e9f..207a4a78 100644 --- a/sfa/rspecs/elements/versions/sfav1Sliver.py +++ b/sfa/rspecs/elements/versions/sfav1Sliver.py @@ -14,8 +14,10 @@ class SFAv1Sliver: slivers = [slivers] for sliver in slivers: sliver_elem = xml.add_instance('sliver', sliver, ['name']) - for tag in sliver.get('tags', []): - SFAv1Sliver.add_sliver_attribute(sliver_elem, tag['tagname'], tag['value']) + tags = sliver.get('tags', []) + if tags: + for tag in tags: + SFAv1Sliver.add_sliver_attribute(sliver_elem, tag['tagname'], tag['value']) if sliver.get('sliver_id'): sliver_id_leaf = Xrn(sliver.get('sliver_id')).get_leaf() sliver_id_parts = sliver_id_leaf.split(':') diff --git a/sfa/rspecs/pg_rspec_converter.py b/sfa/rspecs/pg_rspec_converter.py index 1c57d7da..5cccf972 100755 --- a/sfa/rspecs/pg_rspec_converter.py +++ b/sfa/rspecs/pg_rspec_converter.py @@ -44,10 +44,15 @@ class PGRSpecConverter: sfa_version = version_manager._get_version('sfa', '1') sfa_rspec = RSpec(version=sfa_version) + #nodes = pg_rspec.version.get_nodes() + #sfa_rspec.version.add_nodes(nodes()) + #sfa_rspec.version.add_links(pg_rspec.version.get_links()) + #return sfa_rspec.toxml() + # get network - network_urn = pg_rspec.version.get_network() - network, _ = urn_to_hrn(network_urn) - network_element = sfa_rspec.xml.add_element('network', {'name': network, 'id': network}) + networks = pg_rspec.version.get_networks() + network_hrn = networks[0] + network_element = sfa_rspec.xml.add_element('network', name=network_hrn, id=network_hrn) # get nodes pg_nodes_elements = pg_rspec.version.get_node_elements() @@ -57,18 +62,18 @@ class PGRSpecConverter: attribs = dict(pg_node_element.attrib.items()) attribs['id'] = 'n'+str(i) - node_element = sfa_rspec.xml.add_element('node', attribs, parent=network_element) + node_element = network_element.add_element('node') + for attrib in attribs: + node_element.set(attrib, attribs[attrib]) urn = pg_node_element.xpath('@component_id', namespaces=pg_rspec.namespaces) if urn: urn = urn[0] hostname = Xrn.urn_split(urn)[-1] - hostname_element = sfa_rspec.xml.add_element('hostname', parent=node_element, text=hostname) + hostname_element = node_element.add_element('hostname') + hostname_element.set_text(hostname) if hostname in nodes_with_slivers: - sfa_rspec.xml.add_element('sliver', parent=node_element) + node_element.add_element('sliver') - urn_element = sfa_rspec.xml.add_element('urn', parent=node_element, text=urn) - - # just copy over remaining child elements for child in pg_node_element.getchildren(): node_element.append(transform(child).getroot()) diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index 60387dcc..b336f3d8 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -22,7 +22,7 @@ class PGv2(BaseVersion): # Networks def get_networks(self): networks = set() - nodes = self.xml.xpath('//default:node[@component_manager_id]', namespaces=self.namespaces) + nodes = self.xml.xpath('//default:node[@component_manager_id] | //node:[@component_manager_id]', namespaces=self.namespaces) for node in nodes: if 'component_manager_id' in node: network_urn = node.get('component_manager_id') diff --git a/sfa/server/sfaapi.py b/sfa/server/sfaapi.py index 845ccffe..faf62afd 100644 --- a/sfa/server/sfaapi.py +++ b/sfa/server/sfaapi.py @@ -1,7 +1,7 @@ import os, os.path import datetime -from sfa.util.faults import SfaAPIError +from sfa.util.faults import SfaFault, SfaAPIError from sfa.util.config import Config from sfa.util.cache import Cache from sfa.trust.auth import Auth @@ -10,6 +10,7 @@ from sfa.trust.credential import Credential from sfa.trust.rights import determine_rights from sfa.server.xmlrpcapi import XmlrpcApi from sfa.util.genicode import GENICODE +from sfa.client.return_value import ReturnValue # thgen xxx fixme this is wrong all right, but temporary, will use generic from sfa.util.table import SfaTable @@ -201,7 +202,8 @@ class SfaApi (XmlrpcApi): if self.cache: server_version = self.cache.get(cache_key) if not server_version: - server_version = server.GetVersion() + result = server.GetVersion() + server_version = ReturnValue.get_value(result) # cache version for 24 hours self.cache.add(cache_key, server_version, ttl= 60*60*24) return server_version @@ -213,7 +215,7 @@ class SfaApi (XmlrpcApi): 'am_type': 'sfa', 'am_code': None, } - if isinstnace(result, SfaFault): + if isinstance(result, SfaFault): code['geni_code'] = result.faultCode code['am_code'] = result.faultCode @@ -227,7 +229,7 @@ class SfaApi (XmlrpcApi): def get_geni_output(self, result): output = "" - if isinstance(result, SFaFault): + if isinstance(result, SfaFault): output = result.faultString return output @@ -246,7 +248,7 @@ class SfaApi (XmlrpcApi): """ if self.interface.lower() == 'aggregate': if hasattr(self.config, 'SFA_AGGREGATE_API_VERSION') and \ - self.config.SFA_AGGREGATE_API_VERSION == "2": + self.config.SFA_AGGREGATE_API_VERSION == 2: result = self.prepare_response_v2_am(result) return XmlrpcApi.prepare_response(self, result, method) diff --git a/sfa/util/config.py b/sfa/util/config.py index 56b30215..693bbc2f 100644 --- a/sfa/util/config.py +++ b/sfa/util/config.py @@ -69,6 +69,9 @@ class Config: if not hasattr(self, 'SFA_MAX_SLICE_RENEW'): self.SFA_MAX_SLICE_RENEW=60 + if not hasattr(self, 'SFA_AGGREGATE_API_VERSION'): + self.SFA_AGGREGATE_API_VERSION=1 + # create the data directory if it doesnt exist if not os.path.isdir(self.SFA_DATA_DIR): try: -- 2.43.0