Skip to content

Add CLI Support for IPv6 Helpers and DHCPv6 Relay Counters #8593

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Sep 24, 2021
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import click
sys.path.insert(0, '../../show/plugins/')
import show_dhcp6relay_counters


# sonic-clear dhcp6relay_counters
@click.command()
@click.option('-i', '--interface', required=False)
@click.option('--verbose', is_flag=True, help="Enable verbose output")
def dhcp6relay_counters(interface, verbose):
"""Clear dhcp6relay message counts"""

counter = DHCPv6_Counter()
counter_intf = counter.get_interface()

if interface:
counter.clear_table(interface)
else:
for intf in counter_intf:
counter.clear_table(intf)

def register(cli):
cli.add_command(dhcp6relay_counters)
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import click
import utilities_common.cli as clicommon

import argparse
import sys
from tabulate import tabulate

from swsscommon.swsscommon import SonicV2Connector


# STATE_DB Table
DHCPv6_COUNTER_TABLE = 'DHCPv6_COUNTER_TABLE'

# DHCPv6 Counter Messages
messages = ["Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline", "Relay-Forward", "Relay-Reply"]

class DHCPv6_Counter(object):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Please add code comment

def __init__(self):
self.db = SonicV2Connector(use_unix_socket_path=False)
self.db.connect(self.db.STATE_DB)
self.table_name = DHCPv6_COUNTER_TABLE + self.db.get_db_separator(self.db.STATE_DB)


def get_interface(self):
vlans = []
for key in self.db.keys(self.db.STATE_DB):
if DHCPv6_COUNTER_TABLE in key:
vlans.append(key[21:])
return vlans


def get_dhcp6relay_msg_count(self, interface, msg):
count = self.db.get(self.db.STATE_DB, self.table_name + str(interface), str(msg))
data = [str(msg), count]
return data


def clear_table(self, interface):
for msg in messages:
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str(msg), '0')

def print_count(counter, intf):
data = []
for i in messages:
data.append(counter.get_dhcp6relay_msg_count(intf, i))
print(tabulate(data, headers = ["Message Type", intf], tablefmt='simple', stralign='right') + "\n")


#
# 'dhcp6relay_counters' group ###
#


@click.group(cls=clicommon.AliasedGroup)
def dhcp6relay_counters():
"""Show DHCPv6 counter"""
pass


# 'counts' subcommand ("show dhcp6relay_counters counts")
@dhcp6relay_counters.command('counts')
@click.option('-i', '--interface', required=False)
@click.option('--verbose', is_flag=True, help="Enable verbose output")
def counts(interface, verbose):
"""Show dhcp6relay message counts"""

counter = DHCPv6_Counter()
counter_intf = counter.get_interface()

if interface:
print_count(counter, interface)
else:
for intf in counter_intf:
print_count(counter, intf)


def register(cli):
cli.commands['dhcp6realy_counters'].add_command(dhcp6relay_counters)

31 changes: 31 additions & 0 deletions dockers/docker-dhcp-relay/cli/show/plugins/show_dhcpv6_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import click
from tabulate import tabulate
from swsscommon.swsscommon import ConfigDBConnector

import utilities_common.cli as clicommon

DHCP_RELAY = 'DHCP_RELAY'

@click.group(cls=clicommon.AliasedGroup, name="dhcp_relay_helper")
def dhcp_relay_helper():
"""Show DHCP_Relay helper information"""
pass

@dhcp_relay_helper.command('ipv6')
def get_dhcpv6_helper_address():
config_db = ConfigDBConnector()
if config_db is not None:
config_db.connect()
table_data = config_db.get_table(DHCP_RELAY)
if table_data is not None:
for vlan in config_db.get_keys(DHCP_RELAY):
vlan_data = table_data.get(vlan)
helpers_data = vlan_data.get('dhcpv6_server')
if helpers_data is not None:
addr = {vlan:[]}
for ip in helpers_data.split(','):
addr[vlan].append(ip)
print(tabulate({'Interface':[vlan], vlan:addr.get(vlan)}, tablefmt='simple', stralign='right') + '\n')

def register(cli):
cli.commands['dhcp_relay_helper'].add_command(dhcp_relay_helper)