1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.node import Node
7 from sfa.rspecs.elements.sliver import Sliver
8 from sfa.rspecs.elements.location import Location
9 from sfa.rspecs.elements.hardware_type import HardwareType
10 from sfa.rspecs.elements.disk_image import DiskImage
11 from sfa.rspecs.elements.interface import Interface
12 from sfa.rspecs.elements.bwlimit import BWlimit
13 from sfa.rspecs.elements.pltag import PLTag
14 from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver
15 from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
16 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
18 from sfa.planetlab.plxrn import xrn_to_hostname
23 def add_nodes(xml, nodes):
24 network_elems = xml.xpath('//network')
25 if len(network_elems) > 0:
26 network_elem = network_elems[0]
27 elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
28 network_urn = nodes[0]['component_manager_id']
29 network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn())
35 node_fields = ['component_manager_id', 'component_id', 'boot_state']
36 node_elem = network_elem.add_instance('node', node, node_fields)
37 node_elems.append(node_elem)
39 # determine network hrn
41 if 'component_manager_id' in node and node['component_manager_id']:
42 network_hrn = Xrn(node['component_manager_id']).get_hrn()
44 # set component_name attribute and hostname element
45 if 'component_id' in node and node['component_id']:
46 component_name = xrn_to_hostname(node['component_id'])
47 node_elem.set('component_name', component_name)
48 hostname_elem = node_elem.add_element('hostname')
49 hostname_elem.set_text(component_name)
52 if 'authority_id' in node and node['authority_id']:
53 node_elem.set('site_id', node['authority_id'])
56 location = node.get('location')
58 node_elem.add_instance('location', location, Location.fields)
60 # add granularity of the reservation system
61 granularity = node.get('granularity')
63 node_elem.add_instance('granularity', granularity, granularity.fields)
66 if isinstance(node.get('interfaces'), list):
67 for interface in node.get('interfaces', []):
68 node_elem.add_instance('interface', interface, ['component_id', 'client_id', 'ipv4'])
70 #if 'bw_unallocated' in node and node['bw_unallocated']:
71 # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
73 PGv2Services.add_services(node_elem, node.get('services', []))
74 tags = node.get('tags', [])
77 tag_elem = node_elem.add_element(tag['tagname'])
78 tag_elem.set_text(tag['value'])
79 SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
82 def add_slivers(xml, slivers):
84 for sliver in slivers:
86 if isinstance(sliver, str):
87 filter['component_id'] = '*%s*' % sliver
89 elif 'component_id' in sliver and sliver['component_id']:
90 filter['component_id'] = '*%s*' % sliver['component_id']
93 nodes = SFAv1Node.get_nodes(xml, filter)
97 SFAv1Sliver.add_slivers(node, sliver)
100 def remove_slivers(xml, hostnames):
101 for hostname in hostnames:
102 nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
104 slivers = SFAv1Sliver.get_slivers(node.element)
105 for sliver in slivers:
106 node.element.remove(sliver.element)
109 def get_nodes(xml, filter={}):
110 xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
111 node_elems = xml.xpath(xpath)
112 return SFAv1Node.get_node_objs(node_elems)
115 def get_nodes_with_slivers(xml):
116 xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver)>0]'
117 node_elems = xml.xpath(xpath)
118 return SFAv1Node.get_node_objs(node_elems)
122 def get_node_objs(node_elems):
124 for node_elem in node_elems:
125 node = Node(node_elem.attrib, node_elem)
126 if 'site_id' in node_elem.attrib:
127 node['authority_id'] = node_elem.attrib['site_id']
129 location_elems = node_elem.xpath('./default:location | ./location')
130 locations = [loc_elem.get_instance(Location) for loc_elem in location_elems]
131 if len(locations) > 0:
132 node['location'] = locations[0]
134 bwlimit_elems = node_elem.xpath('./default:bw_limit | ./bw_limit')
135 bwlimits = [bwlimit_elem.get_instance(BWlimit) for bwlimit_elem in bwlimit_elems]
136 if len(bwlimits) > 0:
137 node['bwlimit'] = bwlimits[0]
139 iface_elems = node_elem.xpath('./default:interface | ./interface')
140 ifaces = [iface_elem.get_instance(Interface) for iface_elem in iface_elems]
141 node['interfaces'] = ifaces
143 node['services'] = PGv2Services.get_services(node_elem)
145 node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
147 node['tags'] = SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields+["hardware_type"])
149 hardware_type_elems = node_elem.xpath('./default:hardware_type | ./hardware_type')
150 node['hardware_types'] = [hw_type.get_instance(HardwareType) for hw_type in hardware_type_elems]
152 # temporary... play nice with old slice manager rspec
153 if not node['component_name']:
154 hostname_elem = node_elem.find("hostname")
155 if hostname_elem != None:
156 node['component_name'] = hostname_elem.text