[SNMP]: Modify minigraph parser to update SNMP_AGENT_ADDRESS_CONFIG table (#17045)

#### Why I did it
SNMP query over IPv6 does not work due to issue in net-snmp where IPv6 query does not work on multi-nic environment.
To get around this, if snmpd listens on specific ipv4 or ipv6 address, then the issue is not seen.
We plan to configure Management IP and Loopback IP configured in minigraph.xml as SNMP_AGENT_ADDRESS in config_db., based on changes discussed in https://github.com/sonic-net/SONiC/pull/1457.

##### Work item tracking
- Microsoft ADO **(number only)**:26091228

#### How I did it
Modify minigraph parser to update SNMP_AGENT_ADDRESS_CONFIG with management and Loopback0 IP addresses.
Modify snmpd.conf.j2 to use SNMP_AGENT_ADDRESS_CONFIG table if it is present in config_db, if not listen on any IP.
Main change:
1. if minigraph.xml is used to configure the device, then snmpd will listen on mgmt and loopback IP addresses,
2. if config_db is used to configure the device, snmpd will listen IP present in SNMP_AGENT_ADDRESS_CONFIG  if that table is present, if table is not present snmpd will listen on any IP.
#### How to verify it
config_db.json created from minigraph.xml for single asic VS image with mgmt and Loopback IP addresses.
```
    "SNMP_AGENT_ADDRESS_CONFIG": {
        "10.1.0.32|161|": {},
        "10.250.0.101|161|": {},
        "FC00:1::32|161|": {},
        "fec0::ffff:afa:1|161|": {}
    },
 .....
 
 snmpd listening on the above IP addresses:
 admin@vlab-01:~$ sudo netstat -tulnp | grep 161
tcp        0      0 127.0.0.1:3161          0.0.0.0:*               LISTEN      71522/snmpd         
udp        0      0 10.250.0.101:161        0.0.0.0:*                           71522/snmpd         
udp        0      0 10.1.0.32:161           0.0.0.0:*                           71522/snmpd         
udp6       0      0 fec0::ffff:afa:1:161    :::*                                71522/snmpd         
udp6       0      0 fc00:1::32:161          :::*                                71522/snmpd  
```
This commit is contained in:
SuvarnaMeenakshi 2023-12-06 13:23:02 -08:00 committed by GitHub
parent 0f4a5b3d87
commit 90dc254656
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 30 deletions

View File

@ -28,32 +28,6 @@
{% for (agentip, port, vrf) in SNMP_AGENT_ADDRESS_CONFIG %} {% for (agentip, port, vrf) in SNMP_AGENT_ADDRESS_CONFIG %}
agentAddress {{ protocol(agentip) }}:[{{ agentip }}]{% if port %}:{{ port }}{% endif %}{% if vrf %}%{{ vrf }}{% endif %}{{ "" }} agentAddress {{ protocol(agentip) }}:[{{ agentip }}]{% if port %}:{{ port }}{% endif %}{% if vrf %}%{{ vrf }}{% endif %}{{ "" }}
{% endfor %} {% endfor %}
{% elif NAMESPACE_COUNT is not defined or NAMESPACE_COUNT|int <= 1 %}
{% if MGMT_INTERFACE is defined %}
{% for intf, ip in MGMT_INTERFACE %}
{% set agentip = ip.split('/')[0]|lower %}
{% set zoneid = '' %}
# Use interface as zoneid for link local ipv6
{% if agentip.startswith('fe80') %}
{% set zoneid = '%' + intf %}
{% endif %}
agentAddress {{ protocol(agentip) }}:[{{ agentip }}{{ zoneid }}]:161
{% endfor %}
{% endif %}
{% if LOOPBACK_INTERFACE is defined %}
{% for lo in LOOPBACK_INTERFACE %}
{% if lo | length == 2 %}
{% set intf = lo[0] %}
{% set agentip = lo[1].split('/')[0]|lower %}
{% set zoneid = '' %}
# Use interface as zoneid for link local ipv6
{% if agentip.startswith('fe80') %}
{% set zoneid = '%' + intf %}
{% endif %}
agentAddress {{ protocol(agentip) }}:[{{ agentip }}{{ zoneid }}]:161
{% endif %}
{% endfor %}
{% endif %}
{% else %} {% else %}
agentAddress udp:161 agentAddress udp:161
agentAddress udp6:161 agentAddress udp6:161

View File

@ -16,14 +16,11 @@ mkdir -p /etc/ssw /etc/snmp
# Parse snmp.yml and insert the data in Config DB # Parse snmp.yml and insert the data in Config DB
/usr/bin/snmp_yml_to_configdb.py /usr/bin/snmp_yml_to_configdb.py
ADD_PARAM=$(printf '%s {"NAMESPACE_COUNT":"%s"}' "-a" "$NAMESPACE_COUNT")
SONIC_CFGGEN_ARGS=" \ SONIC_CFGGEN_ARGS=" \
-d \ -d \
-y /etc/sonic/sonic_version.yml \ -y /etc/sonic/sonic_version.yml \
-t /usr/share/sonic/templates/sysDescription.j2,/etc/ssw/sysDescription \ -t /usr/share/sonic/templates/sysDescription.j2,/etc/ssw/sysDescription \
-t /usr/share/sonic/templates/snmpd.conf.j2,/etc/snmp/snmpd.conf \ -t /usr/share/sonic/templates/snmpd.conf.j2,/etc/snmp/snmpd.conf \
$ADD_PARAM \
" "
sonic-cfggen $SONIC_CFGGEN_ARGS sonic-cfggen $SONIC_CFGGEN_ARGS

View File

@ -16,6 +16,7 @@ from natsort import natsorted, ns as natsortns
from portconfig import get_port_config, get_fabric_port_config, get_fabric_monitor_config from portconfig import get_port_config, get_fabric_port_config, get_fabric_monitor_config
from sonic_py_common.interface import backplane_prefix from sonic_py_common.interface import backplane_prefix
from sonic_py_common.multi_asic import is_multi_asic
# TODO: Remove this once we no longer support Python 2 # TODO: Remove this once we no longer support Python 2
if sys.version_info.major == 3: if sys.version_info.major == 3:
@ -1730,6 +1731,21 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
results['MGMT_VRF_CONFIG'] = mvrf results['MGMT_VRF_CONFIG'] = mvrf
# Update SNMP_AGENT_ADDRESS_CONFIG with Management IP and Loopback IP
# if available.
if not is_multi_asic() and asic_name is None:
results['SNMP_AGENT_ADDRESS_CONFIG'] = {}
port = '161'
for mgmt_intf in mgmt_intf.keys():
snmp_key = mgmt_intf[1].split('/')[0] + '|' + port + '|'
results['SNMP_AGENT_ADDRESS_CONFIG'][snmp_key] = {}
# Add Loopback IP as agent address for single asic
for loip in lo_intfs.keys():
snmp_key = loip[1].split('/')[0] + '|' + port + '|'
results['SNMP_AGENT_ADDRESS_CONFIG'][snmp_key] = {}
else:
results['SNMP_AGENT_ADDRESS_CONFIG'] = {}
phyport_intfs = {} phyport_intfs = {}
vlan_intfs = {} vlan_intfs = {}
pc_intfs = {} pc_intfs = {}

View File

@ -63,6 +63,14 @@
</a:Prefix> </a:Prefix>
<a:PrefixStr>100.0.0.6/32</a:PrefixStr> <a:PrefixStr>100.0.0.6/32</a:PrefixStr>
</a:LoopbackIPInterface> </a:LoopbackIPInterface>
<a:LoopbackIPInterface>
<Name>HostIP</Name>
<AttachTo>Loopback1</AttachTo>
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.NetMux">
<b:IPPrefix>100.0.0.7/32</b:IPPrefix>
</a:Prefix>
<a:PrefixStr>100.0.0.7/32</a:PrefixStr>
</a:LoopbackIPInterface>
</LoopbackIPInterfaces> </LoopbackIPInterfaces>
<ManagementIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"> <ManagementIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
<a:ManagementIPInterface> <a:ManagementIPInterface>

View File

@ -1145,4 +1145,9 @@ class TestCfgGen(TestCase):
) )
) )
def testsnmp_agent_address_config(self):
argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', 'SNMP_AGENT_ADDRESS_CONFIG.keys()|list']
output = self.run_script(argument)
self.assertEqual(
utils.liststr_to_dict(output.strip()),
utils.liststr_to_dict("['192.168.200.15|161|', '100.0.0.6|161|', '100.0.0.7|161|']"))