X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Frspec.py;h=f2fa662a2c66e7b70351ff3f81fb15dfdea16e55;hb=01ce17452bc4831ea0ee2e4b479870994c1f2b6d;hp=bf3db64604ad822b2b8c4898ee7537020706203b;hpb=65648e1e662aaa4bff322dda576f21c38f8b4faa;p=sfa.git diff --git a/sfa/rspecs/rspec.py b/sfa/rspecs/rspec.py index bf3db646..f2fa662a 100755 --- a/sfa/rspecs/rspec.py +++ b/sfa/rspecs/rspec.py @@ -4,13 +4,11 @@ from StringIO import StringIO from datetime import datetime, timedelta from sfa.util.xrn import * from sfa.util.plxrn import hostname_to_urn -from sfa.util.config import Config from sfa.util.faults import SfaNotImplemented, InvalidRSpec class RSpec: header = '\n' template = """""" - config = Config() xml = None type = None version = None @@ -49,13 +47,15 @@ class RSpec: # 'rspec' file doesnt exist. 'rspec' is proably an xml string try: tree = etree.parse(StringIO(rspec), parser) - except: - raise InvalidRSpec('Must specify a xml file or xml string. Received: ' + rspec ) - + except Exception, e: + raise InvalidRSpec(str(e)) self.xml = tree.getroot() if namespaces: self.namespaces = namespaces + def xpath(self, xpath): + return this.xml.xpath(xpath, namespaces=self.namespaces) + def add_attribute(self, elem, name, value): """ Add attribute to specified etree element @@ -90,6 +90,23 @@ class RSpec: if opt.text == value: elem.remove(opt) + def remove_element(self, element_name, root_node = None): + """ + Removes all occurences of an element from the tree. Start at + specified root_node if specified, otherwise start at tree's root. + """ + if not root_node: + root_node = self.xml + + if not element_name.startswith('//'): + element_name = '//' + element_name + + elements = root_node.xpath('%s ' % element_name, namespaces=self.namespaces) + for element in elements: + parent = element.getparent() + parent.remove(element) + + def merge(self, in_rspec): pass @@ -106,11 +123,35 @@ class RSpec: raise InvalidRSpec(message) return True + def cleanup(self): + """ + Optional method which inheriting classes can choose to implent. + """ + pass + + def _process_slivers(self, slivers): + """ + Creates a dict of sliver details for each sliver host + + @param slivers a single hostname, list of hostanmes or list of dicts keys on hostname, + Returns a list of dicts + """ + if not isinstance(slivers, list): + slivers = [slivers] + dicts = [] + for sliver in slivers: + if isinstance(sliver, dict): + dicts.append(sliver) + elif isinstance(sliver, basestring): + dicts.append({'hostname': sliver}) + return dicts def __str__(self): return self.toxml() - def toxml(self): + def toxml(self, cleanup=False): + if cleanup: + self.cleanup() return self.header + etree.tostring(self.xml, pretty_print=True) def save(self, filename):