- slice = slices[0]
- slivers = []
- tags = self.api.plshell.GetSliceTags(self.api.plauth, slice['slice_tag_ids'])
- for node_id in slice['node_ids']:
- try:
- sliver = {}
- sliver['hostname'] = self.nodes[node_id]['hostname']
- sliver['tags'] = []
- slivers.append(sliver)
- for tag in tags:
- # if tag isn't bound to a node then it applies to all slivers
- # and belongs in the <sliver_defaults> tag
- if not tag['node_id']:
- rspec.add_default_sliver_attribute(tag['tagname'], tag['value'], self.api.hrn)
- else:
- tag_host = self.nodes[tag['node_id']]['hostname']
- if tag_host == sliver['hostname']:
- sliver['tags'].append(tag)
- except:
- self.api.logger.log_exc('unable to add sliver %s to node %s' % (slice['name'], node_id))
- rspec.add_slivers(slivers, sliver_urn=slice_xrn)
-
- return rspec.toxml(cleanup=True)
+ slice = slices[0]
+
+ # filter out nodes with a whitelist:
+ valid_nodes = []
+ for node in self.nodes.values():
+ # only doing this because protogeni rspec needs
+ # to advertise available initscripts
+ node['pl_initscripts'] = self.pl_initscripts
+
+ if slice and node['node_id'] in slice['node_ids']:
+ valid_nodes.append(node)
+ elif slice and slice['slice_id'] in node['slice_ids_whitelist']:
+ valid_nodes.append(node)
+ elif not slice and not node['slice_ids_whitelist']:
+ valid_nodes.append(node)
+
+ rspec.version.add_nodes(valid_nodes)
+ rspec.version.add_interfaces(self.interfaces.values())
+ rspec.version.add_links(self.links.values())
+
+ # add slivers
+ if slice_xrn and slice:
+ slivers = []
+ tags = self.api.plshell.GetSliceTags(self.api.plauth, slice['slice_tag_ids'])
+
+ # add default tags
+ for tag in tags:
+ # if tag isn't bound to a node then it applies to all slivers
+ # and belongs in the <sliver_defaults> tag
+ if not tag['node_id']:
+ rspec.version.add_default_sliver_attribute(tag['tagname'], tag['value'], self.api.hrn)
+ if tag['tagname'] == 'topo_rspec' and tag['node_id']:
+ node = self.nodes[tag['node_id']]
+ value = eval(tag['value'])
+ for (id, realip, bw, lvip, rvip, vnet) in value:
+ bps = get_tc_rate(bw)
+ remote = self.nodes[id]
+ site1 = self.sites[node['site_id']]
+ site2 = self.sites[remote['site_id']]
+ link1_name = '%s:%s' % (site1['login_base'], site2['login_base'])
+ link2_name = '%s:%s' % (site2['login_base'], site1['login_base'])
+ p_link = None
+ if link1_name in self.links:
+ link = self.links[link1_name]
+ elif link2_name in self.links:
+ link = self.links[link2_name]
+ v_link = Link()
+
+ link.capacity = bps
+ for node_id in slice['node_ids']:
+ try:
+ sliver = {}
+ sliver['hostname'] = self.nodes[node_id]['hostname']
+ sliver['node_id'] = node_id
+ sliver['slice_id'] = slice['slice_id']
+ sliver['tags'] = []
+ slivers.append(sliver)
+
+ # add tags for this node only
+ for tag in tags:
+ if tag['node_id'] and (tag['node_id'] == node_id):
+ sliver['tags'].append(tag)
+ except:
+ self.api.logger.log_exc('unable to add sliver %s to node %s' % (slice['name'], node_id))
+ rspec.version.add_slivers(slivers, sliver_urn=slice_xrn)
+
+ return rspec.toxml()