python3 - 2to3 + miscell obvious tweaks
[sfa.git] / sfa / rspecs / sfa_rspec_converter.py
1 #!/usr/bin/env python3
2
3
4
5 from sfa.util.xrn import hrn_to_urn
6 from sfa.rspecs.rspec import RSpec
7 from sfa.rspecs.version_manager import VersionManager
8
9
10 class SfaRSpecConverter:
11
12     @staticmethod
13     def to_pg_rspec(rspec, content_type=None):
14         if not isinstance(rspec, RSpec):
15             sfa_rspec = RSpec(rspec)
16         else:
17             sfa_rspec = rspec
18
19         if not content_type or content_type not in \
20                 ['ad', 'request', 'manifest']:
21             content_type = sfa_rspec.version.content_type
22
23         version_manager = VersionManager()
24         pg_version = version_manager._get_version('protogeni', '2', 'request')
25         pg_rspec = RSpec(version=pg_version)
26
27         # get networks
28         networks = sfa_rspec.version.get_networks()
29
30         for network in networks:
31             # get nodes
32             sfa_node_elements = sfa_rspec.version.get_node_elements(
33                 network=network)
34             for sfa_node_element in sfa_node_elements:
35                 # create node element
36                 node_attrs = {}
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']
41                 else:
42                     node_attrs['component_manager_id'] = hrn_to_urn(
43                         network, 'authority+cm')
44
45                 if 'component_id' in sfa_node_element.attrib:
46                     node_attrs['compoenent_id'] = sfa_node_element.attrib[
47                         'component_id']
48
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)
54
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']
62
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
68
69                     if sliver_element != None:
70                         pg_rspec.xml.add_element(
71                             'sliver_type', {'name': requested_sliver_type}, parent=node_element)
72                 else:
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')
85                     if location != None:
86                         location_attrs = {}
87                         location_attrs['country'] = location.get(
88                             'country', 'unknown')
89                         location_attrs['latitude'] = location.get(
90                             'latitude', 'None')
91                         location_attrs['longitude'] = location.get(
92                             'longitude', 'None')
93                         pg_rspec.xml.add_element(
94                             'location', location_attrs, parent=node_element)
95
96         return pg_rspec.toxml()
97
98 if __name__ == '__main__':
99     import sys
100     if len(sys.argv) > 1:
101         print(SfaRSpecConverter.to_pg_rspec(sys.argv[1]))