Merge branch 'master' into senslab2
[sfa.git] / sfa / rspecs / elements / versions / slabv1Node.py
1 from sfa.planetlab.plxrn import xrn_to_hostname
2 from sfa.util.xrn import Xrn
3 from sfa.util.xml import XpathFilter
4 from sfa.rspecs.elements.node import Node
5 from sfa.rspecs.elements.sliver import Sliver
6 from sfa.rspecs.elements.location import Location
7 from sfa.rspecs.elements.hardware_type import HardwareType
8
9 from sfa.rspecs.elements.interface import Interface
10
11 from sfa.rspecs.elements.versions.slabv1Sliver import Slabv1Sliver
12 from sfa.util.sfalogging import logger
13
14
15 class Slabv1Node:
16     @staticmethod
17     def add_nodes(xml, nodes):
18
19         node_elems = []
20         for node in nodes:
21             node_fields = ['component_manager_id', 'component_id', \
22                         'client_id', 'sliver_id', 'exclusive','boot_state']
23             node_elem = xml.add_instance('node', node, node_fields)
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             if node.get('hardware_types'):
31                 for hardware_type in node.get('hardware_types', []): 
32                     node_elem.add_instance('hardware_type', hardware_type, \
33                                                     HardwareType.fields)
34             # set location
35             if node.get('location'):
36                 node_elem.add_instance('location', node['location'], \
37                                                         Location.fields)
38
39             # set interfaces
40             #if node.get('interfaces'):
41                 #for interface in  node.get('interfaces', []):
42                     #node_elem.add_instance('interface', interface, ['component_id', 'client_id'])
43             # set available element
44             if node.get('boot_state'):
45                 if node.get('boot_state').lower() == 'alive':
46                     available_elem = node_elem.add_element('available', \
47                                                                     now='true')
48                 else:
49                     available_elem = node_elem.add_element('available', \
50                                                                 now='false')
51            
52             ## add services
53             #PGv2Services.add_services(node_elem, node.get('services', [])) 
54             # add slivers
55             slivers = node.get('slivers', [])
56             if not slivers:
57                 # we must still advertise the available sliver types
58                 slivers = Sliver({'type': 'slab-node'})
59                 # we must also advertise the available initscripts
60                 slivers['tags'] = []
61                 if node.get('pl_initscripts'): 
62                     for initscript in node.get('pl_initscripts', []):
63                         slivers['tags'].append({'name': 'initscript', \
64                                                 'value': initscript['name']})
65            
66             Slabv1Sliver.add_slivers(node_elem, slivers)
67         return node_elems
68
69     @staticmethod
70     def get_nodes(xml, filter={}):
71         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), \
72                                                     XpathFilter.xpath(filter))
73         node_elems = xml.xpath(xpath)  
74         logger.debug("SLABV1NODE  \tget_nodes \tnode_elems %s"%(node_elems))
75         return Slabv1Node.get_node_objs(node_elems)
76
77     @staticmethod 
78     def get_nodes_with_slivers(xml, sliver_filter={}):
79
80         xpath = '//node[count(sliver)>0] | \
81                                 //default:node[count(default:sliver) > 0]' 
82         node_elems = xml.xpath(xpath)    
83         logger.debug("SLABV1NODE \tget_nodes_with_slivers  \
84                                 node_elems %s"%(node_elems))
85         return Slabv1Node.get_node_objs(node_elems)
86
87     @staticmethod
88     def get_node_objs(node_elems):
89         nodes = []
90         for node_elem in node_elems:
91             node = Node(node_elem.attrib, node_elem)
92             nodes.append(node) 
93             if 'component_id' in node_elem.attrib:
94                 node['authority_id'] = \
95                     Xrn(node_elem.attrib['component_id']).get_authority_urn()
96             
97             # get hardware types
98             hardware_type_elems = node_elem.xpath('./default:hardware_type | \
99                                                             ./hardware_type')
100             node['hardware_types'] = [hw_type.get_instance(HardwareType) \
101                                             for hw_type in hardware_type_elems]
102             
103             # get location
104             location_elems = node_elem.xpath('./default:location | ./location')
105             locations = [location_elem.get_instance(Location) \
106                                             for location_elem in location_elems]
107             if len(locations) > 0:
108                 node['location'] = locations[0]
109
110             # get interfaces
111             iface_elems = node_elem.xpath('./default:interface | ./interface')
112             node['interfaces'] = [iface_elem.get_instance(Interface) \
113                                             for iface_elem in iface_elems]
114
115             # get services
116             #node['services'] = PGv2Services.get_services(node_elem)
117
118             # get slivers
119             node['slivers'] = Slabv1Sliver.get_slivers(node_elem)    
120             available_elems = node_elem.xpath('./default:available | \
121                                                                 ./available')
122             if len(available_elems) > 0 and 'name' in available_elems[0].attrib:
123                 if available_elems[0].attrib.get('now', '').lower() == 'true': 
124                     node['boot_state'] = 'boot'
125                 else: 
126                     node['boot_state'] = 'disabled' 
127         return nodes
128
129
130     @staticmethod
131     def add_slivers(xml, slivers):
132         logger.debug("SLABv1NODE \tadd_slivers ")
133         component_ids = []
134         for sliver in slivers:
135             filter_sliver = {}
136             if isinstance(sliver, str):
137                 filter_sliver['component_id'] = '*%s*' % sliver
138                 sliver = {}
139             elif 'component_id' in sliver and sliver['component_id']:
140                 filter_sliver['component_id'] = '*%s*' % sliver['component_id']
141             if not filter_sliver: 
142                 continue
143             nodes = Slabv1Node.get_nodes(xml, filter_sliver)
144             if not nodes:
145                 continue
146             node = nodes[0]
147             Slabv1Sliver.add_slivers(node, sliver)
148
149     @staticmethod
150     def remove_slivers(xml, hostnames):
151         for hostname in hostnames:
152             nodes = Slabv1Node.get_nodes(xml, \
153                                     {'component_id': '*%s*' % hostname})
154             for node in nodes:
155                 slivers = Slabv1Sliver.get_slivers(node.element)
156                 for sliver in slivers:
157                     node.element.remove(sliver.element) 
158 if __name__ == '__main__':
159     from sfa.rspecs.rspec import RSpec
160
161     r = RSpec('/tmp/slab.rspec')
162     r2 = RSpec(version = 'slab')
163     getnodes = Slabv1Node.get_nodes(r.xml)
164     Slabv1Node.add_nodes(r2.xml.root, getnodes)
165
166         
167