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