trimmed useless imports, unstarred all imports
[sfa.git] / sfa / rspecs / sfa_rspec_converter.py
1 #!/usr/bin/python
2
3 from sfa.util.xrn import hrn_to_urn
4 from sfa.rspecs.rspec import RSpec
5 from sfa.rspecs.version_manager import VersionManager
6
7 class SfaRSpecConverter:
8
9     @staticmethod
10     def to_pg_rspec(rspec, content_type = None):
11         if not isinstance(rspec, RSpec):
12             sfa_rspec = RSpec(rspec)
13         else:
14             sfa_rspec = rspec
15   
16         if not content_type or content_type not in \
17           ['ad', 'request', 'manifest']:
18             content_type = sfa_rspec.version.content_type
19      
20  
21         version_manager = VersionManager()
22         pg_version = version_manager._get_version('protogeni', '2', 'request')
23         pg_rspec = RSpec(version=pg_version)
24  
25         # get networks
26         networks = sfa_rspec.version.get_networks()
27         
28         for network in networks:
29             # get nodes
30             sfa_node_elements = sfa_rspec.version.get_node_elements(network=network)
31             for sfa_node_element in sfa_node_elements:
32                 # create node element
33                 node_attrs = {}
34                 node_attrs['exclusive'] = 'false'
35                 if 'component_manager_id' in sfa_node_element.attrib:
36                     node_attrs['component_manager_id'] = sfa_node_element.attrib['component_manager_id']
37                 else:
38                     node_attrs['component_manager_id'] = hrn_to_urn(network, 'authority+cm')
39
40                 if 'component_id' in sfa_node_element.attrib:
41                     node_attrs['compoenent_id'] = sfa_node_element.attrib['component_id']
42
43                 if sfa_node_element.find('hostname') != None:
44                     hostname = sfa_node_element.find('hostname').text
45                     node_attrs['component_name'] = hostname
46                     node_attrs['client_id'] = hostname
47                 node_element = pg_rspec.xml.add_element('node', node_attrs)    
48             
49                 if content_type == 'request':
50                     sliver_element = sfa_node_element.find('sliver')
51                     sliver_type_elements = sfa_node_element.xpath('./sliver_type', namespaces=sfa_rspec.namespaces)
52                     available_sliver_types = [element.attrib['name'] for element in sliver_type_elements]
53                     valid_sliver_types = ['emulab-openvz', 'raw-pc']
54                    
55                     # determine sliver type 
56                     requested_sliver_type = 'emulab-openvz'
57                     for available_sliver_type in available_sliver_types:
58                         if available_sliver_type in valid_sliver_types:
59                             requested_sliver_type = available_sliver_type
60                                 
61                     if sliver_element != None:
62                         pg_rspec.xml.add_element('sliver_type', {'name': requested_sliver_type}, parent=node_element) 
63                 else:
64                     # create node_type element
65                     for hw_type in ['plab-pc', 'pc']:
66                         hdware_type_element = pg_rspec.xml.add_element('hardware_type', {'name': hw_type}, parent=node_element)
67                     # create available element
68                     pg_rspec.xml.add_element('available', {'now': 'true'}, parent=node_element)
69                     # create locaiton element
70                     # We don't actually associate nodes with a country. 
71                     # Set country to "unknown" until we figure out how to make
72                     # sure this value is always accurate.
73                     location = sfa_node_element.find('location')
74                     if location != None:
75                         location_attrs = {}      
76                         location_attrs['country'] =  location.get('country', 'unknown')
77                         location_attrs['latitude'] = location.get('latitude', 'None')
78                         location_attrs['longitude'] = location.get('longitude', 'None')
79                         pg_rspec.xml.add_element('location', location_attrs, parent=node_element)
80
81         return pg_rspec.toxml()
82
83 if __name__ == '__main__':
84     import sys
85     if len(sys.argv) > 1:    
86         print SfaRSpecConverter.to_pg_rspec(sys.argv[1])