#528 record egress untagged vlans in device_port_vlan table
This commit is contained in:
@@ -11,7 +11,7 @@ __PACKAGE__->load_namespaces(
|
|||||||
);
|
);
|
||||||
|
|
||||||
our # try to hide from kwalitee
|
our # try to hide from kwalitee
|
||||||
$VERSION = 56; # schema version used for upgrades, keep as integer
|
$VERSION = 57; # schema version used for upgrades, keep as integer
|
||||||
|
|
||||||
use Path::Class;
|
use Path::Class;
|
||||||
use File::ShareDir 'dist_dir';
|
use File::ShareDir 'dist_dir';
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ __PACKAGE__->add_columns(
|
|||||||
{ data_type => "integer", is_nullable => 0 },
|
{ data_type => "integer", is_nullable => 0 },
|
||||||
"native",
|
"native",
|
||||||
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
|
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
|
||||||
|
"egress_tag",
|
||||||
|
{ data_type => "boolean", default_value => \"true", is_nullable => 0 },
|
||||||
"creation",
|
"creation",
|
||||||
{
|
{
|
||||||
data_type => "timestamp",
|
data_type => "timestamp",
|
||||||
|
|||||||
@@ -18,35 +18,24 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
my $v_name = $snmp->v_name;
|
my $v_name = $snmp->v_name;
|
||||||
my $v_index = $snmp->v_index;
|
my $v_index = $snmp->v_index;
|
||||||
|
|
||||||
# build device vlans suitable for DBIC
|
|
||||||
my %v_seen = ();
|
|
||||||
my @devicevlans;
|
|
||||||
foreach my $entry (keys %$v_name) {
|
|
||||||
my $vlan = $v_index->{$entry};
|
|
||||||
next unless defined $vlan and $vlan;
|
|
||||||
++$v_seen{$vlan};
|
|
||||||
|
|
||||||
push @devicevlans, {
|
|
||||||
vlan => $vlan,
|
|
||||||
description => $v_name->{$entry},
|
|
||||||
last_discover => \'now()',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
# cache the device ports to save hitting the database for many single rows
|
# cache the device ports to save hitting the database for many single rows
|
||||||
my $device_ports = vars->{'device_ports'}
|
my $device_ports = vars->{'device_ports'}
|
||||||
|| { map {($_->port => $_)} $device->ports->all };
|
|| { map {($_->port => $_)} $device->ports->all };
|
||||||
|
|
||||||
my $i_vlan = $snmp->i_vlan;
|
my $i_vlan = $snmp->i_vlan;
|
||||||
my $i_vlan_membership = $snmp->i_vlan_membership;
|
|
||||||
my $i_vlan_type = $snmp->i_vlan_type;
|
my $i_vlan_type = $snmp->i_vlan_type;
|
||||||
my $interfaces = $snmp->interfaces;
|
my $interfaces = $snmp->interfaces;
|
||||||
|
my $i_vlan_membership = $snmp->i_vlan_membership;
|
||||||
|
my $i_vlan_membership_untagged = $snmp->i_vlan_membership_untagged;
|
||||||
|
|
||||||
# build device port vlans suitable for DBIC
|
my %p_seen = ();
|
||||||
my @portvlans = ();
|
my @portvlans = ();
|
||||||
foreach my $entry (keys %$i_vlan_membership) {
|
|
||||||
|
# build port vlans suitable for DBIC
|
||||||
|
foreach my $entry (keys %$i_vlan_membership_untagged, keys %$i_vlan_membership) {
|
||||||
my %port_vseen = ();
|
my %port_vseen = ();
|
||||||
my $port = $interfaces->{$entry} or next;
|
my $port = $interfaces->{$entry} or next;
|
||||||
|
my $type = $i_vlan_type->{$entry};
|
||||||
|
|
||||||
if (!defined $device_ports->{$port}) {
|
if (!defined $device_ports->{$port}) {
|
||||||
debug sprintf ' [%s] vlans - local port %s already skipped, ignoring',
|
debug sprintf ' [%s] vlans - local port %s already skipped, ignoring',
|
||||||
@@ -54,8 +43,6 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $type = $i_vlan_type->{$entry};
|
|
||||||
|
|
||||||
foreach my $vlan (@{ $i_vlan_membership->{$entry} }) {
|
foreach my $vlan (@{ $i_vlan_membership->{$entry} }) {
|
||||||
next unless defined $vlan and $vlan;
|
next unless defined $vlan and $vlan;
|
||||||
next if ++$port_vseen{$vlan} > 1;
|
next if ++$port_vseen{$vlan} > 1;
|
||||||
@@ -65,31 +52,30 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
port => $port,
|
port => $port,
|
||||||
vlan => $vlan,
|
vlan => $vlan,
|
||||||
native => $native,
|
native => $native,
|
||||||
|
egress_tag => 't',
|
||||||
vlantype => $type,
|
vlantype => $type,
|
||||||
last_discover => \'now()',
|
last_discover => \'now()',
|
||||||
};
|
};
|
||||||
|
++$p_seen{$vlan};
|
||||||
|
}
|
||||||
|
|
||||||
next if $v_seen{$vlan};
|
foreach my $vlan (@{ $i_vlan_membership_untagged->{$entry} }) {
|
||||||
|
next unless defined $vlan and $vlan;
|
||||||
|
next if ++$port_vseen{$vlan} > 1;
|
||||||
|
|
||||||
# also add an unnamed vlan to the device
|
my $native = ((defined $i_vlan->{$entry}) and ($vlan eq $i_vlan->{$entry})) ? "t" : "f";
|
||||||
push @devicevlans, {
|
push @portvlans, {
|
||||||
|
port => $port,
|
||||||
vlan => $vlan,
|
vlan => $vlan,
|
||||||
description => (sprintf "VLAN %d", $vlan),
|
native => $native,
|
||||||
|
egress_tag => 'f',
|
||||||
|
vlantype => $type,
|
||||||
last_discover => \'now()',
|
last_discover => \'now()',
|
||||||
};
|
};
|
||||||
++$v_seen{$vlan};
|
++$p_seen{$vlan};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
schema('netdisco')->txn_do(sub {
|
|
||||||
my $gone = $device->vlans->delete;
|
|
||||||
debug sprintf ' [%s] vlans - removed %d device VLANs',
|
|
||||||
$device->ip, $gone;
|
|
||||||
$device->vlans->populate(\@devicevlans);
|
|
||||||
debug sprintf ' [%s] vlans - added %d new device VLANs',
|
|
||||||
$device->ip, scalar @devicevlans;
|
|
||||||
});
|
|
||||||
|
|
||||||
schema('netdisco')->txn_do(sub {
|
schema('netdisco')->txn_do(sub {
|
||||||
my $gone = $device->port_vlans->delete;
|
my $gone = $device->port_vlans->delete;
|
||||||
debug sprintf ' [%s] vlans - removed %d port VLANs',
|
debug sprintf ' [%s] vlans - removed %d port VLANs',
|
||||||
@@ -99,6 +85,41 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
return Status->info(sprintf ' [%s] vlans - added %d new port VLANs',
|
return Status->info(sprintf ' [%s] vlans - added %d new port VLANs',
|
||||||
$device->ip, scalar @portvlans);
|
$device->ip, scalar @portvlans);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
my %d_seen = ();
|
||||||
|
my @devicevlans = ();
|
||||||
|
|
||||||
|
# add unnamed vlans to the device
|
||||||
|
foreach my $entry (keys %$v_name) {
|
||||||
|
my $vlan = $v_index->{$entry};
|
||||||
|
next unless defined $vlan and $vlan;
|
||||||
|
++$d_seen{$vlan};
|
||||||
|
|
||||||
|
push @devicevlans, {
|
||||||
|
vlan => $vlan,
|
||||||
|
description => $v_name->{$entry},
|
||||||
|
last_discover => \'now()',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# also add unnamed vlans to the device
|
||||||
|
foreach my $vlan (keys %p_seen) {
|
||||||
|
next if $d_seen{$vlan};
|
||||||
|
push @devicevlans, {
|
||||||
|
vlan => $vlan,
|
||||||
|
description => (sprintf "VLAN %d", $vlan),
|
||||||
|
last_discover => \'now()',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
schema('netdisco')->txn_do(sub {
|
||||||
|
my $gone = $device->vlans->delete;
|
||||||
|
debug sprintf ' [%s] vlans - removed %d device VLANs',
|
||||||
|
$device->ip, $gone;
|
||||||
|
$device->vlans->populate(\@devicevlans);
|
||||||
|
debug sprintf ' [%s] vlans - added %d new device VLANs',
|
||||||
|
$device->ip, scalar @devicevlans;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
true;
|
true;
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE device_port_vlan ADD COLUMN "egress_tag" boolean not null default false;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
Reference in New Issue
Block a user