From 7cea063f8976f5709cf34e4c3e6d08592ce64fa2 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Tue, 15 Nov 2011 22:26:43 -0500 Subject: [PATCH] bugfixes --- sfa/client/sfiAddSliver.py | 3 +- sfa/plc/aggregate.py | 2 +- sfa/rspecs/elements/versions/pgv2Node.py | 16 +++---- .../elements/versions/pgv2SliverType.py | 2 +- sfa/rspecs/elements/versions/sfav1Node.py | 3 +- sfa/rspecs/elements/versions/sfav1Sliver.py | 2 +- sfa/rspecs/versions/pgv2.py | 48 +++++++++---------- sfa/rspecs/versions/sfav1.py | 26 +++++----- sfa/util/xml.py | 9 ++-- 9 files changed, 57 insertions(+), 54 deletions(-) diff --git a/sfa/client/sfiAddSliver.py b/sfa/client/sfiAddSliver.py index 7e3ce2c2..84ffa8b0 100755 --- a/sfa/client/sfiAddSliver.py +++ b/sfa/client/sfiAddSliver.py @@ -36,9 +36,8 @@ try: version_num = ad_rspec.version.version request_version = version_manager._get_version(type, version_num, 'request') request_rspec = RSpec(version=request_version) - slivers = [{'hostname': node} for node in nodes] request_rspec.version.merge(ad_rspec) - request_rspec.version.add_slivers(slivers) + request_rspec.version.add_slivers(nodes) except: logger.log_exc("sfiAddSliver failed with nodes %s" % nodes) sys.exit(1) diff --git a/sfa/plc/aggregate.py b/sfa/plc/aggregate.py index 40e53aa4..c1f008fc 100644 --- a/sfa/plc/aggregate.py +++ b/sfa/plc/aggregate.py @@ -195,7 +195,7 @@ class Aggregate: for if_id in node['interface_ids']: interface = Interface(interfaces[if_id]) interface['ipv4'] = interface['ipv4'] - interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)) + interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)).get_urn() rspec_node['interfaces'].append(interface) if_count+=1 diff --git a/sfa/rspecs/elements/versions/pgv2Node.py b/sfa/rspecs/elements/versions/pgv2Node.py index f0a0a7ba..e5ec58b4 100644 --- a/sfa/rspecs/elements/versions/pgv2Node.py +++ b/sfa/rspecs/elements/versions/pgv2Node.py @@ -1,9 +1,9 @@ from sfa.util.plxrn import PlXrn, xrn_to_hostname from sfa.util.xrn import Xrn +from sfa.util.xml import XpathFilter from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.node import Node from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.network import Network from sfa.rspecs.elements.location import Location from sfa.rspecs.elements.hardware_type import HardwareType from sfa.rspecs.elements.disk_image import DiskImage @@ -31,7 +31,7 @@ class PGv2Node: # set location location_elems = Element.add_elements(node_elem, 'location', node.get('location', []), Location.fields) # set interfaces - interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), Interface.fields) + interface_elems = Element.add_elements(node_elem, 'interface', node.get('interfaces', []), ['component_id', 'client_id', 'ipv4']) # set available element if node.get('boot_state', '').lower() == 'boot': available_elem = node_elem.add_element('available', now='True') @@ -59,13 +59,13 @@ class PGv2Node: return PGv2Node.get_node_objs(node_elems) @staticmethod - def get_nodes_with_sliver(xml, filter={}): + def get_nodes_with_slivers(xml, filter={}): xpath = '//node/sliver_type | //default:node/default:sliver_type' node_elems = xml.xpath(xpath) return PGv2Node.get_node_objs(node_elems) @staticmethod - def get_nodes_objs(node_elems): + def get_node_objs(node_elems): nodes = [] for node_elem in node_elems: node = Node(node_elem.attrib, node_elem) @@ -74,15 +74,15 @@ class PGv2Node: node['authority_id'] = Xrn(node_elem.attrib['component_id']).get_authority_urn() node['hardware_types'] = Element.get_elements(node_elem, './default:hardwate_type | ./hardware_type', HardwareType) - lolocation_elems = Element.get_elements(node_elem, './default:location | ./location', Location) + location_elems = Element.get_elements(node_elem, './default:location | ./location', Location) if len(location_elems) > 0: node['location'] = location_elems[0] node['interfaces'] = Element.get_elements(node_elem, './default:interface | ./interface', Interface) node['services'] = PGv2Services.get_services(node_elem) node['slivers'] = PGv2SliverType.get_slivers(node_elem) - available = Element.get_elements(node_element, './default:available | ./available', fields=['now']) - if len(available) > 0 and 'name' in available[0].attrib: - if available[0].attrib.get('now', '').lower() == 'true': + available_elem = Element.get_elements(node_elem, './default:available | ./available', fields=['now']) + if len(available_elem) > 0 and 'name' in available_elem[0]: + if available_elem[0].get('now', '').lower() == 'true': node['boot_state'] = 'boot' else: node['boot_state'] = 'disabled' diff --git a/sfa/rspecs/elements/versions/pgv2SliverType.py b/sfa/rspecs/elements/versions/pgv2SliverType.py index 7ea9d1d3..c0715321 100644 --- a/sfa/rspecs/elements/versions/pgv2SliverType.py +++ b/sfa/rspecs/elements/versions/pgv2SliverType.py @@ -29,7 +29,7 @@ class PGv2SliverType: sliver_elems = xml.xpath(xpath) slivers = [] for sliver_elem in sliver_elems: - sliver = Sliver(sliver_elem.attrib,sliver_elm) + sliver = Sliver(sliver_elem.attrib,sliver_elem) if 'component_id' in xml.attrib: sliver['component_id'] = xml.attrib['component_id'] slivers.append(sliver) diff --git a/sfa/rspecs/elements/versions/sfav1Node.py b/sfa/rspecs/elements/versions/sfav1Node.py index f93ff323..f62cc718 100644 --- a/sfa/rspecs/elements/versions/sfav1Node.py +++ b/sfa/rspecs/elements/versions/sfav1Node.py @@ -2,7 +2,6 @@ from sfa.util.sfalogging import logger from sfa.util.xml import XpathFilter from sfa.util.plxrn import PlXrn, xrn_to_hostname from sfa.util.xrn import Xrn - from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.node import Node from sfa.rspecs.elements.sliver import Sliver @@ -54,7 +53,7 @@ class SFAv1Node: location_elems = Element.add_elements(node_elem, 'location', node.get('location', []), Location.fields) interface_elems = Element.add_elements(node_elem, 'interface', - node.get('interfaces', []), Interface.fields) + node.get('interfaces', []), ['component_id', 'client_id', 'ipv4']) #if 'bw_unallocated' in node and node['bw_unallocated']: # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) diff --git a/sfa/rspecs/elements/versions/sfav1Sliver.py b/sfa/rspecs/elements/versions/sfav1Sliver.py index 20ffdf86..d0a7592b 100644 --- a/sfa/rspecs/elements/versions/sfav1Sliver.py +++ b/sfa/rspecs/elements/versions/sfav1Sliver.py @@ -39,4 +39,4 @@ class SFAv1Sliver: @staticmethod def get_sliver_attributes(xml, filter={}): - return SFAv1PLTag.get_pl_tags(xml, ignore=Sliver.fields.keys()) + return SFAv1PLTag.get_pl_tags(xml, ignore=Sliver.fields) diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index d1d7f5f0..ceff971b 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -2,7 +2,7 @@ from copy import deepcopy from StringIO import StringIO from sfa.util.xrn import urn_to_sliver_id from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname -from sfa.rspecs.rspec_version import BaseVersion +from sfa.rspecs.baseversion import BaseVersion from sfa.rspecs.elements.versions.pgv2Link import PGv2Link from sfa.rspecs.elements.versions.pgv2Node import PGv2Node from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType @@ -47,26 +47,22 @@ class PGv2(BaseVersion): # this is untested self.xml.root.append(deepcopy(source_node_tag)) - def get_nodes_with_slivers(self, network=None): - if network: - nodes = self.xml.xpath('//default:node[@component_manager_id="%s"][sliver_type]/@component_id' % network, namespaces=self.namespaces) - else: - nodes = self.xml.xpath('//default:node[default:sliver_type]/@component_id', namespaces=self.namespaces) - nodes = [xrn_to_hostname(node) for node in nodes] - return nodes - # Slivers def get_sliver_attributes(self, hostname, network=None): - node = self.get_node_element(hostname, network) - sliver = node.xpath('./default:sliver_type', namespaces=self.namespaces) - if sliver is not None and isinstance(sliver, list): - sliver = sliver[0] - return self.attributes_list(sliver) + 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_type', 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(network) + nodes_with_slivers = self.get_nodes_with_slivers() # TODO: default sliver attributes in the PG rspec? default_ns_prefix = self.namespaces['default'] for node in nodes_with_slivers: @@ -125,26 +121,28 @@ class PGv2(BaseVersion): # remove existing sliver_type tags for sliver_type in node_elem.get('slivers', []): - node_elem.remove(sliver_type) + node_elem.element.remove(sliver_type.element) # set the client id - node.set('client_id', hostname) + node_elem.element.set('client_id', hostname) if sliver_urn: + pass + # TODO # set the sliver id - slice_id = sliver_info.get('slice_id', -1) - node_id = sliver_info.get('node_id', -1) - sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) - node_elem.set('sliver_id', sliver_id) + #slice_id = sliver_info.get('slice_id', -1) + #node_id = sliver_info.get('node_id', -1) + #sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) + #node_elem.set('sliver_id', sliver_id) # add the sliver type elemnt - PGv1Sliver.add_slivers(node_elem, sliver) + PGv2SliverType.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: for node_elem in self.get_nodes(): - if not node['client_id']: - parent = node.getparent() - parent.remove(node_elem) + if not node_elem['client_id']: + parent = node_elem.element.getparent() + parent.remove(node_elem.element) def remove_slivers(self, slivers, network=None, no_dupes=False): PGv2Node.remove_slivers(self.xml, slivers) diff --git a/sfa/rspecs/versions/sfav1.py b/sfa/rspecs/versions/sfav1.py index 35d17f7e..85aa86e6 100644 --- a/sfa/rspecs/versions/sfav1.py +++ b/sfa/rspecs/versions/sfav1.py @@ -4,11 +4,11 @@ from lxml import etree from sfa.util.sfalogging import logger from sfa.util.xrn import hrn_to_urn, urn_to_hrn from sfa.util.plxrn import PlXrn - from sfa.rspecs.baseversion import BaseVersion from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.versions.pgv2Link import PGv2Link from sfa.rspecs.elements.versions.sfav1Node import SFAv1Node +from sfa.rspecs.elements.versions.sfav1Sliver import SFAv1Sliver class SFAv1(BaseVersion): enabled = True @@ -73,15 +73,19 @@ class SFAv1(BaseVersion): return self.attributes_list_thierry(defaults) def get_sliver_attributes(self, hostname, network=None): - node = self.get_node_element(hostname, network) - #sliver = node.find("sliver") - slivers = node.xpath('./sliver') - if not slivers: return [] - return self.attributes_list_thierry(slivers[0]) + 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(network) + 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]), @@ -112,14 +116,14 @@ class SFAv1(BaseVersion): if not node_elems: continue node_elem = node_elems[0] - SFAv1Sliver.add_slivers(node_elem, sliver) + SFAv1Sliver.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: for node_elem in self.get_nodes(): - if not node['slivers']: - parent = node.getparent() - parent.remove(node_elem) + if not node_elem['slivers']: + parent = node_elem.element.getparent() + parent.remove(node_elem.element) def remove_slivers(self, slivers, network=None, no_dupes=False): diff --git a/sfa/util/xml.py b/sfa/util/xml.py index 9d5f52c4..bb298a3f 100755 --- a/sfa/util/xml.py +++ b/sfa/util/xml.py @@ -64,7 +64,7 @@ class XmlNode: def getparent(self): return XmlNode(self.node.getparent(), self.namespaces) - def remove_elements(name): + def remove_elements(self, name): """ Removes all occurences of an element from the tree. Start at specified root_node if specified, otherwise start at tree's root. @@ -77,8 +77,11 @@ class XmlNode: parent = element.getparent() parent.remove(element) - def remove(element): - self.node.remove(element) + def remove(self, element): + if isinstance(element, XmlNode): + self.node.remove(element.node) + else: + self.node.remove(element) def get(self, key, *args): return self.node.get(key, *args) -- 2.43.0