rspec converters now convert sliver tag
[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 *
5 from sfa.rspecs.pg_rspec import PGRSpec 
6 from sfa.rspecs.sfa_rspec import SfaRSpec
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):
38         if isinstance(rspec, PGRSpec):
39             pg_rspec = rspec
40         else:        
41             pg_rspec = PGRSpec(rspec=rspec)
42         sfa_rspec = SfaRSpec()
43
44         # get network
45         network_urn = pg_rspec.get_network()
46         network,  _ = urn_to_hrn(network_urn)
47         network_element = sfa_rspec.add_element('network', {'name': network, 'id': network})
48         
49         # get nodes
50         pg_nodes_elements = pg_rspec.get_node_elements()
51         nodes_with_slivers = pg_rspec.get_nodes_with_slivers()
52         print "nodes with slivers", nodes_with_slivers
53         i = 1
54         for pg_node_element in pg_nodes_elements:
55             node_element = sfa_rspec.add_element('node', {'id': 'n'+str(i)}, parent=network_element)
56             urn = pg_node_element.xpath('@component_uuid | @component_id')
57             if urn:
58                 urn = urn[0]
59                 hostname = Xrn.urn_split(urn)[-1]
60                 hostname_element = sfa_rspec.add_element('hostname', parent=node_element, text=hostname)
61                 if hostname in nodes_with_slivers:
62                     sfa_rspec.add_element('sliver', parent=node_element)
63                      
64             urn_element = sfa_rspec.add_element('urn', parent=node_element, text=urn)
65
66
67             # just copy over remaining child elements  
68             for child in pg_node_element.getchildren():
69                 node_element.append(transform(child).getroot())
70             i = i+1
71  
72         return sfa_rspec.toxml()
73          
74 if __name__ == '__main__':
75     import sys
76     if len(sys.argv) > 1:        
77         print PGRSpecConverter.to_sfa_rspec(sys.argv[1])