Ofelia OpenFlow RSpec parsing support
[sfa.git] / sfa / rspecs / elements / versions / ofeliav1datapath.py
1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn, get_leaf
4
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.datapath import Datapath
7 from sfa.rspecs.elements.node import NodeElement
8 from sfa.rspecs.elements.sliver import Sliver
9 from sfa.rspecs.elements.location import Location
10 from sfa.rspecs.elements.hardware_type import HardwareType
11 from sfa.rspecs.elements.disk_image import DiskImage
12 from sfa.rspecs.elements.interface import Interface
13 from sfa.rspecs.elements.bwlimit import BWlimit
14 from sfa.rspecs.elements.pltag import PLTag
15 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
16 from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
17 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
18 from sfa.rspecs.elements.versions.ofeliav1Port import Ofeliav1Port
19
20
21 class Ofeliav1Datapath:
22
23     @staticmethod
24     def get_datapaths(xml, filter={}):
25         #xpath = '//datapath%s | //default:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
26         xpath = '//datapath%s | //openflow:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
27         datapath_elems = xml.xpath(xpath)
28         return Ofeliav1Datapath.get_datapath_objs(datapath_elems)
29
30     @staticmethod
31     def get_datapath_objs(datapath_elems):
32         datapaths = []    
33         for datapath_elem in datapath_elems:
34             datapath = Datapath(datapath_elem.attrib, datapath_elem)
35             # get ports
36             datapath['ports'] =  Ofeliav1Port.get_ports(datapath_elem)
37             datapaths.append(datapath)
38         return datapaths            
39
40 #    @staticmethod
41 #    def add_nodes(xml, nodes, rspec_content_type=None):
42 #        network_elems = xml.xpath('//network')
43 #        if len(network_elems) > 0:
44 #            network_elem = network_elems[0]
45 #        elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
46 #            network_urn = nodes[0]['component_manager_id']
47 #            network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn())
48 #        else:
49 #            network_elem = xml
50 #
51 #        node_elems = []       
52 #        for node in nodes:
53 #            node_fields = ['component_manager_id', 'component_id', 'boot_state']
54 #            node_elem = network_elem.add_instance('node', node, node_fields)
55 #            node_elems.append(node_elem)
56 #
57 #            # determine network hrn
58 #            network_hrn = None 
59 #            if 'component_manager_id' in node and node['component_manager_id']:
60 #                network_hrn = Xrn(node['component_manager_id']).get_hrn()
61 #
62 #            # set component_name attribute and  hostname element
63 #            if 'component_id' in node and node['component_id']:
64 #                component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn()))
65 #                node_elem.set('component_name', component_name)
66 #                hostname_elem = node_elem.add_element('hostname')
67 #                hostname_elem.set_text(component_name)
68 #
69 #            # set site id
70 #            if 'authority_id' in node and node['authority_id']:
71 #                node_elem.set('site_id', node['authority_id'])
72 #
73 #            # add locaiton
74 #            location = node.get('location')
75 #            if location:
76 #                node_elem.add_instance('location', location, Location.fields)
77 #
78 #            # add exclusive tag to distinguish between Reservable and Shared nodes
79 #            exclusive_elem = node_elem.add_element('exclusive')
80 #            if node.get('exclusive') and node.get('exclusive') == 'true':
81 #                exclusive_elem.set_text('TRUE')
82 #                # add granularity of the reservation system
83 #                granularity = node.get('granularity')
84 #                if granularity:
85 #                    node_elem.add_instance('granularity', granularity, granularity.fields)
86 #            else:
87 #                exclusive_elem.set_text('FALSE')
88 #
89 #
90 #            if isinstance(node.get('interfaces'), list):
91 #                for interface in node.get('interfaces', []):
92 #                    node_elem.add_instance('interface', interface, ['component_id', 'client_id', 'ipv4']) 
93 #            
94 #            #if 'bw_unallocated' in node and node['bw_unallocated']:
95 #            #    bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
96 #
97 #            PGv2Services.add_services(node_elem, node.get('services', []))
98 #            tags = node.get('tags', [])
99 #            if tags:
100 #                for tag in tags:
101 #                    # backdoor for FITeagle
102 #                    # Alexander Willner <alexander.willner@tu-berlin.de>
103 #                    if tag['tagname']=="fiteagle_settings":
104 #                        tag_elem = node_elem.add_element(tag['tagname'])
105 #                        for subtag in tag['value']:
106 #                            subtag_elem = tag_elem.add_element('setting')
107 #                            subtag_elem.set('name', str(subtag['tagname']))
108 #                            subtag_elem.set('description', str(subtag['description']))
109 #                            subtag_elem.set_text(subtag['value'])
110 #                    else:
111 #                        tag_elem = node_elem.add_element(tag['tagname'])
112 #                        tag_elem.set_text(tag['value'])
113 #            SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
114 #
115 #            # add sliver tag in Request Rspec
116 #            if rspec_content_type == "request":
117 #                node_elem.add_instance('sliver', '', []) 
118 #
119 #    @staticmethod 
120 #    def add_slivers(xml, slivers):
121 #        component_ids = []
122 #        for sliver in slivers:
123 #            filter = {}
124 #            if isinstance(sliver, str):
125 #                filter['component_id'] = '*%s*' % sliver
126 #                sliver = {}
127 #            elif 'component_id' in sliver and sliver['component_id']:
128 #                filter['component_id'] = '*%s*' % sliver['component_id']
129 #            if not filter:
130 #                continue 
131 #            nodes = SFAv1Node.get_nodes(xml, filter)
132 #            if not nodes:
133 #                continue
134 #            node = nodes[0]
135 #            SFAv1Sliver.add_slivers(node, sliver)
136 #
137 #    @staticmethod
138 #    def remove_slivers(xml, hostnames):
139 #        for hostname in hostnames:
140 #            nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
141 #            for node in nodes:
142 #                slivers = SFAv1Sliver.get_slivers(node.element)
143 #                for sliver in slivers:
144 #                    node.element.remove(sliver.element)
145 #        
146 #    @staticmethod
147 #    def get_nodes(xml, filter={}):
148 #        xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
149 #        node_elems = xml.xpath(xpath)
150 #        return SFAv1Node.get_node_objs(node_elems)
151 #
152 #    @staticmethod
153 #    def get_nodes_with_slivers(xml):
154 #        xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver)>0]' 
155 #        node_elems = xml.xpath(xpath)
156 #        return SFAv1Node.get_node_objs(node_elems)
157 #