[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:
parent
0f4a5b3d87
commit
90dc254656
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 = {}
|
||||||
|
@ -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>
|
||||||
|
@ -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|']"))
|
||||||
|
Loading…
Reference in New Issue
Block a user