X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=sfa%2Futil%2FrspecHelper.py;h=0db7f8e591127e77abc79dbf6d9a7123efc01d26;hb=f134bb8ff802fbce52836e74d55365ab9863eb56;hp=613e5aed2869d47a6f282ea5e2315e3856057b27;hpb=064c0a658ef0cd87e72e9243609b896b9ab4c61f;p=sfa.git diff --git a/sfa/util/rspecHelper.py b/sfa/util/rspecHelper.py index 613e5aed..0db7f8e5 100755 --- a/sfa/util/rspecHelper.py +++ b/sfa/util/rspecHelper.py @@ -5,6 +5,35 @@ from lxml import etree from StringIO import StringIO from optparse import OptionParser + +def merge_rspecs(rspecs): + """ + Merge merge a list of RSpecs into 1 RSpec, and return the result. + rspecs must be a valid RSpec string or list of RSpec strings. + """ + if not rspecs or not isinstance(rspecs, list): + return rspecs + + rspec = None + for tmp_rspec in rspecs: + try: + tree = etree.parse(StringIO(tmp_rspec)) + except etree.XMLSyntaxError: + # consider failing silently here + message = str(agg_rspec) + ": " + str(sys.exc_info()[1]) + raise InvalidRSpec(message) + + root = tree.getroot() + if root.get("type") in ["SFA"]: + if rspec == None: + rspec = root + else: + for network in root.iterfind("./network"): + rspec.append(deepcopy(network)) + for request in root.iterfind("./request"): + rspec.append(deepcopy(request)) + return etree.tostring(rspec, xml_declaration=True, pretty_print=True) + class RSpec: def __init__(self, xml): parser = etree.XMLParser(remove_blank_text=True)