Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions show/icmp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/usr/bin/env python3

import click
import utilities_common.cli as clicommon
import socket

from swsscommon.swsscommon import SonicV2Connector
from sonic_py_common import multi_asic
from tabulate import tabulate


class IcmpShow:
def __init__(self, click):
self.click = click
namespaces = multi_asic.get_front_end_namespaces()
self.asic_ids = []
self.per_npu_statedb = {}
self.icmp_echo_table_keys = {}
self.ctx = self.click.get_current_context()
for namespace in namespaces:
asic_id = multi_asic.get_asic_index_from_namespace(namespace)
self.asic_ids.append(asic_id)
self.per_npu_statedb[asic_id] = SonicV2Connector(use_unix_socket_path=False, namespace=namespace)
try:
self.per_npu_statedb[asic_id].connect(self.per_npu_statedb[asic_id].STATE_DB)
self.icmp_echo_table_keys[asic_id] = sorted(
self.per_npu_statedb[asic_id].keys(self.per_npu_statedb[asic_id].STATE_DB,
'ICMP_ECHO_SESSION_TABLE|*'))
except (socket.error, IOError) as e:
self.ctx.fail("Socket error in connecting with ICMP_ECHO_SESSION_TABLE: {}".format(str(e)))
except (KeyError, ValueError) as e:
self.ctx.fail("Error getting keys from ICMP_ECHO_SESSION_TABLE: {}".format(str(e)))

def get_icmp_echo_entry(self, asic_id, key):
"""Show icmp echo session entry from state db."""
state_db = self.per_npu_statedb[asic_id]
tbl_dict = state_db.get_all(state_db.STATE_DB, key)
if tbl_dict:
# Prepare data for tabulate
fields = {
"key": key.removeprefix("ICMP_ECHO_SESSION_TABLE|"),
"state": None,
"dst_ip": None,
"tx_interval": None,
"rx_interval": None,
"hw_lookup": None,
"session_cookie": None
}
for f in tbl_dict:
if f in fields:
fields[f] = tbl_dict[f]
return [fields["key"], fields["dst_ip"], fields["tx_interval"], fields["rx_interval"], fields["hw_lookup"],
fields["session_cookie"], fields["state"]]
else:
return None

def show_icmp_sessions(self, key):
table_data = []
for asic_id in self.asic_ids:
keys = []
if key is None:
keys = self.icmp_echo_table_keys[asic_id]
else:
keys.append("ICMP_ECHO_SESSION_TABLE|" + key.replace(":", "|"))

for k in keys:
entry = self.get_icmp_echo_entry(asic_id, k)
if entry:
table_data.append(entry)

if table_data:
headers = ["Key", "Dst IP", "Tx Interval", "Rx Interval", "HW lookup", "Cookie", "State"]
click.echo(tabulate(table_data, headers=headers))
else:
click.echo("Keys not found in ICMP_ECHO_SESSION_TABLE")

def show_summary(self):
total_sessions = 0
total_up = 0
total_rx = 0
for asic_id in self.asic_ids:
keys = self.icmp_echo_table_keys[asic_id]

for k in keys:
if 'RX' in k:
total_rx = total_rx + 1
entry = self.get_icmp_echo_entry(asic_id, k)
total_sessions = total_sessions + 1
if entry and entry[6] == "Up":
total_up = total_up + 1

self.click.echo("Total Sessions: {}".format(total_sessions))
self.click.echo("Up sessions: {}".format(total_up))
self.click.echo("RX sessions: {}".format(total_rx))


@click.group(cls=clicommon.AliasedGroup)
def icmp():
"""Show icmp-offload information"""
pass


@icmp.command()
@click.argument('key', required=False)
def sessions(key):
s_icmp = IcmpShow(click)
s_icmp.show_icmp_sessions(key)


@icmp.command()
def summary():
s_icmp = IcmpShow(click)
s_icmp.show_summary()
2 changes: 2 additions & 0 deletions show/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
from . import bgp_cli
from . import stp
from . import srv6
from . import icmp

# Global Variables
PLATFORM_JSON = 'platform.json'
Expand Down Expand Up @@ -322,6 +323,7 @@ def cli(ctx):
cli.add_command(dns.dns)
cli.add_command(stp.spanning_tree)
cli.add_command(srv6.srv6)
cli.add_command(icmp.icmp)

# syslog module
cli.add_command(syslog.syslog)
Expand Down
70 changes: 70 additions & 0 deletions tests/icmp_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import os

from click.testing import CliRunner
from utilities_common.db import Db

import show.main as show


tabular_session_status_output_expected = """\
Key Dst IP Tx Interval Rx Interval HW lookup Cookie State
------------------------------------- ------------ ------------- ------------- ----------- ---------- -------
default|Ethernet0|0x4eb39592|RX 192.168.0.3 0 300 false 0x58767e7a Up
default|Ethernet128|0x23ffb930|NORMAL 192.168.0.31 100 300 false 0x58767e7a Down
default|Ethernet152|0x39e05375|NORMAL 192.168.0.37 100 300 false 0x58767e7a Up
default|Ethernet8|0x69f578f5|NORMAL 192.168.0.5 100 300 false 0x58767e7a Up
"""

session_summary_output_expected = """\
Total Sessions: 4
Up sessions: 3
RX sessions: 1
"""

tabular_session_key_status_output_expected = """\
Key Dst IP Tx Interval Rx Interval HW lookup Cookie State
------------------------------- ----------- ------------- ------------- ----------- ---------- -------
default|Ethernet0|0x4eb39592|RX 192.168.0.3 0 300 false 0x58767e7a Up
"""


class TestIcmpSession(object):
@classmethod
def setup_class(cls):
os.environ['UTILITIES_UNIT_TESTING'] = "1"
print("SETUP")

def test_icmpecho_summary(self):
runner = CliRunner()
db = Db()

result = runner.invoke(show.cli.commands["icmp"].commands["summary"], obj=db)

assert result.exit_code == 0
assert result.output == session_summary_output_expected

def test_icmpecho_sessions(self):
runner = CliRunner()
db = Db()
result = runner.invoke(show.cli.commands["icmp"].commands["sessions"], obj=db)
print(result.exit_code)
print(result.output)

assert result.exit_code == 0
assert result.output == tabular_session_status_output_expected

def test_icmpecho_key_sessions(self):
runner = CliRunner()
db = Db()
result = runner.invoke(show.cli.commands["icmp"].commands["sessions"],
"default|Ethernet0|0x4eb39592|RX", obj=db)
print(result.exit_code)
print(result.output)

assert result.exit_code == 0
assert result.output == tabular_session_key_status_output_expected

@classmethod
def teardown_class(cls):
os.environ['UTILITIES_UNIT_TESTING'] = "0"
print("TEARDOWN")
31 changes: 31 additions & 0 deletions tests/mock_tables/asic0/state_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,37 @@
"PORT_CAPACITY_TABLE|PORT_CAPACITY_DATA" : {
"capacity": "80000"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet8|0x69f578f5|NORMAL" : {
"dst_ip": "192.168.0.5",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x69f578f5",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "100"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet0|0x4eb39592|RX" : {
"dst_ip": "192.168.0.3",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x4eb39592",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "0"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet128|0x23ffb930|NORMAL" : {
"dst_ip": "192.168.0.31",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x23ffb930",
"src_ip": "10.1.0.36",
"state": "Down",
"tx_interval": "100"

},
"BFD_SESSION_TABLE|default|default|10.0.1.1": {
"state": "DOWN",
"type": "async_active",
Expand Down
30 changes: 30 additions & 0 deletions tests/mock_tables/asic1/state_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -280,5 +280,35 @@
},
"PORT_CAPACITY_TABLE|PORT_CAPACITY_DATA" : {
"capacity": "80000"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet8|0x69f578f5|NORMAL" : {
"dst_ip": "192.168.0.5",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x69f578f5",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "100"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet0|0x4eb39592|RX" : {
"dst_ip": "192.168.0.3",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x4eb39592",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "0"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet128|0x23ffb930|NORMAL" : {
"dst_ip": "192.168.0.31",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x23ffb930",
"src_ip": "10.1.0.36",
"state": "Down",
"tx_interval": "100"
}
}
40 changes: 40 additions & 0 deletions tests/mock_tables/state_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -1777,5 +1777,45 @@
"mac_remote_fault_time": "",
"mac_local_fault_count": "0",
"mac_local_fault_time": ""
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet8|0x69f578f5|NORMAL" : {
"dst_ip": "192.168.0.5",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x69f578f5",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "100"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet0|0x4eb39592|RX" : {
"dst_ip": "192.168.0.3",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x4eb39592",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "0"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet128|0x23ffb930|NORMAL" : {
"dst_ip": "192.168.0.31",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x23ffb930",
"src_ip": "10.1.0.36",
"state": "Down",
"tx_interval": "100"
},
"ICMP_ECHO_SESSION_TABLE|default|Ethernet152|0x39e05375|NORMAL" : {
"dst_ip": "192.168.0.37",
"hw_lookup": "false",
"rx_interval": "300",
"session_cookie": "0x58767e7a",
"session_guid": "0x39e05375",
"src_ip": "10.1.0.36",
"state": "Up",
"tx_interval": "100"
}
}
Loading