include firewall rules in openstack manifest rspec
[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         return node_elems
62
63     @staticmethod
64     def get_nodes(xml, filter={}):
65         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
66         node_elems = xml.xpath(xpath)
67         return PGv2Node.get_node_objs(node_elems)
68
69     @staticmethod
70     def get_nodes_with_slivers(xml, filter={}):
71         xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
72         node_elems = xml.xpath(xpath)        
73         return PGv2Node.get_node_objs(node_elems)
74
75     @staticmethod
76     def get_node_objs(node_elems):
77         nodes = []
78         for node_elem in node_elems:
79             node = Node(node_elem.attrib, node_elem)
80             nodes.append(node) 
81             if 'component_id' in node_elem.attrib:
82                 node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn()
83             
84             # get hardware types
85             hardware_type_elems = node_elem.xpath('./default:hardware_type | ./hardware_type')
86             node['hardware_types'] = [hw_type.get_instance(HardwareType) for hw_type in hardware_type_elems]
87             
88             # get location
89             location_elems = node_elem.xpath('./default:location | ./location')
90             locations = [location_elem.get_instance(Location) for location_elem in location_elems]
91             if len(locations) > 0:
92                 node['location'] = locations[0]
93
94             # get interfaces
95             iface_elems = node_elem.xpath('./default:interface | ./interface')
96             node['interfaces'] = [iface_elem.get_instance(Interface) for iface_elem in iface_elems]
97
98             # get services
99             node['services'] = PGv2Services.get_services(node_elem)
100             
101             # get slivers
102             node['slivers'] = PGv2SliverType.get_slivers(node_elem)    
103             available_elems = node_elem.xpath('./default:available | ./available')
104             if len(available_elems) > 0 and 'name' in available_elems[0].attrib:
105                 if available_elems[0].attrib.get('now', '').lower() == 'true': 
106                     node['boot_state'] = 'boot'
107                 else: 
108                     node['boot_state'] = 'disabled' 
109         return nodes
110
111
112     @staticmethod
113     def add_slivers(xml, slivers):
114         component_ids = []
115         for sliver in slivers:
116             filter = {}
117             if isinstance(sliver, str):
118                 filter['component_id'] = '*%s*' % sliver
119                 sliver = {}
120             elif 'component_id' in sliver and sliver['component_id']:
121                 filter['component_id'] = '*%s*' % sliver['component_id']
122             if not filter: 
123                 continue
124             nodes = PGv2Node.get_nodes(xml, filter)
125             if not nodes:
126                 continue
127             node = nodes[0]
128             PGv2SliverType.add_slivers(node, sliver)
129
130     @staticmethod
131     def remove_slivers(xml, hostnames):
132         for hostname in hostnames:
133             nodes = PGv2Node.get_nodes(xml, {'component_id': '*%s*' % hostname})
134             for node in nodes:
135                 slivers = PGv2SliverType.get_slivers(node.element)
136                 for sliver in slivers:
137                     node.element.remove(sliver.element) 
138 if __name__ == '__main__':
139     from sfa.rspecs.rspec import RSpec
140     import pdb
141     r = RSpec('/tmp/emulab.rspec')
142     r2 = RSpec(version = 'ProtoGENI')
143     nodes = PGv2Node.get_nodes(r.xml)
144     PGv2Node.add_nodes(r2.xml.root, nodes)
145     #pdb.set_trace()
146         
147