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