Skip to content

Commit 1261930

Browse files
SuvarnaMeenakshimssonicbld
authored andcommitted
Fix to use IPv6 linklocal address as snmp agent address (sonic-net#3215)
What I did If link local IPv6 address is added as SNMP agent address, it will fail. This PR requires changes in snmpd.conf.j2 template here sonic-net/sonic-buildimage#18350 How I did it Append scope id to ipv6 link local IP address. How to verify it Able to configure link local ipv6 address as snmp agent address sudo config snmpagentaddress add fe80::a%eth0
1 parent 259a37d commit 1261930

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

config/main.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -3460,7 +3460,10 @@ def add_snmp_agent_address(ctx, agentip, port, vrf):
34603460
"""Add the SNMP agent listening IP:Port%Vrf configuration"""
34613461

34623462
#Construct SNMP_AGENT_ADDRESS_CONFIG table key in the format ip|<port>|<vrf>
3463-
if not clicommon.is_ipaddress(agentip):
3463+
# Link local IP address should be provided along with zone id
3464+
# <link_local_ip>%<zone_id> for ex fe80::1%eth0
3465+
agent_ip_addr = agentip.split('%')[0]
3466+
if not clicommon.is_ipaddress(agent_ip_addr):
34643467
click.echo("Invalid IP address")
34653468
return False
34663469
config_db = ctx.obj['db']
@@ -3470,7 +3473,7 @@ def add_snmp_agent_address(ctx, agentip, port, vrf):
34703473
click.echo("ManagementVRF is Enabled. Provide vrf.")
34713474
return False
34723475
found = 0
3473-
ip = ipaddress.ip_address(agentip)
3476+
ip = ipaddress.ip_address(agent_ip_addr)
34743477
for intf in netifaces.interfaces():
34753478
ipaddresses = netifaces.ifaddresses(intf)
34763479
if ip_family[ip.version] in ipaddresses:

tests/config_snmp_test.py

+28
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,34 @@ def test_config_snmp_community_add_new_community_with_invalid_type_yang_validati
877877
assert result.exit_code != 0
878878
assert 'SNMP community configuration failed' in result.output
879879

880+
@patch('netifaces.interfaces', mock.Mock(return_value=['eth0']))
881+
@patch('netifaces.ifaddresses', mock.Mock(return_value={2:
882+
[{'addr': '10.1.0.32', 'netmask': '255.255.255.0',
883+
'broadcast': '10.1.0.255'}],
884+
10: [{'addr': 'fe80::1%eth0', 'netmask': 'ffff:ffff:ffff:ffff::/64'}]}))
885+
@patch('os.system', mock.Mock(return_value=0))
886+
def test_config_snmpagentaddress_add_linklocal(self):
887+
db = Db()
888+
obj = {'db': db.cfgdb}
889+
runner = CliRunner()
890+
runner.invoke(config.config.commands["snmpagentaddress"].commands["add"], ["fe80::1%eth0"], obj=obj)
891+
assert ('fe80::1%eth0', '', '') in db.cfgdb.get_keys('SNMP_AGENT_ADDRESS_CONFIG')
892+
assert db.cfgdb.get_entry("SNMP_AGENT_ADDRESS_CONFIG", "fe80::1%eth0||") == {}
893+
894+
@patch('netifaces.interfaces', mock.Mock(return_value=['eth0']))
895+
@patch('netifaces.ifaddresses', mock.Mock(return_value={2:
896+
[{'addr': '10.1.0.32', 'netmask': '255.255.255.0',
897+
'broadcast': '10.1.0.255'}],
898+
10: [{'addr': 'fe80::1', 'netmask': 'ffff:ffff:ffff:ffff::/64'}]}))
899+
@patch('os.system', mock.Mock(return_value=0))
900+
def test_config_snmpagentaddress_add_ipv4(self):
901+
db = Db()
902+
obj = {'db': db.cfgdb}
903+
runner = CliRunner()
904+
runner.invoke(config.config.commands["snmpagentaddress"].commands["add"], ["10.1.0.32"], obj=obj)
905+
assert ('10.1.0.32', '', '') in db.cfgdb.get_keys('SNMP_AGENT_ADDRESS_CONFIG')
906+
assert db.cfgdb.get_entry("SNMP_AGENT_ADDRESS_CONFIG", "10.1.0.32||") == {}
907+
880908
@classmethod
881909
def teardown_class(cls):
882910
print("TEARDOWN")

0 commit comments

Comments
 (0)