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 io 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)
38 class PGRSpecConverter:
41 def to_sfa_rspec(rspec, content_type=None):
42 if not isinstance(rspec, RSpec):
43 pg_rspec = RSpec(rspec)
47 version_manager = VersionManager()
48 sfa_version = version_manager._get_version('sfa', '1')
49 sfa_rspec = RSpec(version=sfa_version)
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()
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)
63 pg_nodes_elements = pg_rspec.version.get_nodes()
64 nodes_with_slivers = pg_rspec.version.get_nodes_with_slivers()
66 for pg_node in pg_nodes_elements:
67 attribs = dict(list(pg_node.items()))
68 attribs['id'] = 'n' + str(i)
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"]
77 # legacy code, not sure if urn is ever a list...
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')
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"])
90 # just copy over remaining child elements
91 # for child in pg_node_element.getchildren():
92 # node_element.append(transform(child).getroot())
95 return sfa_rspec.toxml()
97 if __name__ == '__main__':
100 print(PGRSpecConverter.to_sfa_rspec(sys.argv[1]))