cosmetic
[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',
54                                                   node.get('location', []), Location.fields)
55             interface_elems = Element.add_elements(node_elem, 'interface', 
56                                                    node.get('interfaces', []), Interface.fields)
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     @staticmethod
99     def get_nodes_with_slivers(xml):
100         xpath = '//node/sliver | //default:node/default:sliver' 
101         node_elems = xml.xpath(xpath)
102         return SFAv1Node.get_node_objs(node_elems)
103
104
105     @staticmethod
106     def get_node_objs(node_elems):
107         nodes = []    
108         for node_elem in node_elems:
109             node = Node(node_elem.attrib, node_elem)
110             if 'site_id' in node_elem.attrib:
111                 node['authority_id'] = node_elem.attrib['site_id']
112             location_objs = Element.get_elements(node_elem, './default:location | ./location', Location)
113             if len(location_objs) > 0:
114                 node['location'] = location_objs[0]
115             bwlimit_objs = Element.get_elements(node_elem, './default:bw_limit | ./bw_limit', BWlimit)
116             if len(bwlimit_objs) > 0:
117                 node['bwlimit'] = bwlimit_objs[0]
118             node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
119             node['services'] = PGv2Services.get_services(node_elem) 
120             node['slivers'] = SFAv1Sliver.get_slivers(node_elem)
121 #thierry    node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields.keys())
122             node['tags'] =  SFAv1PLTag.get_pl_tags(node_elem, ignore=Node.fields)
123             nodes.append(node)
124         return nodes            
125