use sfa.client.client_helper to generate users list in CreateSliver
[sfa.git] / sfa / plc / aggregate.py
index bdcbc8a..f39fd61 100644 (file)
@@ -1,9 +1,11 @@
 #!/usr/bin/python
 from sfa.util.xrn import *
 from sfa.util.plxrn import *
-from sfa.rspecs.sfa_rspec import SfaRSpec
-from sfa.rspecs.pg_rspec  import PGRSpec
-from sfa.rspecs.rspec_version import RSpecVersion
+#from sfa.rspecs.sfa_rspec import SfaRSpec
+#from sfa.rspecs.pg_rspec  import PGRSpec
+#from sfa.rspecs.rspec_version import RSpecVersion
+from sfa.rspecs.rspec import RSpec
+from sfa.rspecs.version_manager import VersionManager
 
 class Aggregate:
 
@@ -77,19 +79,14 @@ class Aggregate:
 
     def get_rspec(self, slice_xrn=None, version = None):
         self.prepare()
-        rspec = None
-        rspec_version = RSpecVersion(version)
-        if slice_xrn:
-            type = 'manifest'
-        else:
-            type = 'advertisement' 
-        if rspec_version['type'].lower() == 'protogeni':
-            rspec = PGRSpec(type=type)
-        elif rspec_version['type'].lower() == 'sfa':
-            rspec = SfaRSpec(type=type, user_options=self.user_options)
+        version_manager = VersionManager()
+        version = version_manager.get_version(version)
+        if not slice_xrn:
+            rspec_version = version_manager._get_version(version.type, version.version, 'ad')
         else:
-            rspec = SfaRSpec(type=type, user_options=self.user_options)
-
+            rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
+               
+        rspec = RSpec(version=rspec_version, user_options=self.user_options)
         # get slice details if specified
         slice = None
         if slice_xrn:
@@ -102,22 +99,33 @@ class Aggregate:
         # filter out nodes with a whitelist:
         valid_nodes = [] 
         for node in self.nodes.values():
-            # only doing this becuase protogeni rspec needs
+            # only doing this because protogeni rspec needs
             # to advertise available initscripts 
             node['pl_initscripts'] = self.pl_initscripts
-            if not node['slice_ids_whitelist']:
+
+            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.add_nodes(valid_nodes)
-        rspec.add_interfaces(self.interfaces.values()) 
-        rspec.add_links(self.links.values())
+        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)
+
             for node_id in slice['node_ids']:
                 try:
                     sliver = {}
@@ -126,17 +134,13 @@ class Aggregate:
                     sliver['slice_id'] = slice['slice_id']    
                     sliver['tags'] = []
                     slivers.append(sliver)
+
+                    # add tags for this node only
                     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)
+                        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.add_slivers(slivers, sliver_urn=slice_xrn)
+                    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(cleanup=True)          
+        return rspec.toxml()