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