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