From 72d6d87bf9d0402c2f7bf67adf7f1801de21a1ec Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Fri, 3 Sep 2021 21:07:52 +0100 Subject: [PATCH] working around flaky ruckus kit --- lib/SNMP/Info/Layer3/Foundry.pm | 56 ++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/lib/SNMP/Info/Layer3/Foundry.pm b/lib/SNMP/Info/Layer3/Foundry.pm index 2fcb8d76..229b5cb9 100644 --- a/lib/SNMP/Info/Layer3/Foundry.pm +++ b/lib/SNMP/Info/Layer3/Foundry.pm @@ -296,22 +296,62 @@ sub interfaces { sub set_i_vlan { my ($foundry, $vlan, $iid) = @_; - my %if_map = reverse %{ $foundry->snSwPortIfIndex || {} }; - my $target = $if_map{$iid}; my $i_vlan = $foundry->i_vlan($iid); - if ( defined $i_vlan and defined $target ) { + if ( defined $i_vlan ) { print - "Changing VLAN from $i_vlan->{$iid} to $vlan on IfIndex: $iid ($target)\n" + "Changing VLAN from $i_vlan->{$iid} to $vlan on IfIndex: $iid\n" if $foundry->debug(); - my $rv = $foundry->set_snSwPortVlanId( $vlan, $target ); - unless ($rv) { + # quietly try to remove new vlan association + $foundry->set_snVLanByPortMemberRowStatus( 3, "${vlan}.${iid}" ); + sleep 1; + # try to remove old vlan association + my $rv_rem = $foundry->set_snVLanByPortMemberRowStatus( 3, "$i_vlan->{$iid}.$iid" ); + sleep 1; + + unless ($rv_rem) { + print "Unable to remove untagged(?) VLAN $i_vlan->{$iid} from IfIndex: $iid\n" + if $foundry->debug(); + # $foundry->error_throw( + # "Unable to remove VLAN $i_vlan->{$iid} from interface: $iid"); + # return; + } + + # try to add new one untagged + my $rv_add = $foundry->set_multi( + ['snVLanByPortMemberRowStatus', "${vlan}.${iid}", 4], + ['snVLanByPortMemberTagMode', "${vlan}.${iid}", 2], + ); + sleep 1; + + unless ($rv_add) { + print "Unable to add untagged VLAN $vlan to IfIndex: $iid\n" + if $foundry->debug(); + + # did not work to add new untagged so add tagged + my $rv_add_tagged = $foundry->set_multi([ + ['snVLanByPortMemberRowStatus', "${vlan}.${iid}", 4], + ['snVLanByPortMemberTagMode', "${vlan}.${iid}", 1], + ]); + sleep 1; + + if ($rv_add_tagged) { + my $rv_change_untagged = $foundry->set_snVLanByPortMemberTagMode( 2, "${vlan}.${iid}" ); + sleep 1; + return $rv_change_untagged if $rv_change_untagged; + } + + # try to remove old vlan association + # $foundry->set_snVLanByPortMemberRowStatus( 3, "${vlan}.${iid}" ); + + # then change to untagged $foundry->error_throw( - "Unable to change VLAN to $vlan on IfIndex: $iid"); + "Unable to add VLAN $vlan to interface: $iid"); return; } - return $rv; + + return $rv_add; } $foundry->error_throw("Can't find ifIndex: $iid - Is it an access port?"); return;