4 from StringIO import StringIO
5 from sfa.util.xrn import *
6 from sfa.rspecs.rspec import RSpec
7 from sfa.rspecs.version_manager import VersionManager
9 class SfaRSpecConverter:
12 def to_pg_rspec(rspec, content_type = None):
13 if not isinstance(rspec, RSpec):
14 sfa_rspec = RSpec(rspec)
18 if not content_type or content_type not in \
19 ['ad', 'request', 'manifest']:
20 content_type = sfa_rspec.version.content_type
23 version_manager = VersionManager()
24 pg_version = version_manager._get_version('protogeni', '2', 'request')
25 pg_rspec = RSpec(version=pg_version)
28 networks = sfa_rspec.version.get_networks()
30 for network in networks:
32 sfa_node_elements = sfa_rspec.version.get_node_elements(network=network)
33 for sfa_node_element in sfa_node_elements:
36 node_attrs['exclusive'] = 'false'
37 if 'component_manager_id' in sfa_node_element.attrib:
38 component_manager_id = sfa_node_element.attrib['component_manager_id']
40 component_manager_id = hrn_to_urn(network, 'authority+cm')
41 node_attrs['component_manager_id'] = component_manager_id
42 if sfa_node_element.find('hostname') != None:
43 node_attrs['component_name'] = sfa_node_element.find('hostname').text
44 if sfa_node_element.find('urn') != None:
45 node_attrs['component_id'] = sfa_node_element.find('urn').text
46 node_element = pg_rspec.xml.add_element('node', node_attrs)
48 if content_type == 'request':
49 sliver_element = sfa_node_element.find('sliver')
50 if sliver_element != None:
51 pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element)
53 # create node_type element
54 for hw_type in ['plab-pc', 'pc']:
55 hdware_type_element = pg_rspec.xml.add_element('hardware_type', {'name': hw_type}, parent=node_element)
56 # create available element
57 pg_rspec.xml.add_element('available', {'now': 'true'}, parent=node_element)
58 # create locaiton element
59 # We don't actually associate nodes with a country.
60 # Set country to "unknown" until we figure out how to make
61 # sure this value is always accurate.
62 location = sfa_node_element.find('location')
65 location_attrs['country'] = location.get('country', 'unknown')
66 location_attrs['latitude'] = location.get('latitiue', 'None')
67 location_attrs['longitude'] = location.get('longitude', 'None')
68 pg_rspec.xml.add_element('location', location_attrs, parent=node_element)
70 sliver_element = sfa_node_element.find('sliver')
71 if sliver_element != None:
72 if content_type == 'request':
73 # remove all child elements
74 for child in sfa_node_element.iterchildren():
75 sfa_node_element.remove(child)
77 pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element)
79 return pg_rspec.toxml()
81 if __name__ == '__main__':
84 print SfaRSpecConverter.to_pg_rspec(sys.argv[1])