Retrieve vrf interfaces (#366)

Allow to retrieve the VRF interface for some devices (used for Nexus devices).
The SNMP::Info::Layer3::Nexus module should have the patch to retrieve the VRF context.
And the context should have been created on Nexus device
This commit is contained in:
Ambroise
2018-01-28 19:28:07 +01:00
committed by Oliver Gorwits
parent b1abf826dc
commit 0bc5c68ed8

View File

@@ -8,7 +8,9 @@ use App::Netdisco::Transport::SNMP ();
use App::Netdisco::Util::Permission 'check_acl_no';
use App::Netdisco::Util::FastResolver 'hostnames_resolve_async';
use App::Netdisco::Util::DNS 'hostname_from_ip';
use App::Netdisco::Util::SNMP 'snmp_comm_reindex';
use Dancer::Plugin::DBIC 'schema';
use Scope::Guard 'guard';
use NetAddr::IP::Lite ':lower';
use Encode;
@@ -23,6 +25,19 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub {
my $interfaces = $snmp->interfaces;
my $ip_netmask = $snmp->ip_netmask;
# Get IP Table peer VRF if supported
my @vrf_list = _get_vrf_list($device, $snmp);
{
my $guard = guard { snmp_comm_reindex($snmp, $device, 0, 0) };
foreach my $vrf (@vrf_list) {
snmp_comm_reindex($snmp, $device, $vrf, 0);
$ip_index = { %$ip_index , %{$snmp->ip_index} };
$interfaces = { %$interfaces , %{$snmp->interfaces} };
$ip_netmask = { %$ip_netmask , %{$snmp->ip_netmask} };
}
}
# build device aliases suitable for DBIC
my @aliases;
foreach my $entry (keys %$ip_index) {
@@ -242,4 +257,26 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub {
});
});
# return a list of VRF which are OK to connect
sub _get_vrf_list {
my ($device, $snmp) = @_;
return () if !$snmp->cisco_comm_indexing;
my @ok_vrfs = ();
my $vrf_name = $snmp->vrf_name || {};
while (my ($idx, $vrf) = each(%$vrf_name)) {
if ($vrf =~ /^\S+$/) {
my $ctx_name = pack("C*",split(/\./,$idx));
$ctx_name =~ s/.*[^[:print:]]+//;
debug sprintf(' [%s] Discover VRF %s with SNMP Context %s', $device->ip, $vrf, $ctx_name);
push (@ok_vrfs,$ctx_name);
}
}
return @ok_vrfs;
}
true;