2 from __future__ import print_function
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
9 from sfa.util.py23 import StringIO
11 xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
12 <xsl:output method="xml" indent="no"/>
14 <xsl:template match="/|comment()|processing-instruction()">
16 <xsl:apply-templates/>
20 <xsl:template match="*">
21 <xsl:element name="{local-name()}">
22 <xsl:apply-templates select="@*|node()"/>
26 <xsl:template match="@*">
27 <xsl:attribute name="{local-name()}">
28 <xsl:value-of select="."/>
34 xslt_doc=etree.parse(StringIO(xslt))
35 transform=etree.XSLT(xslt_doc)
37 class PGRSpecConverter:
40 def to_sfa_rspec(rspec, content_type = None):
41 if not isinstance(rspec, RSpec):
42 pg_rspec = RSpec(rspec)
46 version_manager = VersionManager()
47 sfa_version = version_manager._get_version('sfa', '1')
48 sfa_rspec = RSpec(version=sfa_version)
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()
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)
61 pg_nodes_elements = pg_rspec.version.get_nodes()
62 nodes_with_slivers = pg_rspec.version.get_nodes_with_slivers()
64 for pg_node in pg_nodes_elements:
65 attribs = dict(pg_node.items())
66 attribs['id'] = 'n'+str(i)
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"]
75 # legacy code, not sure if urn is ever a list...
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')
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"])
87 # just copy over remaining child elements
88 #for child in pg_node_element.getchildren():
89 # node_element.append(transform(child).getroot())
92 return sfa_rspec.toxml()
94 if __name__ == '__main__':
97 print(PGRSpecConverter.to_sfa_rspec(sys.argv[1]))