Перейти к содержанию

Interface Description

Интерфейс для взаимодействия с опросом линковки по описаниям (Description) интерфейсов. Запускается в рамках опроса ifdescr, если выбран в настройках ManagedObjectProfile - настройка ifdescr_handler.

Interface Description применяется в ходе опроса IfDescr.

interface_description(managed_object, interface):
    Implements Interace Description

    :param managed_object: Managed Object instance
    :param interface: Interface instance
    :returns:

Примеры

Построение линков по hostname в дескрипшенах

Позволяет соединять (Linking) устройства в описаниях интерфейсов которых указан hostname соседа. device1 - hostname2 <-> hostname1 device2. Возвращает интерфейс соседа с котором необходимо соединить локальный интерфейсу.

# Python modules
import re
import logging

# NOC modules
from noc.inv.models.discoveryid import DiscoveryID
from noc.inv.models.interface import Interface
from noc.sa.models.managedobject import ManagedObject

logger = logging.getLogger()

rx_hostname_default = re.compile(r"(?P<hostname>\S+)")


def handler(o: ManagedObject, iface: Interface):
    logger.debug("Linking o %s, iface: %s" % (o, iface))
    rx_hostname = iface.profile.ifdesc_patterns or rx_hostname_default
    match = rx_hostname.search(iface.description)
    if match:
        # Find remote object by hostname
        rdid = DiscoveryID.objects.filter(hostname__icontains=match.group("hostname")).first()
        if not rdid:
            logger.warning("Not find remote object by hostname: %s", match.group("hostname"))
            logger.info("Not find remote_object")
            return None
        # Find local hostname on DiscoveryID
        ldid = DiscoveryID.objects.get(object=o.id)
        if not ldid.hostname:
            logger.info("Not find hostname for local Object")
            return None
        # Find RemoteInterface by description
        ri = Interface.objects.filter(
            managed_object=rdid.object, description__icontains=ldid.hostname
        ).first()
        if ri:
            return ri
        logger.info("Not find interface")
    return None