typo
[sfa.git] / sfa / rspecs / sfa_rspec_converter.py
1 #!/usr/bin/python
2
3 from lxml import etree
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
8
9 class SfaRSpecConverter:
10
11     @staticmethod
12     def to_pg_rspec(rspec, content_type = None):
13         if not isinstance(rspec, RSpec):
14             sfa_rspec = RSpec(rspec)
15         else:
16             sfa_rspec = rspec
17   
18         if not content_type or content_type not in \
19           ['ad', 'request', 'manifest']:
20             content_type = sfa_rspec.version.content_type
21      
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(network=network)
33             for sfa_node_element in sfa_node_elements:
34                 # create node element
35                 node_attrs = {}
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']
39                 else:
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)    
47             
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) 
52                 else:
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')
63                     if location != None:
64                         location_attrs = {}      
65                         location_attrs['country'] =  location.get('country', 'unknown')
66                         location_attrs['latitude'] = location.get('latitude', 'None')
67                         location_attrs['longitude'] = location.get('longitude', 'None')
68                         pg_rspec.xml.add_element('location', location_attrs, parent=node_element)
69
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)
76                         # add the sliver    
77                         pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element)
78
79         return pg_rspec.toxml()
80
81 if __name__ == '__main__':
82     import sys
83     if len(sys.argv) > 1:    
84         print SfaRSpecConverter.to_pg_rspec(sys.argv[1])