PGv2 and GENIv3 Rspec: handle PL initscript and attribute exceptions
[sfa.git] / sfa / rspecs / sfa_rspec_converter.py
index 29581e2..7bcc787 100755 (executable)
@@ -1,8 +1,6 @@
 #!/usr/bin/python
 
-from lxml import etree
-from StringIO import StringIO
-from sfa.util.xrn import *
+from sfa.util.xrn import hrn_to_urn
 from sfa.rspecs.rspec import RSpec
 from sfa.rspecs.version_manager import VersionManager
 
@@ -35,20 +33,33 @@ class SfaRSpecConverter:
                 node_attrs = {}
                 node_attrs['exclusive'] = 'false'
                 if 'component_manager_id' in sfa_node_element.attrib:
-                    component_manager_id = sfa_node_element.attrib['component_manager_id']
+                    node_attrs['component_manager_id'] = sfa_node_element.attrib['component_manager_id']
                 else:
-                    component_manager_id = hrn_to_urn(network, 'authority+cm')
-                node_attrs['component_manager_id'] = component_manager_id
+                    node_attrs['component_manager_id'] = hrn_to_urn(network, 'authority+cm')
+
+                if 'component_id' in sfa_node_element.attrib:
+                    node_attrs['compoenent_id'] = sfa_node_element.attrib['component_id']
+
                 if sfa_node_element.find('hostname') != None:
-                    node_attrs['component_name'] = sfa_node_element.find('hostname').text
-                if sfa_node_element.find('urn') != None:
-                    node_attrs['component_id'] = sfa_node_element.find('urn').text
+                    hostname = sfa_node_element.find('hostname').text
+                    node_attrs['component_name'] = hostname
+                    node_attrs['client_id'] = hostname
                 node_element = pg_rspec.xml.add_element('node', node_attrs)    
             
                 if content_type == 'request':
                     sliver_element = sfa_node_element.find('sliver')
+                    sliver_type_elements = sfa_node_element.xpath('./sliver_type', namespaces=sfa_rspec.namespaces)
+                    available_sliver_types = [element.attrib['name'] for element in sliver_type_elements]
+                    valid_sliver_types = ['emulab-openvz', 'raw-pc']
+                   
+                    # determine sliver type 
+                    requested_sliver_type = 'emulab-openvz'
+                    for available_sliver_type in available_sliver_types:
+                        if available_sliver_type in valid_sliver_types:
+                            requested_sliver_type = available_sliver_type
+                                
                     if sliver_element != None:
-                        pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element) 
+                        pg_rspec.xml.add_element('sliver_type', {'name': requested_sliver_type}, parent=node_element) 
                 else:
                     # create node_type element
                     for hw_type in ['plab-pc', 'pc']:
@@ -67,15 +78,6 @@ class SfaRSpecConverter:
                         location_attrs['longitude'] = location.get('longitude', 'None')
                         pg_rspec.xml.add_element('location', location_attrs, parent=node_element)
 
-                    sliver_element = sfa_node_element.find('sliver')
-                    if sliver_element != None:
-                        if content_type == 'request':  
-                            # remove all child elements
-                            for child in sfa_node_element.iterchildren():
-                                sfa_node_element.remove(child)
-                        # add the sliver    
-                        pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element)
-
         return pg_rspec.toxml()
 
 if __name__ == '__main__':