properly merge ProtoGENI v2 rspec with SFA rspec
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 11 Jul 2011 23:33:28 +0000 (19:33 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 11 Jul 2011 23:33:28 +0000 (19:33 -0400)
sfa/managers/slice_manager_pl.py
sfa/rspecs/pg_rspec.py
sfa/rspecs/pg_rspec_converter.py
sfa/rspecs/rspec_converter.py
sfa/rspecs/rspec_parser.py
sfa/rspecs/sfa_rspec.py

index ac68706..f23d4d8 100644 (file)
@@ -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:
index 82d2d8b..a55fe10 100755 (executable)
@@ -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):
index e9a34eb..586c02b 100755 (executable)
@@ -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]
index 89f03a4..6f96d4f 100755 (executable)
@@ -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):
index 8e3bced..b29329b 100755 (executable)
@@ -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
 
index 57c626b..16fa3e8 100755 (executable)
@@ -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)
+