3 from __future__ import print_function
5 from sfa.util.xrn import hrn_to_urn
6 from sfa.rspecs.rspec import RSpec
7 from sfa.rspecs.version_manager import VersionManager
10 class SfaRSpecConverter:
13 def to_pg_rspec(rspec, content_type=None):
14 if not isinstance(rspec, RSpec):
15 sfa_rspec = RSpec(rspec)
19 if not content_type or content_type not in \
20 ['ad', 'request', 'manifest']:
21 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(
34 for sfa_node_element in sfa_node_elements:
37 node_attrs['exclusive'] = 'false'
38 if 'component_manager_id' in sfa_node_element.attrib:
39 node_attrs['component_manager_id'] = sfa_node_element.attrib[
40 'component_manager_id']
42 node_attrs['component_manager_id'] = hrn_to_urn(
43 network, 'authority+cm')
45 if 'component_id' in sfa_node_element.attrib:
46 node_attrs['compoenent_id'] = sfa_node_element.attrib[
49 if sfa_node_element.find('hostname') != None:
50 hostname = sfa_node_element.find('hostname').text
51 node_attrs['component_name'] = hostname
52 node_attrs['client_id'] = hostname
53 node_element = pg_rspec.xml.add_element('node', node_attrs)
55 if content_type == 'request':
56 sliver_element = sfa_node_element.find('sliver')
57 sliver_type_elements = sfa_node_element.xpath(
58 './sliver_type', namespaces=sfa_rspec.namespaces)
59 available_sliver_types = [element.attrib[
60 'name'] for element in sliver_type_elements]
61 valid_sliver_types = ['emulab-openvz', 'raw-pc']
63 # determine sliver type
64 requested_sliver_type = 'emulab-openvz'
65 for available_sliver_type in available_sliver_types:
66 if available_sliver_type in valid_sliver_types:
67 requested_sliver_type = available_sliver_type
69 if sliver_element != None:
70 pg_rspec.xml.add_element(
71 'sliver_type', {'name': requested_sliver_type}, parent=node_element)
73 # create node_type element
74 for hw_type in ['plab-pc', 'pc']:
75 hdware_type_element = pg_rspec.xml.add_element(
76 'hardware_type', {'name': hw_type}, parent=node_element)
77 # create available element
78 pg_rspec.xml.add_element(
79 'available', {'now': 'true'}, parent=node_element)
80 # create locaiton element
81 # We don't actually associate nodes with a country.
82 # Set country to "unknown" until we figure out how to make
83 # sure this value is always accurate.
84 location = sfa_node_element.find('location')
87 location_attrs['country'] = location.get(
89 location_attrs['latitude'] = location.get(
91 location_attrs['longitude'] = location.get(
93 pg_rspec.xml.add_element(
94 'location', location_attrs, parent=node_element)
96 return pg_rspec.toxml()
98 if __name__ == '__main__':
100 if len(sys.argv) > 1:
101 print(SfaRSpecConverter.to_pg_rspec(sys.argv[1]))