Дополнительная инфа при создании ноды

Started by Argonauts, February 10, 2026, 09:42:04 AM

Previous topic - Next topic

Argonauts

Доброго дня!
Пытаюсь выцепить информацию о порте, куда подключен интерфейс ноды - вкладка Interfaces, столбцы Peer Node\Interface\IP. Не получается разобраться как их вообще запросить - класс Interface содержит в себе peerNode и peerInterface, но они оба отдают одинаковую инфу о именно комуте Cisco, куда подключено устройство
for (int : $node.interfaces){
if(int.ifIndex != 1){
macAd = int.macAddr;
iNode = int.peerNode;
println(iNode.ipAddr);
}
}
Если же обращаться далее к интерфейсам уже на комуте, на который попадаю, то интерфейсы могут отдать нормально инфу по имени интерфейса, alias, дескрипшену и т.п. но запрос peerNode или peerInterface отдает идентичный ответ на всех интерфейсах. Из UI клиента видно, что сама по себе инфа о интерфейсах на комуте корректная - разные подключения, мак адреса, ip, имена и т.п.
for (int : $node.interfaces){
if(int.ifIndex != 1){
macAd = int.macAddr;
iNode = int.peerNode;
for (ii : iNode.interfaces)
println(ii.peerNode);

}
}
Как мне выделить конкретно информацию о порте и адресе коммутатора, куда подключена нода?
Условно

Argonauts

Все еще актуально
Или таковую инфу только с самой базы запрашивать sql запросом?

Filipp Sudanov

А что-нибудь такое:

  for (iface : $node.interfaces)                                                                                                                 
  {                                                                                                                                              
      peerIface = iface.peerInterface;
      if (peerIface != null)                                                                                                                     
      {                                              
          println("Port " .. peerIface.name .. " on " .. iface.peerNode.name);
      }                                                                                                                                          
  }

Argonauts

Работает, принт отдает нужную инфу.
Как функционируют цепочки параметров?
Вот это имеется ввиду iface.peerNode.name - на сколько глубоко оно может уходить? Пробовал так построить в другом скрипте, постоянно ошибки ловил

Вопрос 2
В какой момент происходит запись информации о peer ноде интерфейса? Я так понимаю в момент SYS_NODE_ADDED этой инфы не существует еще т.к. в обнаруженных нодах оно появляется не сразу, а сия конструкция не добавляет в ивент новых пунктов
peerInfo = [];
for(iface : $node.interfaces)
{
peerIface = iface.peerInterface;
if (peerIface != null)
{
peerIF.append(peerIface.name);
peerN.append(iface.peerNode.name);
$event.addParameter("PeerIface", peerIF.join(", "));
$event.addParameter("PeerNode", peerN.join(", "));
}

}

Filipp Sudanov

Цепочка может уходить весьма глубоко, можно например

for (i : $node.interfaces) {
  println(i.peerInterface.node.name);
}

Не обязательно писать цепочкой, можно раскапывать по одному шагу и сохранять в переменные:

for (i : $node.interfaces) {
  p = i.peerInterface;
  n = p.node;
  name = n.name;
  println(name);
}

но может оказаться, что в этой цепочке какой-то атрибут является null, а не объектом, и тогда все ломается в примере выше, если переменная p будет null, то в следующей строчке, где мы делаем p.node, то есть пытаемся получить атрибут node мы не можем этого сделать, потому что у null нет такого атрибута. Чтоб не ломалось, можно делать проверки в тех местах, которые могут оказаться null, например peerInterface:

for (i : $node.interfaces) {
  p = i.peerInterface;
  if (p != null) {
    println(p.node.name);
  }
}

Или использовать новый синтаксис, появившийся в версии 4.5, называется это safe dereference и если кто-то и окажется null, то попытка обратиться к его атрибуту не завершится ошибкой. Но .? должыть быть в цепочке начиная с первого места, которое может оказаться null и до конца цепочки:

for (i : $node.interfaces) {
  println(i.peerInterface?.node?.name);
}

Peer ноды определяются во время topology poll