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