shebangs need to point at python2
[sfa.git] / sfa / rspecs / pg_rspec_converter.py
1 #!/usr/bin/env python2
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
38 class PGRSpecConverter:
39
40     @staticmethod
41     def to_sfa_rspec(rspec, content_type=None):
42         if not isinstance(rspec, RSpec):
43             pg_rspec = RSpec(rspec)
44         else:
45             pg_rspec = rspec
46
47         version_manager = VersionManager()
48         sfa_version = version_manager._get_version('sfa', '1')
49         sfa_rspec = RSpec(version=sfa_version)
50
51         #nodes = pg_rspec.version.get_nodes()
52         # sfa_rspec.version.add_nodes(nodes())
53         # sfa_rspec.version.add_links(pg_rspec.version.get_links())
54         # return sfa_rspec.toxml()
55
56         # get network
57         networks = pg_rspec.version.get_networks()
58         network_hrn = networks[0]["name"]
59         network_element = sfa_rspec.xml.add_element(
60             'network', name=network_hrn, id=network_hrn)
61
62         # get nodes
63         pg_nodes_elements = pg_rspec.version.get_nodes()
64         nodes_with_slivers = pg_rspec.version.get_nodes_with_slivers()
65         i = 1
66         for pg_node in pg_nodes_elements:
67             attribs = dict(pg_node.items())
68             attribs['id'] = 'n' + str(i)
69
70             node_element = network_element.add_element('node')
71             for attrib in attribs:
72                 if type(attribs[attrib]) == str:
73                     node_element.set(attrib, attribs[attrib])
74             urn = pg_node["component_id"]
75             if urn:
76                 if type(urn) == list:
77                     # legacy code, not sure if urn is ever a list...
78                     urn = urn[0]
79                 hostname = Xrn.urn_split(urn)[-1]
80                 hostname_element = node_element.add_element('hostname')
81                 hostname_element.set_text(hostname)
82                 if hostname in nodes_with_slivers:
83                     node_element.add_element('sliver')
84
85             for hardware_type in pg_node["hardware_types"]:
86                 if "name" in hardware_type:
87                     node_element.add_element(
88                         "hardware_type", name=hardware_type["name"])
89
90             # just copy over remaining child elements
91             # for child in pg_node_element.getchildren():
92             #    node_element.append(transform(child).getroot())
93             i = i + 1
94
95         return sfa_rspec.toxml()
96
97 if __name__ == '__main__':
98     import sys
99     if len(sys.argv) > 1:
100         print(PGRSpecConverter.to_sfa_rspec(sys.argv[1]))