Merge branch 'upstreammaster'
[sfa.git] / sfa / rspecs / versions / pgv2.py
index ceff971..b52b5f0 100644 (file)
@@ -1,6 +1,6 @@
 from copy import deepcopy
 from StringIO import StringIO
-from sfa.util.xrn import urn_to_sliver_id
+from sfa.util.xrn import Xrn, urn_to_sliver_id
 from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname 
 from sfa.rspecs.baseversion import BaseVersion
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
@@ -19,19 +19,23 @@ class PGv2(BaseVersion):
     }
     namespaces = dict(extensions.items() + [('default', namespace)])
 
-    # Networks    
-    def get_network(self):
-        network = None
-        nodes = self.xml.xpath('//default:node[@component_manager_id][1]', namespaces=self.namespaces)
-        if nodes:
-            network  = nodes[0].get('component_manager_id')
-        return network
-
+    # Networks
     def get_networks(self):
-        networks = self.xml.xpath('//default:node[@component_manager_id]/@component_manager_id', namespaces=self.namespaces)
-        return set(networks)
+        network_names = set()
+        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.attrib:
+                network_urn = node.get('component_manager_id')
+                if network_urn.startswith("urn:"):
+                    network_hrn = Xrn(network_urn).get_hrn()[0]
+                else:
+                    # some component_manager_ids are hrns instead of urns??
+                    network_hrn = network_urn
+                network_names.add(network_hrn)
+        network_names = list(network_names)
+        networks = [{"name": x} for x in network_names]
+        return networks
 
-    
     # Nodes
 
     def get_nodes(self, filter=None):
@@ -169,12 +173,24 @@ class PGv2(BaseVersion):
         """
         from sfa.rspecs.rspec import RSpec
         # just copy over all the child elements under the root element
-        if isinstance(in_rspec, RSpec):
-            in_rspec = in_rspec.toxml()
+        if isinstance(in_rspec, basestring):
+            in_rspec = RSpec(in_rspec)
+
+        nodes = in_rspec.version.get_nodes()
+        # protogeni rspecs need to advertise the availabel sliver types
+        for node in nodes:
+            if not node.has_key('sliver') or not node['sliver']:
+                node['sliver'] = {'name': 'plab-vserver'}
+            
+        self.add_nodes(nodes)
+        self.add_links(in_rspec.version.get_links())
+        
+        #
+        #rspec = RSpec(in_rspec)
+        #for child in rspec.xml.iterchildren():
+        #    self.xml.root.append(child)
+        
         
-        rspec = RSpec(in_rspec)
-        for child in rspec.xml.iterchildren():
-            self.xml.root.append(child)
 
     def cleanup(self):
         # remove unncecessary elements, attributes