bugfixes
[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.plxrn import PlXrn, xrn_to_hostname
4 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
17
18 class SFAv1Node:
19
20     @staticmethod
21     def add_nodes(xml, nodes):
22         network_elems = Element.get_elements(xml, '//network', fields=['name'])
23         if len(network_elems) > 0:
24             network_elem = network_elems[0]
25         elif len(nodes) > 0 and nodes[0].get('component_manager_id'):
26             network_urn = nodes[0]['component_manager_id']    
27             network_elems = Element.add_elements(xml, 'network', {'name': Xrn(network_urn).get_hrn()})
28             network_elem = network_elems[0]
29
30         node_elems = []       
31         for node in nodes:
32             node_fields = ['component_manager_id', 'component_id', 'boot_state']
33             elems = Element.add_elements(network_elem, 'node', node, node_fields)
34             node_elem = elems[0]  
35             node_elems.append(node_elem)
36
37             # determine network hrn
38             network_hrn = None 
39             if 'component_manager_id' in node and node['component_manager_id']:
40                 network_hrn = Xrn(node['component_manager_id']).get_hrn()
41
42             # set component_name attribute and  hostname element
43             if 'component_id' in node and node['component_id']:
44                 component_name = xrn_to_hostname(node['component_id'])
45                 node_elem.set('component_name', component_name)
46                 hostname_tag = node_elem.add_element('hostname')
47                 hostname_tag.set_text(component_name)
48
49             # set site id
50             if 'authority_id' in node and node['authority_id']:
51                 node_elem.set('site_id', node['authority_id'])
52
53             location_elems = Element.add_elements(node_elem, 'location',
54                                                   node.get('location', []), Location.fields)
55             interface_elems = Element.add_elements(node_elem, 'interface', 
56                                                    node.get('interfaces', []), ['component_id', 'client_id', 'ipv4'])
57             
58             #if 'bw_unallocated' in node and node['bw_unallocated']:
59             #    bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
60
61             PGv2Services.add_services(node_elem, node.get('services', []))
62             SFAv1PLTag.add_pl_tags(node_elem, node.get('tags', [])) 
63             SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
64
65     @staticmethod 
66     def add_slivers(xml, slivers):
67         component_ids = []
68         for sliver in slivers:
69             filter = {}
70             if isinstance(sliver, str):
71                 filter['component_id'] = '*%s*' % sliver
72                 sliver = {}
73             elif 'component_id' in sliver and sliver['component_id']:
74                 filter['component_id'] = '*%s*' % sliver['component_id']
75             if not fliter:
76                 continue 
77             nodes = SFAv1Node.get_nodes(xml, filter)
78             if not nodes:
79                 continue
80             node = nodes[0]
81             SFAv1Sliver.add_slivers(node, sliver)
82
83     @staticmethod
84     def remove_slivers(xml, hostnames):
85         for hostname in hostnames:
86             nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
87             for node in nodes:
88                 slivers = SFAv1Slivers.get_slivers(node.element)
89                 for sliver in slivers:
90                     node.element.remove(sliver.element)
91         
92     @staticmethod
93     def get_nodes(xml, filter={}):
94         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
95         node_elems = xml.xpath(xpath)
96         return SFAv1Node.get_node_objs(node_elems)
97
98     # xxx Thierry : an ugly hack to get the tests to pass again
99     # probably this needs to be trashed
100     # the original code returned the <sliver /> tag, 
101     # but we prefer the <node> father node instead as it already holds data
102     # initially this was to preserve the nodename...
103     # xxx I don't get the ' | //default:node/default:sliver' ...
104     @staticmethod
105     def get_nodes_with_slivers_thierry(xml):
106         # dropping the ''
107         xpath = '//node[count (sliver)>0]'
108         node_elems = xml.xpath(xpath)
109         #  we need to check/recompute the node data 
110         
111         return node_elems
112
113     @staticmethod
114     def get_nodes_with_slivers(xml):
115         xpath = '//node/sliver | //default:node/default:sliver' 
116         node_elems = xml.xpath(xpath)
117         return SFAv1Node.get_node_objs(node_elems)
118
119
120     @staticmethod
121     def get_node_objs(node_elems):
122         nodes = []    
123         for node_elem in node_elems:
124             node = Node(node_elem.attrib, node_elem)
125             if 'site_id' in node_elem.attrib:
126                 node['authority_id'] = node_elem.attrib['site_id']
127             location_objs = Element.get_elements(node_elem, './default:location | ./location', Location)
128             if len(location_objs) > 0:
129                 node['location'] = location_objs[0]
130             bwlimit_objs = Element.get_elements(node_elem, './default:bw_limit | ./bw_limit', BWlimit)
131             if len(bwlimit_objs) > 0:
132                 node['bwlimit'] = bwlimit_objs[0]
133             node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
134             node['services'] = PGv2Services.get_services(node_elem) 
135             node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
136 #thierry    node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys())
137             node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields)
138             nodes.append(node)
139         return nodes            
140