790bdded96
- Why I did it Make DHCP relay docker an extension. DHCP relay now carries dhcp relay commands CLI plugin and has a complete manifest. It is installed as extension if INCLUDE_DHCP_REALY is set to y. DEPENDS on #5939 - How I did it Modify DHCP relay docker makefile and dockerfile. Make changes to sonic_debian_extension.j2 to install sonic packages. I moved DHCP related CLI tests from sonic-utilities to DHCP relay docker. This PR introduces a way to write a plugin as part of docker image and run the tests from cli-plugin-tests directory under docker directory. The test result is available in target/docker-dhcp-relay.gz.log: [ REASON ] : target/docker-dhcp-relay.gz does not exist NON-EXISTENT PREREQUISITES: docker-start target/docker-config-engine-buster.gz-load target/python-wheels/sonic_utilities-1.2-py3-none-any.whl-in stall target/debs/buster/python3-swsscommon_1.0.0_amd64.deb-install [ FLAGS FILE ] : [] [ FLAGS DEPENDS ] : [] [ FLAGS DIFF ] : [] ============================= test session starts ============================== platform linux -- Python 3.7.3, pytest-3.10.1, py-1.7.0, pluggy-0.8.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /sonic/dockers/docker-dhcp-relay/cli-plugin-tests, inifile: plugins: cov-2.6.0 collecting ... collected 10 items test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_plugin_registration PASSED [ 10%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_add_dhcp_relay_with_nonexist_vlanid PASSED [ 20%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_add_dhcp_relay_with_invalid_vlanid PASSED [ 30%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_add_dhcp_relay_with_invalid_ip PASSED [ 40%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_add_dhcp_relay_with_exist_ip PASSED [ 50%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_add_del_dhcp_relay_dest PASSED [ 60%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_remove_nonexist_dhcp_relay_dest PASSED [ 70%] test_config_dhcp_relay.py::TestConfigVlanDhcpRelay::test_config_vlan_remove_dhcp_relay_dest_with_nonexist_vlanid PASSED [ 80%] test_show_dhcp_relay.py::TestVlanDhcpRelay::test_plugin_registration PASSED [ 90%] test_show_dhcp_relay.py::TestVlanDhcpRelay::test_dhcp_relay_column_output PASSED [100%] =============================== warnings summary =============================== /usr/local/lib/python3.7/dist-packages/tabulate.py:7 /usr/local/lib/python3.7/dist-packages/tabulate.py:7: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import namedtuple, Iterable -- Docs: https://docs.pytest.org/en/latest/warnings.html ==================== 10 passed, 1 warnings in 0.35 seconds =====================
142 lines
5.8 KiB
Python
142 lines
5.8 KiB
Python
import os
|
|
import sys
|
|
import traceback
|
|
from unittest import mock
|
|
|
|
from click.testing import CliRunner
|
|
|
|
from utilities_common.db import Db
|
|
|
|
import pytest
|
|
|
|
sys.path.append('../cli/config/plugins/')
|
|
import dhcp_relay
|
|
|
|
config_vlan_add_dhcp_relay_output="""\
|
|
Added DHCP relay destination address 192.0.0.100 to Vlan1000
|
|
Restarting DHCP relay service...
|
|
"""
|
|
|
|
config_vlan_del_dhcp_relay_output="""\
|
|
Removed DHCP relay destination address 192.0.0.100 from Vlan1000
|
|
Restarting DHCP relay service...
|
|
"""
|
|
|
|
class TestConfigVlanDhcpRelay(object):
|
|
def test_plugin_registration(self):
|
|
cli = mock.MagicMock()
|
|
dhcp_relay.register(cli)
|
|
cli.commands['vlan'].add_command.assert_called_once_with(dhcp_relay.vlan_dhcp_relay)
|
|
|
|
def test_config_vlan_add_dhcp_relay_with_nonexist_vlanid(self):
|
|
runner = CliRunner()
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["add"],
|
|
["1001", "192.0.0.100"])
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
# traceback.print_tb(result.exc_info[2])
|
|
assert result.exit_code != 0
|
|
assert "Error: Vlan1001 doesn't exist" in result.output
|
|
assert mock_run_command.call_count == 0
|
|
|
|
def test_config_vlan_add_dhcp_relay_with_invalid_vlanid(self):
|
|
runner = CliRunner()
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["add"],
|
|
["4096", "192.0.0.100"])
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
# traceback.print_tb(result.exc_info[2])
|
|
assert result.exit_code != 0
|
|
assert "Error: Vlan4096 doesn't exist" in result.output
|
|
assert mock_run_command.call_count == 0
|
|
|
|
def test_config_vlan_add_dhcp_relay_with_invalid_ip(self):
|
|
runner = CliRunner()
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["add"],
|
|
["1000", "192.0.0.1000"])
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
# traceback.print_tb(result.exc_info[2])
|
|
assert result.exit_code != 0
|
|
assert "Error: 192.0.0.1000 is invalid IP address" in result.output
|
|
assert mock_run_command.call_count == 0
|
|
|
|
def test_config_vlan_add_dhcp_relay_with_exist_ip(self, mock_cfgdb):
|
|
runner = CliRunner()
|
|
db = Db()
|
|
db.cfgdb = mock_cfgdb
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["add"],
|
|
["1000", "192.0.0.1"], obj=db)
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
assert result.exit_code == 0
|
|
assert "192.0.0.1 is already a DHCP relay destination for Vlan1000" in result.output
|
|
assert mock_run_command.call_count == 0
|
|
|
|
def test_config_vlan_add_del_dhcp_relay_dest(self, mock_cfgdb):
|
|
runner = CliRunner()
|
|
db = Db()
|
|
db.cfgdb = mock_cfgdb
|
|
|
|
# add new relay dest
|
|
with mock.patch("utilities_common.cli.run_command") as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["add"],
|
|
["1000", "192.0.0.100"], obj=db)
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
assert result.exit_code == 0
|
|
assert result.output == config_vlan_add_dhcp_relay_output
|
|
assert mock_run_command.call_count == 3
|
|
db.cfgdb.set_entry.assert_called_once_with('VLAN', 'Vlan1000', {'dhcp_servers': ['192.0.0.1', '192.0.0.100']})
|
|
|
|
db.cfgdb.set_entry.reset_mock()
|
|
|
|
# del relay dest
|
|
with mock.patch("utilities_common.cli.run_command") as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["del"],
|
|
["1000", "192.0.0.100"], obj=db)
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
assert result.exit_code == 0
|
|
assert result.output == config_vlan_del_dhcp_relay_output
|
|
assert mock_run_command.call_count == 3
|
|
db.cfgdb.set_entry.assert_called_once_with('VLAN', 'Vlan1000', {'dhcp_servers': ['192.0.0.1']})
|
|
|
|
def test_config_vlan_remove_nonexist_dhcp_relay_dest(self, mock_cfgdb):
|
|
runner = CliRunner()
|
|
db = Db()
|
|
db.cfgdb = mock_cfgdb
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["del"],
|
|
["1000", "192.0.0.100"], obj=db)
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
# traceback.print_tb(result.exc_info[2])
|
|
assert result.exit_code != 0
|
|
assert "Error: 192.0.0.100 is not a DHCP relay destination for Vlan1000" in result.output
|
|
assert mock_run_command.call_count == 0
|
|
|
|
def test_config_vlan_remove_dhcp_relay_dest_with_nonexist_vlanid(self, mock_cfgdb):
|
|
runner = CliRunner()
|
|
db = Db()
|
|
db.cfgdb = mock_cfgdb
|
|
|
|
with mock.patch('utilities_common.cli.run_command') as mock_run_command:
|
|
result = runner.invoke(dhcp_relay.vlan_dhcp_relay.commands["del"],
|
|
["1001", "192.0.0.1"], obj=Db)
|
|
print(result.exit_code)
|
|
print(result.output)
|
|
# traceback.print_tb(result.exc_info[2])
|
|
assert result.exit_code != 0
|
|
assert "Error: Vlan1001 doesn't exist" in result.output
|
|
assert mock_run_command.call_count == 0
|