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