use sfa.client.return_value.ReturnValue to parse aggregate return values
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 28 Nov 2011 01:25:17 +0000 (20:25 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 28 Nov 2011 01:25:17 +0000 (20:25 -0500)
sfa/client/sfi.py
sfa/managers/slice_manager.py
sfa/rspecs/elements/versions/pgv2Link.py
sfa/rspecs/elements/versions/sfav1Node.py
sfa/rspecs/elements/versions/sfav1Sliver.py
sfa/rspecs/pg_rspec_converter.py
sfa/rspecs/versions/pgv2.py
sfa/server/sfaapi.py
sfa/util/config.py

index 9ed3c84..f89c5e0 100755 (executable)
@@ -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):
index 7c58a68..36d5183 100644 (file)
@@ -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)
index 65513d0..44317be 100644 (file)
@@ -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'])            
  
index 26d41a9..bf09305 100644 (file)
@@ -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 
index d1519e9..207a4a7 100644 (file)
@@ -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(':')
index 1c57d7d..5cccf97 100755 (executable)
@@ -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())
index 60387dc..b336f3d 100644 (file)
@@ -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')
index 845ccff..faf62af 100644 (file)
@@ -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)
 
index 56b3021..693bbc2 100644 (file)
@@ -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: