2 from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id
3 from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
5 from sfa.rspecs.rspec import RSpec
6 from sfa.rspecs.elements.hardware_type import HardwareType
7 from sfa.rspecs.elements.node import Node
8 from sfa.rspecs.elements.link import Link
9 from sfa.rspecs.elements.login import Login
10 from sfa.rspecs.elements.location import Location
11 from sfa.rspecs.elements.interface import Interface
12 from sfa.rspecs.elements.services import Services
13 from sfa.rspecs.elements.pltag import PLTag
14 from sfa.util.topology import Topology
15 from sfa.rspecs.version_manager import VersionManager
16 from sfa.plc.vlink import get_tc_rate
21 #panos new user options variable
24 def __init__(self, api, user_options={}):
26 self.user_options = user_options
28 def get_sites(self, filter={}):
30 for site in self.api.driver.GetSites(filter):
31 sites[site['site_id']] = site
34 def get_interfaces(self, filter={}):
36 for interface in self.api.driver.GetInterfaces(filter):
38 iface['interface_id'] = interface['interface_id']
39 iface['node_id'] = interface['node_id']
40 iface['ipv4'] = interface['ip']
41 iface['bwlimit'] = interface['bwlimit']
42 interfaces[iface['interface_id']] = iface
45 def get_links(self, filter={}):
47 if not self.api.config.SFA_AGGREGATE_TYPE.lower() == 'vini':
52 for (site_id1, site_id2) in topology:
54 if not site_id1 in self.sites or site_id2 not in self.sites:
56 site1 = self.sites[site_id1]
57 site2 = self.sites[site_id2]
59 site1_hrn = self.api.hrn + '.' + site1['login_base']
60 site2_hrn = self.api.hrn + '.' + site2['login_base']
62 node1 = self.nodes[site1['node_ids'][0]]
63 node2 = self.nodes[site2['node_ids'][0]]
66 # just get first interface of the first node
67 if1_xrn = PlXrn(auth=self.api.hrn, interface='node%s:eth0' % (node1['node_id']))
68 if1_ipv4 = self.interfaces[node1['interface_ids'][0]]['ip']
69 if2_xrn = PlXrn(auth=self.api.hrn, interface='node%s:eth0' % (node2['node_id']))
70 if2_ipv4 = self.interfaces[node2['interface_ids'][0]]['ip']
72 if1 = Interface({'component_id': if1_xrn.urn, 'ipv4': if1_ipv4} )
73 if2 = Interface({'component_id': if2_xrn.urn, 'ipv4': if2_ipv4} )
76 link = Link({'capacity': '1000000', 'latency': '0', 'packet_loss': '0', 'type': 'ipv4'})
77 link['interface1'] = if1
78 link['interface2'] = if2
79 link['component_name'] = "%s:%s" % (site1['login_base'], site2['login_base'])
80 link['component_id'] = PlXrn(auth=self.api.hrn, interface=link['component_name']).get_urn()
81 link['component_manager_id'] = hrn_to_urn(self.api.hrn, 'authority+am')
82 links[link['component_name']] = link
86 def get_node_tags(self, filter={}):
88 for node_tag in self.api.driver.GetNodeTags(filter):
89 node_tags[node_tag['node_tag_id']] = node_tag
92 def get_pl_initscripts(self, filter={}):
94 filter.update({'enabled': True})
95 for initscript in self.api.driver.GetInitScripts(filter):
96 pl_initscripts[initscript['initscript_id']] = initscript
100 def get_slice_and_slivers(self, slice_xrn):
102 Returns a dict of slivers keyed on the sliver's node_id
107 return (slice, slivers)
108 slice_urn = hrn_to_urn(slice_xrn)
109 slice_hrn, _ = urn_to_hrn(slice_xrn)
110 slice_name = hrn_to_pl_slicename(slice_hrn)
111 slices = self.api.driver.GetSlices(slice_name)
113 return (slice, slivers)
116 # sort slivers by node id
117 for node_id in slice['node_ids']:
118 sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], node_id),
119 'name': 'plab-vserver',
121 slivers[node_id]= sliver
123 # sort sliver attributes by node id
124 tags = self.api.driver.GetSliceTags({'slice_tag_id': slice['slice_tag_ids']})
126 # most likely a default/global sliver attribute (node_id == None)
127 if tag['node_id'] not in slivers:
128 sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], ""),
129 'name': 'plab-vserver',
131 slivers[tag['node_id']] = sliver
132 slivers[tag['node_id']]['tags'].append(tag)
134 return (slice, slivers)
136 def get_nodes (self, slice=None,slivers=[]):
139 if slice and 'node_ids' in slice and slice['node_ids']:
140 filter['node_id'] = slice['node_ids']
141 tags_filter=filter.copy()
143 filter.update({'peer_id': None})
144 nodes = self.api.driver.GetNodes(filter)
150 site_ids.append(node['site_id'])
151 interface_ids.extend(node['interface_ids'])
152 tag_ids.extend(node['node_tag_ids'])
155 sites_dict = self.get_sites({'site_id': site_ids})
157 interfaces = self.get_interfaces({'interface_id':interface_ids})
160 # thierry: no get_slivers, we have slivers as a result of
161 # get_slice_and_slivers passed as an argument
163 # slivers = self.get_slivers(slice)
166 node_tags = self.get_node_tags(tags_filter)
168 pl_initscripts = self.get_pl_initscripts()
172 # skip whitelisted nodes
173 if node['slice_ids_whitelist']:
174 if not slice or slice['slice_id'] not in node['slice_ids_whitelist']:
177 # xxx how to retrieve site['login_base']
178 site_id=node['site_id']
179 site=sites_dict[site_id]
180 rspec_node['component_id'] = hostname_to_urn(self.api.hrn, site['login_base'], node['hostname'])
181 rspec_node['component_name'] = node['hostname']
182 rspec_node['component_manager_id'] = self.api.hrn
183 rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.api.hrn, site['login_base']), 'authority+sa')
184 rspec_node['boot_state'] = node['boot_state']
185 rspec_node['exclusive'] = 'False'
186 rspec_node['hardware_types'].append(HardwareType({'name': 'plab-vserver'}))
187 # only doing this because protogeni rspec needs
188 # to advertise available initscripts
189 rspec_node['pl_initscripts'] = pl_initscripts
190 # add site/interface info to nodes.
191 # assumes that sites, interfaces and tags have already been prepared.
192 site = sites_dict[node['site_id']]
193 location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
194 rspec_node['location'] = location
195 rspec_node['interfaces'] = []
196 for if_id in node['interface_ids']:
197 interface = Interface(interfaces[if_id])
198 interface['ipv4'] = interface['ipv4']
199 rspec_node['interfaces'].append(interface)
200 tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
201 rspec_node['tags'] = tags
202 if node['node_id'] in slivers:
204 sliver = slivers[node['node_id']]
205 rspec_node['sliver_id'] = sliver['sliver_id']
206 rspec_node['client_id'] = node['hostname']
207 rspec_node['slivers'] = [slivers[node['node_id']]]
209 # slivers always provide the ssh service
210 login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], port:'22'})
211 service = Services({'login': login})
212 rspec_node['services'].append(service)
213 rspec_nodes.append(rspec_node)
217 def get_rspec(self, slice_xrn=None, version = None):
219 version_manager = VersionManager()
220 version = version_manager.get_version(version)
222 rspec_version = version_manager._get_version(version.type, version.version, 'ad')
224 rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
226 slice, slivers = self.get_slice_and_slivers(slice_xrn)
227 rspec = RSpec(version=rspec_version, user_options=self.user_options)
228 rspec.version.add_nodes(self.get_nodes(slice), slivers)
229 rspec.version.add_links(self.get_links(slice))
231 # add sliver defaults
232 default_sliver_attribs = slivers.get(None, [])
233 for sliver_attrib in default_sliver_attribs:
234 rspec.version.add_default_sliver_attribute(sliver_attrib['name'], sliver_attrib['value'])