Skip to content
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

[dhcp-relay] Add dhcp_relay show cli #13614

Merged
merged 6 commits into from
Mar 6, 2023
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
122 changes: 119 additions & 3 deletions dockers/docker-dhcp-relay/cli-plugin-tests/mock_config.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
TEST_DATA = [
COMMON_TEST_DATA = [
[
"DHCPv6_Helpers",
"ipv6_with_header",
yxieca marked this conversation as resolved.
Show resolved Hide resolved
{
"config_db": {
"DHCP_RELAY": {
Expand All @@ -12,7 +12,123 @@
"dhcpv6_option|rfc6939_support": "true"
}
}
},
}
},
],
[
"ipv6_without_header",
{
"config_db": {
"DHCP_RELAY": {
"Vlan1000": {
"dhcpv6_servers": [
"fc02:2000::1",
"fc02:2000::2"
],
"dhcpv6_option|rfc6939_support": "true"
}
}
}
},
],
[
"ipv4_with_header",
{
"config_db": {
"VLAN": {
"Vlan1000": {
"dhcp_servers": [
"192.0.0.1",
"192.0.0.2"
]
}
}
}
}
]
]

NEW_ADDED_TEST_DATA = [
[
"ipv6",
{
"config_db": {
"DHCP_RELAY": {
"Vlan1000": {
"dhcpv6_servers": [
"fc02:2000::1",
"fc02:2000::2"
],
"dhcpv6_option|rfc6939_support": "true"
}
}
}
},
],
[
"ipv4",
{
"config_db": {
"VLAN": {
"Vlan1000": {
"dhcp_servers": [
"192.0.0.1",
"192.0.0.2"
]
},
"Vlan1001": {
"vlanid": "1001"
}
}
}
}
]
]

MULTI_TEST_DATA = [
[
"ipv6",
{
"config_db": {
"DHCP_RELAY": {
"Vlan1000": {
"dhcpv6_servers": [
"fc02:2000::1",
"fc02:2000::2"
],
"dhcpv6_option|rfc6939_support": "true"
},
"Vlan1001": {
"dhcpv6_servers": [
"fc02:2000::3",
"fc02:2000::4"
],
"dhcpv6_option|rfc6939_support": "true"
}
}
}
},
],
[
"ipv4",
{
"config_db": {
"VLAN": {
"Vlan1000": {
"dhcp_servers": [
"192.0.0.1",
"192.0.0.2"
]
},
"Vlan1001": {
"vlanid": "1001",
"dhcp_servers": [
"192.0.0.3",
"192.0.0.4"
]
}
}
}
}
]
]
163 changes: 145 additions & 18 deletions dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp_relay.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,155 @@
import os
import pytest
import sys
import traceback
import os
sys.path.append('../cli/show/plugins/')
import show_dhcp_relay as show
import show.vlan as vlan
from swsscommon import swsscommon
from mock_config import COMMON_TEST_DATA, NEW_ADDED_TEST_DATA, MULTI_TEST_DATA
from parameterized import parameterized
from pyfakefs.fake_filesystem_unittest import patchfs
from unittest import mock

from click.testing import CliRunner
try:
sys.path.insert(0, '../../../src/sonic-host-services/tests/common')
from mock_configdb import MockConfigDb
swsscommon.ConfigDBConnector = MockConfigDb
except KeyError:
pass

expected_ipv6_table_with_header = """\
+-------------+----------------------+
| Interface | DHCP Relay Address |
+=============+======================+
| Vlan1000 | fc02:2000::1 |
| | fc02:2000::2 |
+-------------+----------------------+
"""

expected_ipv4_table_with_header = """\
+-------------+----------------------+
| Interface | DHCP Relay Address |
+=============+======================+
| Vlan1000 | 192.0.0.1 |
| | 192.0.0.2 |
+-------------+----------------------+
"""

expected_ipv6_table_without_header = """\
-------- ------------
yaqiangz marked this conversation as resolved.
Show resolved Hide resolved
Vlan1000 fc02:2000::1
fc02:2000::2
-------- ------------
"""

expected_ipv6_table_multi_with_header = """\
+-------------+----------------------+
| Interface | DHCP Relay Address |
+=============+======================+
| Vlan1000 | fc02:2000::1 |
| | fc02:2000::2 |
+-------------+----------------------+
| Vlan1001 | fc02:2000::3 |
| | fc02:2000::4 |
+-------------+----------------------+
"""

expected_ipv4_table_multi_with_header = """\
+-------------+----------------------+
| Interface | DHCP Relay Address |
+=============+======================+
| Vlan1000 | 192.0.0.1 |
| | 192.0.0.2 |
+-------------+----------------------+
| Vlan1001 | 192.0.0.3 |
| | 192.0.0.4 |
+-------------+----------------------+
"""

DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json'

IP_VER_TEST_PARAM_MAP = {
"ipv4": {
"entry": "dhcp_servers",
"table": "VLAN"
},
"ipv6": {
"entry": "dhcpv6_servers",
"table": "DHCP_RELAY"
}
}


def test_plugin_registration():
cli = mock.MagicMock()
show.register(cli)
assert 'DHCP Helper Address' in dict(vlan.VlanBrief.COLUMNS)


def test_dhcp_relay_column_output():
ctx = (
({'Vlan1001': {'dhcp_servers': ['192.0.0.1', '192.168.0.2']}}, {}, {}),
(),
)
assert show.get_dhcp_helper_address(ctx, 'Vlan1001') == '192.0.0.1\n192.168.0.2'

import show.vlan as vlan
from utilities_common.db import Db

sys.path.insert(0, '../cli/show/plugins/')
import show_dhcp_relay
@parameterized.expand(COMMON_TEST_DATA)
@patchfs
def test_show_dhcp_relay(test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH)
MockConfigDb.set_config_db(test_data["config_db"])
config_db = MockConfigDb()
ip_version = "ipv4" if "ipv4" in test_name else "ipv6"
table = config_db.get_table(IP_VER_TEST_PARAM_MAP[ip_version]["table"])
if test_name == "ipv4_with_header":
result = show.get_dhcp_relay_data_with_header(table, IP_VER_TEST_PARAM_MAP[ip_version]["entry"])
expected_output = expected_ipv4_table_with_header
elif test_name == "ipv6_with_header":
result = show.get_dhcp_relay_data_with_header(table, IP_VER_TEST_PARAM_MAP[ip_version]["entry"])
expected_output = expected_ipv6_table_with_header
elif test_name == "ipv6_without_header":
result = show.get_data(table, "Vlan1000")
expected_output = expected_ipv6_table_without_header
assert result == expected_output


class TestVlanDhcpRelay(object):
def test_plugin_registration(self):
cli = mock.MagicMock()
show_dhcp_relay.register(cli)
assert 'DHCP Helper Address' in dict(vlan.VlanBrief.COLUMNS)
@parameterized.expand(NEW_ADDED_TEST_DATA)
@patchfs
def test_show_new_added_dhcp_relay(test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH)
MockConfigDb.set_config_db(test_data["config_db"])
config_db = MockConfigDb()
ip_version = test_name
table = config_db.get_table(IP_VER_TEST_PARAM_MAP[ip_version]["table"])
if ip_version == "ipv4":
result = show.get_dhcp_relay_data_with_header(table, IP_VER_TEST_PARAM_MAP[ip_version]["entry"])
expected_output = expected_ipv4_table_with_header
assert result == expected_output
else:
result = show.get_dhcp_relay_data_with_header(table, IP_VER_TEST_PARAM_MAP[ip_version]["entry"])
expected_output = expected_ipv6_table_with_header
assert result == expected_output

def test_dhcp_relay_column_output(self):
ctx = (
({'Vlan100': {'dhcp_servers': ['192.0.0.1', '192.168.0.2']}}, {}, {}),
(),
)
assert show_dhcp_relay.get_dhcp_helper_address(ctx, 'Vlan100') == '192.0.0.1\n192.168.0.2'
result = show.get_data(table, "Vlan1001")
expected_output = ""
assert result == expected_output


@parameterized.expand(MULTI_TEST_DATA)
@patchfs
def test_show_multi_dhcp_relay(test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH)
MockConfigDb.set_config_db(test_data["config_db"])
config_db = MockConfigDb()
ip_version = test_name
table = config_db.get_table(IP_VER_TEST_PARAM_MAP[ip_version]["table"])
result = show.get_dhcp_relay_data_with_header(table, IP_VER_TEST_PARAM_MAP[ip_version]["entry"])
if ip_version == "ipv4":
expected_output = expected_ipv4_table_multi_with_header
else:
expected_output = expected_ipv6_table_multi_with_header
assert result == expected_output

This file was deleted.

Loading