ListResources: filter our nodes with a whitelist if the caller's slice isn't on the...
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 8 Jul 2011 16:55:15 +0000 (12:55 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 8 Jul 2011 16:55:15 +0000 (12:55 -0400)
sfa/plc/aggregate.py

index 3afc068..a3d3562 100644 (file)
@@ -83,40 +83,50 @@ class Aggregate:
         else:
             rspec = SfaRSpec(type=type, user_options=self.user_options)
 
-
-        rspec.add_nodes(self.nodes.values())
-        rspec.add_interfaces(self.interfaces.values()) 
-        rspec.add_links(self.links.values())
-
+        # get slice details if specified
+        slice = None
         if slice_xrn:
-            # If slicename is specified then resulting rspec is a manifest. 
-            # Add sliver details to rspec and remove 'advertisement' elements
             slice_hrn, _ = urn_to_hrn(slice_xrn)
             slice_name = hrn_to_pl_slicename(slice_hrn)
             slices = self.api.plshell.GetSlices(self.api.plauth, slice_name)
             if slices:
-                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['node_id'] = node_id
-                        sliver['slice_id'] = slice['slice_id']    
-                        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)
+                slice = slices[0]            
+
+        # filter out nodes with a whitelist:
+        valid_nodes = [] 
+        for node in self.nodes.values():
+            if not node['slice_ids_whitelist']:
+                valid_nodes.append(node)
+            elif slice and slice['slice_id'] in node['slice_ids_whitelist']:
+                valid_nodes.append(node)
+    
+        rspec.add_nodes(valid_nodes)
+        rspec.add_interfaces(self.interfaces.values()) 
+        rspec.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'])
+            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)
+                    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)