fix pg ad rspec schema validation errors
[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.sfa_rspec import SfaRSpec
7 from sfa.rspecs.pg_rspec import PGRSpec
8
9 class SfaRSpecConverter:
10
11     @staticmethod
12     def to_pg_rspec(rspec):
13         if isinstance(rspec, SfaRSpec):
14             sfa_rspec = rspec
15         else:
16             sfa_rspec = SfaRSpec(rspec=rspec)
17         pg_rspec = PGRSpec()
18     
19         # get networks
20         networks = sfa_rspec.get_networks()
21         
22         for network in networks:
23             # get nodes
24             sfa_node_elements = sfa_rspec.get_node_elements(network=network)
25             for sfa_node_element in sfa_node_elements:
26                 # create node element
27                 node_attrs = {}
28                 node_attrs['exclusive'] = 'false'
29                 node_attrs['component_manager_id'] = network
30                 if sfa_node_element.find('hostname') != None:
31                     node_attrs['component_name'] = sfa_node_element.find('hostname').text
32                 if sfa_node_element.find('urn') != None:    
33                     node_attrs['component_id'] = sfa_node_element.find('urn').text
34                 node_element = pg_rspec.add_element('node', node_attrs)
35
36                 # create node_type element
37                 for hw_type in ['plab-pc', 'pc']:
38                     hdware_type_element = pg_rspec.add_element('hardware_type', {'name': hw_type}, parent=node_element)
39                 # create available element
40                 pg_rspec.add_element('available', {'now': 'true'}, parent=node_element)
41                 # create locaiton element
42                 # We don't actually associate nodes with a country. 
43                 # Set country to "unknown" until we figure out how to make
44                 # sure this value is always accurate.
45                 location = sfa_node_element.find('location')
46                 if location != None:
47                     location_attrs = {}      
48                     location_attrs['country'] = locatiton.get('country', 'unknown')
49                     location_attrs['latitude'] = location.get('latitiue', 'None')
50                     location_attrs['longitude'] = location.get('longitude', 'None')
51                     pg_rspec.add_element('location', location_attrs, parent=node_element)
52
53                 sliver_element = sfa_node_element.find('sliver')
54                 if sliver_element != None:
55                     pg_rspec.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element)
56
57         return pg_rspec.toxml()
58
59 if __name__ == '__main__':
60     import sys
61     if len(sys.argv) > 1:    
62         print SfaRSpecConverter.to_pg_rspec(sys.argv[1])