From ae545a57e0a9701cd7aadbb0d032bbd7c677c8b5 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Wed, 16 Nov 2011 23:24:23 -0500 Subject: [PATCH] fix bugs --- sfa/rspecs/elements/versions/sfav1Node.py | 6 +- sfa/rspecs/elements/versions/sfav1PLTag.py | 6 +- sfa/rspecs/elements/versions/sfav1Sliver.py | 26 +++-- sfa/rspecs/versions/sfav1.py | 115 ++++++++++---------- sfa/util/xml.py | 7 +- 5 files changed, 89 insertions(+), 71 deletions(-) diff --git a/sfa/rspecs/elements/versions/sfav1Node.py b/sfa/rspecs/elements/versions/sfav1Node.py index 61f80564..4e129e68 100644 --- a/sfa/rspecs/elements/versions/sfav1Node.py +++ b/sfa/rspecs/elements/versions/sfav1Node.py @@ -24,7 +24,7 @@ class SFAv1Node: network_elem = network_elems[0] elif len(nodes) > 0 and nodes[0].get('component_manager_id'): network_urn = nodes[0]['component_manager_id'] - network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn()[0]) + network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn()) else: network_elem = xml @@ -62,7 +62,9 @@ class SFAv1Node: # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) PGv2Services.add_services(node_elem, node.get('services', [])) - SFAv1PLTag.add_pl_tags(node_elem, node.get('tags', [])) + for tag in node.get('tags', []): + tag_elem = node_elem.add_element(tag['tagname']) + tag_elem.set_text(tag['value']) SFAv1Sliver.add_slivers(node_elem, node.get('slivers', [])) @staticmethod diff --git a/sfa/rspecs/elements/versions/sfav1PLTag.py b/sfa/rspecs/elements/versions/sfav1PLTag.py index 8e04d511..a17d5025 100644 --- a/sfa/rspecs/elements/versions/sfav1PLTag.py +++ b/sfa/rspecs/elements/versions/sfav1PLTag.py @@ -3,10 +3,10 @@ from sfa.rspecs.elements.pltag import PLTag class SFAv1PLTag: @staticmethod - def add_pl_tags(xml, pl_tags): + def add_pl_tag(xml, name, value): for pl_tag in pl_tags: - pl_tag_elem = xml.add_element(pl_tag['tagname']) - pl_tag_elem.set_text(pl_tag['value']) + pl_tag_elem = xml.add_element(name) + pl_tag_elem.set_text(value) @staticmethod def get_pl_tags(xml, ignore=[]): diff --git a/sfa/rspecs/elements/versions/sfav1Sliver.py b/sfa/rspecs/elements/versions/sfav1Sliver.py index e8fc0b7b..acb36494 100644 --- a/sfa/rspecs/elements/versions/sfav1Sliver.py +++ b/sfa/rspecs/elements/versions/sfav1Sliver.py @@ -1,4 +1,5 @@ from sfa.util.xrn import Xrn +from sfa.util.xml import XmlElement from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.sliver import Sliver from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag @@ -13,7 +14,8 @@ class SFAv1Sliver: slivers = [slivers] for sliver in slivers: sliver_elem = xml.add_instance('sliver', sliver, ['name']) - SFAv1Sliver.add_sliver_attributes(sliver_elem, sliver.get('tags', [])) + for tag in sliver.get('tags', []): + SFAv1Sliver.add_sliver_attribute(sliver_elem, tag['tagname'], tag['value']) if sliver.get('sliver_id'): sliver_id_leaf = Xrn(sliver.get('sliver_id')).get_leaf() sliver_id_parts = sliver_id_leaf.split(':') @@ -21,9 +23,22 @@ class SFAv1Sliver: sliver_elem.set('name', name) @staticmethod - def add_sliver_attributes(xml, attributes): - SFAv1PLTag.add_pl_tags(xml, attributes) - + def add_sliver_attribute(xml, name, value): + elem = xml.add_element(name) + elem.set_text(value) + + @staticmethod + def get_sliver_attributes(xml): + attribs = [] + for elem in xml.iterchildren(): + if elem.tag not in Sliver.fields: + xml_element = XmlElement(elem, xml.namespaces) + instance = Element(xml_element) + instance['tagname'] = elem.tag + instance['value'] = elem.text + attribs.append(instance) + return attribs + @staticmethod def get_slivers(xml, filter={}): xpath = './default:sliver | ./sliver' @@ -37,6 +52,3 @@ class SFAv1Sliver: slivers.append(sliver) return slivers - @staticmethod - def get_sliver_attributes(xml, filter={}): - return SFAv1PLTag.get_pl_tags(xml, ignore=Sliver.fields) diff --git a/sfa/rspecs/versions/sfav1.py b/sfa/rspecs/versions/sfav1.py index 39a53483..54e172cb 100644 --- a/sfa/rspecs/versions/sfav1.py +++ b/sfa/rspecs/versions/sfav1.py @@ -58,58 +58,14 @@ class SFAv1(BaseVersion): network_tag.append(deepcopy(source_node_tag)) # Slivers - - def attributes_list(self, elem): - # convert a list of attribute tags into list of tuples - # (tagname, text_value) - opts = [] - if elem is not None: - for e in elem: - opts.append((e.tag, str(e.text).strip())) - return opts - - def get_default_sliver_attributes(self, network=None): - if network: - defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) - else: - defaults = self.xml.xpath("//sliver_defaults") - if not defaults: return [] - return self.attributes_list_thierry(defaults) - - def get_sliver_attributes(self, hostname, network=None): - nodes = self.get_nodes({'component_id': '*%s*' %hostname}) - attribs = [] - if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: - node = nodes[0] - sliver = node.xpath('./default:sliver', namespaces=self.namespaces) - if sliver is not None and isinstance(sliver, list) and len(sliver) > 0: - sliver = sliver[0] - #attribs = self.attributes_list(sliver) - return attribs - - def get_slice_attributes(self, network=None): - slice_attributes = [] - nodes_with_slivers = self.get_nodes_with_slivers() - for default_attribute in self.get_default_sliver_attributes(network): - attribute = {'name': str(default_attribute[0]), - 'value': str(default_attribute[1]), - 'node_id': None} - slice_attributes.append(attribute) - for node in nodes_with_slivers: - nodename=node.get('component_name') - sliver_attributes = self.get_sliver_attributes(nodename, network) - for sliver_attribute in sliver_attributes: - attribute = {'name': str(sliver_attribute[0]), 'value': str(sliver_attribute[1]), 'node_id': node} - slice_attributes.append(attribute) - return slice_attributes - + def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False): # add slice name to network tag network_tags = self.xml.xpath('//network') if network_tags: network_tag = network_tags[0] network_tag.set('slice', urn_to_hrn(sliver_urn)[0]) - + # add slivers sliver = {'name':sliver_urn, 'pl_tags': attributes} @@ -117,10 +73,10 @@ class SFAv1(BaseVersion): if sliver_urn: sliver['name'] = sliver_urn node_elems = self.get_nodes({'component_id': '*%s*' % hostname}) - if not node_elems: + if not node_elems: continue node_elem = node_elems[0] - SFAv1Sliver.add_slivers(node_elem.element, sliver) + SFAv1Sliver.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: @@ -132,6 +88,51 @@ class SFAv1(BaseVersion): def remove_slivers(self, slivers, network=None, no_dupes=False): SFAv1Node.remove_slivers(self.xml, slivers) + + def get_slice_attributes(self, network=None): + slice_attributes = [] + """ + nodes_with_slivers = self.get_nodes_with_slivers() + for default_attribute in self.get_default_sliver_attributes(network): + attribute = {'name': str(default_attribute[0]), + 'value': str(default_attribute[1]), + 'node_id': None} + slice_attributes.append(attribute) + for node in nodes_with_slivers: + nodename=node.get('component_name') + sliver_attributes = self.get_sliver_attributes(nodename, network) + for sliver_attribute in sliver_attributes: + attribute = {'name': str(sliver_attribute[0]), 'value': str(sliver_attribute[1]), 'node_id': node} + slice_attributes.append(attribute) + """ + return slice_attributes + + + def add_sliver_attribute(self, hostname, name, value, network=None): + nodes = self.get_nodes({'component_id': '*%s*' % hostname}) + if not nodes: + node = nodes[0] + slivers = SFAv1Sliver.get_slivers(node) + if slivers: + sliver = slivers[0] + SFAv1Sliver.add_attribute(sliver, name, value) + + def get_sliver_attributes(self, hostname, network=None): + nodes = self.get_nodes({'component_id': '*%s*' %hostname}) + attribs = [] + if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: + node = nodes[0] + slivers = node.xpath('./default:sliver', namespaces=self.namespaces) + if slivers is not None and isinstance(slivers, list) and len(slivers) > 0: + sliver = slivers[0] + attribs = SFAv1Sliver.get_sliver_attributes(sliver) + return attribs + + def remove_sliver_attribute(self, hostname, name, value, network=None): + attribs = self.get_sliver_attributes(hostname) + for attrib in attribs: + if attrib['tagname'] == name and attrib['value'] == value: + attrib.element.delete() def add_default_sliver_attribute(self, name, value, network=None): if network: @@ -147,11 +148,14 @@ class SFAv1(BaseVersion): defaults = defaults[0] self.xml.add_attribute(defaults, name, value) - def add_sliver_attribute(self, hostname, name, value, network=None): - node = self.get_node_element(hostname, network) - sliver = node.find("sliver") - self.xml.add_attribute(sliver, name, value) - + def get_default_sliver_attributes(self, network=None): + if network: + defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) + else: + defaults = self.xml.xpath("//sliver_defaults") + if not defaults: return [] + return self.attributes_list_thierry(defaults) + def remove_default_sliver_attribute(self, name, value, network=None): if network: defaults = self.xml.xpath("//network[@name='%s']/sliver_defaults" % network) @@ -159,11 +163,6 @@ class SFAv1(BaseVersion): defaults = self.xml.xpath("//sliver_defaults" % network) self.xml.remove_attribute(defaults, name, value) - def remove_sliver_attribute(self, hostname, name, value, network=None): - node = self.get_node_element(hostname, network) - sliver = node.find("sliver") - self.xml.remove_attribute(sliver, name, value) - # Links def get_links(self, network=None): diff --git a/sfa/util/xml.py b/sfa/util/xml.py index d6fd1963..e0083fcb 100755 --- a/sfa/util/xml.py +++ b/sfa/util/xml.py @@ -41,9 +41,10 @@ class XpathFilter: class XmlElement: def __init__(self, element, namespaces): self.element = element + self.tag = element.tag self.text = element.text - self.namespaces = namespaces self.attrib = element.attrib + self.namespaces = namespaces def xpath(self, xpath, namespaces=None): @@ -110,6 +111,10 @@ class XmlElement: parent = element.getparent() parent.remove(element) + def delete(self): + parent = self.getparent() + parent.remove(self) + def remove(self, element): if isinstance(element, XmlElement): self.element.remove(element.element) -- 2.43.0