2to3 -f print
[sfa.git] / sfa / rspecs / pg_rspec_converter.py
1 #!/usr/bin/python 
2 from __future__ import print_function
3
4 from lxml import etree
5 from StringIO import StringIO
6 from sfa.util.xrn import Xrn, urn_to_hrn
7 from sfa.rspecs.rspec import RSpec
8 from sfa.rspecs.version_manager import VersionManager
9
10 xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
11 <xsl:output method="xml" indent="no"/>
12
13 <xsl:template match="/|comment()|processing-instruction()">
14     <xsl:copy>
15       <xsl:apply-templates/>
16     </xsl:copy>
17 </xsl:template>
18
19 <xsl:template match="*">
20     <xsl:element name="{local-name()}">
21       <xsl:apply-templates select="@*|node()"/>
22     </xsl:element>
23 </xsl:template>
24
25 <xsl:template match="@*">
26     <xsl:attribute name="{local-name()}">
27       <xsl:value-of select="."/>
28     </xsl:attribute>
29 </xsl:template>
30 </xsl:stylesheet>
31 '''
32
33 xslt_doc=etree.parse(StringIO(xslt))
34 transform=etree.XSLT(xslt_doc)
35
36 class PGRSpecConverter:
37
38     @staticmethod
39     def to_sfa_rspec(rspec, content_type = None):
40         if not isinstance(rspec, RSpec):
41             pg_rspec = RSpec(rspec)
42         else:
43             pg_rspec = rspec
44         
45         version_manager = VersionManager()
46         sfa_version = version_manager._get_version('sfa', '1')    
47         sfa_rspec = RSpec(version=sfa_version)
48
49         #nodes = pg_rspec.version.get_nodes()
50         #sfa_rspec.version.add_nodes(nodes())
51         #sfa_rspec.version.add_links(pg_rspec.version.get_links())
52         #return sfa_rspec.toxml() 
53
54         # get network
55         networks = pg_rspec.version.get_networks()
56         network_hrn = networks[0]["name"]
57         network_element = sfa_rspec.xml.add_element('network', name=network_hrn, id=network_hrn)
58         
59         # get nodes
60         pg_nodes_elements = pg_rspec.version.get_nodes()
61         nodes_with_slivers = pg_rspec.version.get_nodes_with_slivers()
62         i = 1
63         for pg_node in pg_nodes_elements:
64             attribs = dict(pg_node.items())
65             attribs['id'] = 'n'+str(i)
66             
67             node_element = network_element.add_element('node')
68             for attrib in attribs:
69                 if type(attribs[attrib]) == str:
70                     node_element.set(attrib, attribs[attrib])
71             urn = pg_node["component_id"]
72             if urn:
73                 if type(urn)==list:
74                     # legacy code, not sure if urn is ever a list...
75                     urn = urn[0]
76                 hostname = Xrn.urn_split(urn)[-1]
77                 hostname_element = node_element.add_element('hostname')
78                 hostname_element.set_text(hostname)
79                 if hostname in nodes_with_slivers:
80                     node_element.add_element('sliver')
81
82             for hardware_type in pg_node["hardware_types"]:
83                 if "name" in hardware_type:
84                     node_element.add_element("hardware_type", name=hardware_type["name"])
85                      
86             # just copy over remaining child elements  
87             #for child in pg_node_element.getchildren():
88             #    node_element.append(transform(child).getroot())
89             i = i+1
90  
91         return sfa_rspec.toxml()
92          
93 if __name__ == '__main__':
94     import sys
95     if len(sys.argv) > 1:        
96         print(PGRSpecConverter.to_sfa_rspec(sys.argv[1]))