bugfixes
[sfa.git] / sfa / rspecs / elements / versions / pgv2Node.py
1 from sfa.util.plxrn import PlXrn, xrn_to_hostname
2 from sfa.util.xrn import Xrn
3 from sfa.util.xml import XpathFilter
4 from sfa.rspecs.elements.element import Element
5 from sfa.rspecs.elements.node import Node
6 from sfa.rspecs.elements.sliver import Sliver
7 from sfa.rspecs.elements.location import Location
8 from sfa.rspecs.elements.hardware_type import HardwareType
9 from sfa.rspecs.elements.disk_image import DiskImage
10 from sfa.rspecs.elements.interface import Interface
11 from sfa.rspecs.elements.bwlimit import BWlimit
12 from sfa.rspecs.elements.pltag import PLTag
13 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services     
14 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType     
15
16 class PGv2Node:
17     @staticmethod
18     def add_nodes(xml, nodes):
19         node_elems = []
20         for node in nodes:
21             node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive']
22             elems = Element.add_elements(xml, 'node', node, node_fields)
23             node_elem = elems[0]
24             node_elems.append(node_elem)
25             # set component name
26             if node.get('component_id'):
27                 component_name = xrn_to_hostname(node['component_id'])
28                 node_elem.set('component_name', component_name)
29             # set hardware types 
30             Element.add_elements(node_elem, 'hardware_type', node.get('hardware_types', []), HardwareType.fields) 
31             # set location       
32             location_elems = Element.add_elements(node_elem, 'location', node.get('location', []), Location.fields)
33             # set interfaces
34             interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), ['component_id', 'client_id', 'ipv4'])
35             # set available element
36             if node.get('boot_state', '').lower() == 'boot':
37                 available_elem = node_elem.add_element('available', now='True')
38             else:
39                 available_elem = node_elem.add_element('available', now='False')
40             # add services
41             PGv2Services.add_services(node_elem, node.get('services', [])) 
42             # add slivers
43             slivers = node.get('slivers', [])
44             if not slivers:
45                 # we must still advertise the available sliver types
46                 slivers = Sliver({'type': 'plab-vserver'})
47                 # we must also advertise the available initscripts
48                 slivers['tags'] = []
49                 for initscript in node.get('pl_initscripts', []):
50                     slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
51             PGv2SliverType.add_slivers(node_elem, slivers)
52         
53         return node_elems
54
55     @staticmethod
56     def get_nodes(xml, filter={}):
57         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
58         node_elems = xml.xpath(xpath)
59         return PGv2Node.get_node_objs(node_elems)
60
61     @staticmethod
62     def get_nodes_with_slivers(xml, filter={}):
63         xpath = '//node/sliver_type | //default:node/default:sliver_type' 
64         node_elems = xml.xpath(xpath)        
65         return PGv2Node.get_node_objs(node_elems)
66
67     @staticmethod
68     def get_node_objs(node_elems):
69         nodes = []
70         for node_elem in node_elems:
71             node = Node(node_elem.attrib, node_elem)
72             nodes.append(node) 
73             if 'component_id' in node_elem.attrib:
74                 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
75
76             node['hardware_types'] = Element.get_elements(node_elem, './default:hardwate_type | ./hardware_type', HardwareType)
77             location_elems = Element.get_elements(node_elem, './default:location | ./location', Location)
78             if len(location_elems) > 0:
79                 node['location'] = location_elems[0]
80             node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface)
81             node['services'] = PGv2Services.get_services(node_elem)
82             node['slivers'] = PGv2SliverType.get_slivers(node_elem)    
83             available_elem = Element.get_elements(node_elem, './default:available | ./available', fields=['now'])
84             if len(available_elem) > 0 and 'name' in available_elem[0]:
85                 if available_elem[0].get('now', '').lower() == 'true': 
86                     node['boot_state'] = 'boot'
87                 else: 
88                     node['boot_state'] = 'disabled' 
89         return nodes
90
91
92     @staticmethod
93     def add_slivers(xml, slivers):
94         component_ids = []
95         for sliver in slivers:
96             filter = {}
97             if isinstance(sliver, str):
98                 filter['component_id'] = '*%s*' % sliver
99                 sliver = {}
100             elif 'component_id' in sliver and sliver['component_id']:
101                 filter['component_id'] = '*%s*' % sliver['component_id']
102             if not filter: 
103                 continue
104             nodes = PGv2Node.get_nodes(xml, filter)
105             if not nodes:
106                 continue
107             node = nodes[0]
108             PGv2SliverType.add_slivers(node, sliver)
109
110     @staticmethod
111     def remove_slivers(xml, hostnames):
112         for hostname in hostnames:
113             nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
114             for node in nodes:
115                 slivers = PGv2SliverType.get_slivers(node.element)
116                 for sliver in slivers:
117                     node.element.remove(sliver.element) 
118 if __name__ == '__main__':
119     from sfa.rspecs.rspec import RSpec
120     import pdb
121     r = RSpec('/tmp/emulab.rspec')
122     r2 = RSpec(version = 'ProtoGENI')
123     nodes = PGv2Node.get_nodes(r.xml)
124     PGv2Node.add_nodes(r2.xml.root, nodes)
125     #pdb.set_trace()
126         
127