pagkage /etc/sfa/api_versions.xml
[sfa.git] / sfa / rspecs / elements / versions / sfav1Node.py
1 from sfa.util.sfalogging import logger
2 from sfa.util.xml import XpathFilter
3 from sfa.util.xrn import Xrn
4
5 from sfa.rspecs.elements.element import Element
6 from sfa.rspecs.elements.node import NodeElement
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
17
18 from sfa.planetlab.plxrn import xrn_to_hostname
19
20 class SFAv1Node:
21
22     @staticmethod
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())
30         else:
31             network_elem = xml
32
33         node_elems = []       
34         for node in nodes:
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)
38
39             # determine network hrn
40             network_hrn = None 
41             if 'component_manager_id' in node and node['component_manager_id']:
42                 network_hrn = Xrn(node['component_manager_id']).get_hrn()
43
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)
50
51             # set site id
52             if 'authority_id' in node and node['authority_id']:
53                 node_elem.set('site_id', node['authority_id'])
54
55             # add locaiton
56             location = node.get('location')
57             if location:
58                 node_elem.add_instance('location', location, Location.fields)
59
60             # add granularity of the reservation system
61             granularity = node.get('granularity')
62             if granularity:
63                 node_elem.add_instance('granularity', granularity, granularity.fields)
64
65
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']) 
69             
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)
72
73             PGv2Services.add_services(node_elem, node.get('services', []))
74             tags = node.get('tags', [])
75             if tags:
76                 for tag in 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', []))
80
81     @staticmethod 
82     def add_slivers(xml, slivers):
83         component_ids = []
84         for sliver in slivers:
85             filter = {}
86             if isinstance(sliver, str):
87                 filter['component_id'] = '*%s*' % sliver
88                 sliver = {}
89             elif 'component_id' in sliver and sliver['component_id']:
90                 filter['component_id'] = '*%s*' % sliver['component_id']
91             if not filter:
92                 continue 
93             nodes = SFAv1Node.get_nodes(xml, filter)
94             if not nodes:
95                 continue
96             node = nodes[0]
97             SFAv1Sliver.add_slivers(node, sliver)
98
99     @staticmethod
100     def remove_slivers(xml, hostnames):
101         for hostname in hostnames:
102             nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
103             for node in nodes:
104                 slivers = SFAv1Sliver.get_slivers(node.element)
105                 for sliver in slivers:
106                     node.element.remove(sliver.element)
107         
108     @staticmethod
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)
113
114     @staticmethod
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)
119
120
121     @staticmethod
122     def get_node_objs(node_elems):
123         nodes = []    
124         for node_elem in node_elems:
125             node = NodeElement(node_elem.attrib, node_elem)
126             if 'site_id' in node_elem.attrib:
127                 node['authority_id'] = node_elem.attrib['site_id']
128             # get location
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]
133             # get bwlimit
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]
138             # get interfaces
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
142             # get services
143             node['services'] = PGv2Services.get_services(node_elem) 
144             # get slivers
145             node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
146             # get tags
147             node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=NodeElement.fields+["hardware_type"])
148             # get hardware types
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]
151
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
157
158             nodes.append(node)
159         return nodes            
160