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