Source code for pyhpecw7.features.neighbor

"""Gather LLDP neighbor information from HPCOM7 devices.
"""
from lxml import etree
from ncclient.xml_ import qualify
from pyhpecw7.utils.xml.namespaces import HPDATA, HPDATA_C
from pyhpecw7.utils.xml.lib import *


[docs]class Neighbors(object): """Gather LLDP neighbor information from a HP COM7 switch. Args: device (HPCOM7): connected instance of a ``pyhpecw7.comware.HPCOM7`` object. Attributes: device (HPCOM7): connected instance of a ``pyhpecw7.comware.HPCOM7`` object. lldp (lldp): dictionary containing LLDP neighbors cdp (cdp): dictionary containing CDP neighbors """ def __init__(self, device): self.device = device self.lldp = self._get_neighbors(ntype='lldp') self.cdp = self._get_neighbors(ntype='cdp') def _get_interface_from_index(self, index): """ Returns interface name based on a given ifindex """ E = data_element_maker() top = E.top( E.Ifmgr( E.Interfaces( E.Interface( E.IfIndex(index), E.Name() ) ) ) ) nc_get_reply = self.device.get(('subtree', top)) interface_name = find_in_data('Name', nc_get_reply.data_ele).text return interface_name
[docs] def refresh(self): """Refreshes the "ldp" and "cdp" attributes of the class """ self.lldp = self._get_neighbors(ntype='lldp') self.cdp = self._get_neighbors(ntype='cdp')
def _get_neighbors(self, ntype='lldp'): """Gets neighbors of device (HPCOM7) Args: ntype (str): must be "lldp" or "cdp" Returns: List of dicts with the following k/v pairs: :local_intf (str): local interface of HP device :neighbor_intf (str): remote interface of the neighbor device :neighbor (str): hostname of the neighbor device for lldp and mgmt IP addr when cdp """ E = data_element_maker() if ntype == 'cdp': top = E.top( E.LLDP( E.CDPNeighbors( E.CDPNeighbor() ) ) ) else: top = E.top( E.LLDP( E.LLDPNeighbors( E.LLDPNeighbor() ) ) ) nc_get_reply = self.device.get(('subtree', top)) return self._build_response(nc_get_reply.data_ele, ntype=ntype) def _build_response(self, nc_reply, ntype='lldp'): """Builds dictionary from XML response coming from device Args: nc_reply (lxml.etree._Element): NETCONF response from device as etree element Returns: It returns a list of dictionary objects and each neighbor is represented as a dictionary object with the following k/v pairs: :local_intf (str): local interface of HP device :neighbor_intf (str): remote interface of the neighbor device :neighbor (str): hostname of the neighbor device for lldp and mgmt IP addr when cdp """ if ntype == 'lldp': key_map = { 'neighbor': 'SystemName', 'neighbor_intf': 'PortId', } neighbors = findall_in_data('LLDPNeighbor', nc_reply) else: key_map = { 'neighbor': 'ManageAdress', 'neighbor_intf': 'PortId', } neighbors = findall_in_data('CDPNeighbor', nc_reply) return_neigh = [] for neigh in neighbors: temp = {} index = find_in_data('IfIndex', neigh).text interface = self._get_interface_from_index(index) temp['local_intf'] = interface for new_key, xml_tag in key_map.items(): obj = find_in_data(xml_tag, neigh) if obj is not None: value = obj.text temp[new_key] = value return_neigh.append(temp) return return_neigh