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):
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)
32 def get_datapath_objs(datapath_elems):
34 for datapath_elem in datapath_elems:
35 datapath = Datapath(datapath_elem.attrib, datapath_elem)
37 datapath['ports'] = Ofeliav1Port.get_ports(datapath_elem)
38 datapaths.append(datapath)
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())
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)
58 # # determine network hrn
60 # if 'component_manager_id' in node and node['component_manager_id']:
61 # network_hrn = Xrn(node['component_manager_id']).get_hrn()
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)
71 # if 'authority_id' in node and node['authority_id']:
72 # node_elem.set('site_id', node['authority_id'])
75 # location = node.get('location')
77 # node_elem.add_instance('location', location, Location.fields)
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')
86 # node_elem.add_instance('granularity', granularity, granularity.fields)
88 # exclusive_elem.set_text('FALSE')
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'])
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)
98 # PGv2Services.add_services(node_elem, node.get('services', []))
99 # tags = node.get('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'])
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', []))
116 # # add sliver tag in Request Rspec
117 # if rspec_content_type == "request":
118 # node_elem.add_instance('sliver', '', [])
121 # def add_slivers(xml, slivers):
123 # for sliver in slivers:
125 # if isinstance(sliver, str):
126 # filter['component_id'] = '*%s*' % sliver
128 # elif 'component_id' in sliver and sliver['component_id']:
129 # filter['component_id'] = '*%s*' % sliver['component_id']
132 # nodes = SFAv1Node.get_nodes(xml, filter)
136 # SFAv1Sliver.add_slivers(node, sliver)
139 # def remove_slivers(xml, hostnames):
140 # for hostname in hostnames:
141 # nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
143 # slivers = SFAv1Sliver.get_slivers(node.element)
144 # for sliver in slivers:
145 # node.element.remove(sliver.element)
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)
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)