fix various bugs
[sfa.git] / sfa / rspecs / elements / versions / sfav1Node.py
1
2 from sfa.util.xml import XpathFilter
3 from sfa.util.plxrn import PlXrn
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.network import Network 
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                 xrn = Xrn(node['component_id'])
46                 node_elem.set('component_name', xrn.get_leaf())
47                 hostname_tag = node_elem.add_element('hostname')
48                 hostname_tag.set_text(xrn.get_leaf())
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', node.get('location', []), Location.fields)
55             interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), Interface.fields)
56             
57             #if 'bw_unallocated' in node and node['bw_unallocated']:
58             #    bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
59
60             PGv2Services.add_services(node_elem, node.get('services', []))
61             SFAv1PLTag.add_pl_tags(node_elem, node.get('tags', [])) 
62             SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
63
64     @staticmethod 
65     def add_slivers(xml, slivers):
66         component_ids = []
67         for sliver in slivers:
68             filter = {}
69             if isinstance(sliver, str):
70                 filter['component_id'] = '*%s*' % sliver
71                 sliver = {}
72             elif 'component_id' in sliver and sliver['component_id']:
73                 filter['component_id'] = '*%s*' % sliver['component_id']
74             if not fliter:
75                 continue 
76             nodes = SFAv1Node.get_nodes(xml, filter)
77             if not nodes:
78                 continue
79             node = nodes[0]
80             SFAv1Sliver.add_slivers(node, sliver)
81
82     @staticmethod
83     def remove_slivers(xml, hostnames):
84         for hostname in hostnames:
85             nodes = SFAv1Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
86             for node in nodes:
87                 slivers = SFAv1Slivers.get_slivers(node.element)
88                 for sliver in slivers:
89                     node.element.remove(sliver.element)
90         
91     @staticmethod
92     def get_nodes(xml, filter={}):
93         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
94         node_elems = xml.xpath(xpath)
95         return SFAv1Node.get_node_objs(node_elems)
96
97     @staticmethod
98     def get_nodes_with_slivers(xml):
99         xpath = '//node/sliver | //default:node/default:sliver' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
100         node_elems = xml.xpath(xpath)
101         return SFAv1Node.get_nodes_objs(node_elems)
102
103
104     @staticmethod
105     def get_node_objs(node_elems):
106         nodes = []    
107         for node_elem in node_elems:
108             node = Node(node_elem.attrib, node_elem)
109             if 'site_id' in node_elem.attrib:
110                 node['authority_id'] = node_elem.attrib['site_id']
111             location_objs = Element.get_elements(node_elem, './default:location | ./location', Location)
112             if len(location_objs) > 0:
113                 node['location'] = location_objs[0]
114             bwlimit_objs = Element.get_elements(node_elem, './default:bw_limit | ./bw_limit', BWlimit)
115             if len(bwlimit_objs) > 0:
116                 node['bwlimit'] = bwlimit_objs[0]
117             node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
118             node['services'] = PGv2Services.get_services(node_elem) 
119             node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
120             node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys())
121             nodes.append(node)
122         return nodes            
123