1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn, get_leaf
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
21 class Ofeliav1Datapath:
24 def get_datapaths(xml, filter=None):
27 #xpath = '//datapath%s | //default:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
28 xpath = '//datapath%s | //openflow:datapath%s' % (
29 XpathFilter.xpath(filter), XpathFilter.xpath(filter))
30 datapath_elems = xml.xpath(xpath)
31 return Ofeliav1Datapath.get_datapath_objs(datapath_elems)
34 def get_datapath_objs(datapath_elems):
36 for datapath_elem in datapath_elems:
37 datapath = Datapath(datapath_elem.attrib, datapath_elem)
39 datapath['ports'] = Ofeliav1Port.get_ports(datapath_elem)
40 datapaths.append(datapath)
44 # def add_nodes(xml, nodes, rspec_content_type=None):
45 # network_elems = xml.xpath('//network')
46 # if len(network_elems) > 0:
47 # network_elem = network_elems[0]
48 # elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
49 # network_urn = nodes[0]['component_manager_id']
50 # network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn())
56 # node_fields = ['component_manager_id', 'component_id', 'boot_state']
57 # node_elem = network_elem.add_instance('node', node, node_fields)
58 # node_elems.append(node_elem)
60 # # determine network hrn
62 # if 'component_manager_id' in node and node['component_manager_id']:
63 # network_hrn = Xrn(node['component_manager_id']).get_hrn()
65 # # set component_name attribute and hostname element
66 # if 'component_id' in node and node['component_id']:
67 # component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn()))
68 # node_elem.set('component_name', component_name)
69 # hostname_elem = node_elem.add_element('hostname')
70 # hostname_elem.set_text(component_name)
73 # if 'authority_id' in node and node['authority_id']:
74 # node_elem.set('site_id', node['authority_id'])
77 # location = node.get('location')
79 # node_elem.add_instance('location', location, Location.fields)
81 # # add exclusive tag to distinguish between Reservable and Shared nodes
82 # exclusive_elem = node_elem.add_element('exclusive')
83 # if node.get('exclusive') and node.get('exclusive') == 'true':
84 # exclusive_elem.set_text('TRUE')
85 # # add granularity of the reservation system
86 # granularity = node.get('granularity')
88 # node_elem.add_instance('granularity', granularity, granularity.fields)
90 # exclusive_elem.set_text('FALSE')
93 # if isinstance(node.get('interfaces'), list):
94 # for interface in node.get('interfaces', []):
95 # node_elem.add_instance('interface', interface, ['component_id', 'client_id', 'ipv4'])
97 # #if 'bw_unallocated' in node and node['bw_unallocated']:
98 # # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
100 # PGv2Services.add_services(node_elem, node.get('services', []))
101 # tags = node.get('tags', [])
104 # # backdoor for FITeagle
105 # # Alexander Willner <alexander.willner@tu-berlin.de>
106 # if tag['tagname']=="fiteagle_settings":
107 # tag_elem = node_elem.add_element(tag['tagname'])
108 # for subtag in tag['value']:
109 # subtag_elem = tag_elem.add_element('setting')
110 # subtag_elem.set('name', str(subtag['tagname']))
111 # subtag_elem.set('description', str(subtag['description']))
112 # subtag_elem.set_text(subtag['value'])
114 # tag_elem = node_elem.add_element(tag['tagname'])
115 # tag_elem.set_text(tag['value'])
116 # SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
118 # # add sliver tag in Request Rspec
119 # if rspec_content_type == "request":
120 # node_elem.add_instance('sliver', '', [])
123 # def add_slivers(xml, slivers):
125 # for sliver in slivers:
127 # if isinstance(sliver, str):
128 # filter['component_id'] = '*%s*' % sliver
130 # elif 'component_id' in sliver and sliver['component_id']:
131 # filter['component_id'] = '*%s*' % sliver['component_id']
134 # nodes = SFAv1Node.get_nodes(xml, filter)
138 # SFAv1Sliver.add_slivers(node, sliver)
141 # def remove_slivers(xml, hostnames):
142 # for hostname in hostnames:
143 # nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
145 # slivers = SFAv1Sliver.get_slivers(node.element)
146 # for sliver in slivers:
147 # node.element.remove(sliver.element)
150 # def get_nodes(xml, filter={}):
151 # xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
152 # node_elems = xml.xpath(xpath)
153 # return SFAv1Node.get_node_objs(node_elems)
156 # def get_nodes_with_slivers(xml):
157 # xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver)>0]'
158 # node_elems = xml.xpath(xpath)
159 # return SFAv1Node.get_node_objs(node_elems)