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