From 4a015ca27e221e7d68378d8337c9e7b0a75f119d Mon Sep 17 00:00:00 2001
From: Tony Mack <tmack@paris.CS.Princeton.EDU>
Date: Tue, 17 May 2011 20:04:31 -0400
Subject: [PATCH] add support for merging PG rspecs

---
 sfa/managers/slice_manager_pl.py | 18 +++++++++---------
 sfa/rspecs/pg_rspec.py           | 13 +++++++++++++
 sfa/rspecs/rspec.py              |  6 ++++--
 3 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/sfa/managers/slice_manager_pl.py b/sfa/managers/slice_manager_pl.py
index 17651795..065687d8 100644
--- a/sfa/managers/slice_manager_pl.py
+++ b/sfa/managers/slice_manager_pl.py
@@ -360,7 +360,6 @@ def ListResources(api, creds, options, call_id):
 
     # get the rspec's return format from options
     rspec_version = RSpecVersion(options.get('rspec_version'))
-    print dict(rspec_version)
     version_string = "rspec_%s" % (rspec_version.get_version_name())
 
     # look in cache first
@@ -391,17 +390,18 @@ def ListResources(api, creds, options, call_id):
                     
     results = threads.get_results()
     #results.append(open('/root/protogeni.rspec', 'r').read())
-    rspec = SfaRSpec()
+    rspec_version = RSpecVersion(my_opts.get('rspec_version'))
+    if rspec_version['type'].lower() == 'protogeni':
+        rspec = PGRSpec()
+    else:
+        rspec = SfaRSpec()
+
     for result in results:
+        print "RESULT"
         try:
-            tmp_rspec = parse_rspec(result)
-            if isinstance(tmp_rspec, SfaRSpec):
-                rspec.merge(result)
-            elif isinstance(tmp_rspec, PGRSpec):
-                rspec.merge(RSpecConverter.to_sfa_rspec(result))
-            else:
-                api.logger.info("SM.ListResources: invalid aggregate rspec")                        
+            rspec.merge(result)
         except:
+            raise
             api.logger.info("SM.ListResources: Failed to merge aggregate rspec")
 
     # cache the result
diff --git a/sfa/rspecs/pg_rspec.py b/sfa/rspecs/pg_rspec.py
index a998f86c..84181204 100755
--- a/sfa/rspecs/pg_rspec.py
+++ b/sfa/rspecs/pg_rspec.py
@@ -103,6 +103,19 @@ class PGRSpec(RSpec):
         pass
 
 
+    def merge(self, in_rspec):
+        """
+        Merge contents for specified rspec with current rspec
+        """
+        
+        # just copy over all the child elements under the root element
+        tree = etree.parse(StringIO(in_rspec))
+        root = tree.getroot()
+        for child in root.getchildren():
+            self.xml.append(child)
+                  
+    
+
 if __name__ == '__main__':
     rspec = PGRSpec()
     rspec.add_nodes([1])
diff --git a/sfa/rspecs/rspec.py b/sfa/rspecs/rspec.py
index fe80006b..de7e250e 100755
--- a/sfa/rspecs/rspec.py
+++ b/sfa/rspecs/rspec.py
@@ -10,11 +10,11 @@ from sfa.util.faults import SfaNotImplemented, InvalidRSpec
 class RSpec:
     header = '<?xml version="1.0"?>\n'
     template = """<RSpec></RSpec>"""
-    namespaces = {}
     config = Config()
     xml = None
     type = None
-    version = None     
+    version = None
+    namespaces = None    
   
     def __init__(self, rspec="", namespaces={}):
         if rspec:
@@ -87,6 +87,8 @@ class RSpec:
                     if opt.text == value:
                         elem.remove(opt)
 
+    def merge(self, in_rspec):
+        pass
 
     def validate(self, schema):
         """
-- 
2.47.0