Skip to content

Commit c5a7ce0

Browse files
authored
[dhcp_relay] Remove exist check while adding dhcpv6 relay (#13822)
Why I did it DHCPv6 relay config entry is not useful while del dhcpv6 relay config. How I did it Remove dhcpv6_relay entry if it is empty and not check entry exist while adding dhcpv6 relay
1 parent a3225e6 commit c5a7ce0

File tree

3 files changed

+63
-8
lines changed

3 files changed

+63
-8
lines changed

dockers/docker-dhcp-relay/cli-plugin-tests/conftest.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,23 @@ def mock_cfgdb():
1919
}
2020

2121
def get_entry(table, key):
22+
if table not in CONFIG or key not in CONFIG[table]:
23+
return {}
2224
return CONFIG[table][key]
2325

2426
def set_entry(table, key, data):
2527
CONFIG[table].setdefault(key, {})
26-
CONFIG[table][key] = data
28+
29+
if data is None:
30+
CONFIG[table].pop(key)
31+
else:
32+
CONFIG[table][key] = data
33+
34+
def get_keys(table):
35+
return CONFIG[table].keys()
2736

2837
cfgdb.get_entry = mock.Mock(side_effect=get_entry)
2938
cfgdb.set_entry = mock.Mock(side_effect=set_entry)
39+
cfgdb.get_keys = mock.Mock(side_effect=get_keys)
3040

3141
yield cfgdb
32-

dockers/docker-dhcp-relay/cli-plugin-tests/test_config_dhcp_relay.py

+39-1
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,25 @@ def test_plugin_registration(self):
111111
cli = mock.MagicMock()
112112
dhcp_relay.register(cli)
113113

114-
def test_config_dhcp_relay_add_del_with_nonexist_vlanid(self, ip_version, op):
114+
def test_config_dhcp_relay_add_del_with_nonexist_vlanid_ipv4(self, op):
115115
runner = CliRunner()
116116

117+
ip_version = "ipv4"
118+
with mock.patch("utilities_common.cli.run_command") as mock_run_command:
119+
result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version]
120+
.commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]]
121+
.commands[op], ["1001", IP_VER_TEST_PARAM_MAP[ip_version]["ips"][0]])
122+
print(result.exit_code)
123+
print(result.stdout)
124+
assert result.exit_code != 0
125+
assert "Error: Vlan1001 doesn't exist" in result.output
126+
assert mock_run_command.call_count == 0
127+
128+
def test_config_dhcp_relay_del_with_nonexist_vlanid_ipv6(self):
129+
runner = CliRunner()
130+
131+
op = "del"
132+
ip_version = "ipv6"
117133
with mock.patch("utilities_common.cli.run_command") as mock_run_command:
118134
result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version]
119135
.commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]]
@@ -262,3 +278,25 @@ def test_config_add_del_duplicate_dhcp_relay(self, mock_cfgdb, ip_version, op):
262278
assert result.exit_code != 0
263279
assert "Error: Find duplicate DHCP relay ip {} in {} list".format(test_ip, op) in result.output
264280
assert mock_run_command.call_count == 0
281+
282+
def test_config_add_dhcp_relay_ipv6_with_non_entry(self, mock_cfgdb):
283+
op = "add"
284+
ip_version = "ipv6"
285+
test_ip = IP_VER_TEST_PARAM_MAP[ip_version]["ips"][0]
286+
runner = CliRunner()
287+
db = Db()
288+
db.cfgdb = mock_cfgdb
289+
table = IP_VER_TEST_PARAM_MAP[ip_version]["table"]
290+
db.cfgdb.set_entry(table, "Vlan1000", None)
291+
assert db.cfgdb.get_entry(table, "Vlan1000") == {}
292+
assert len(db.cfgdb.get_keys(table)) == 0
293+
294+
with mock.patch("utilities_common.cli.run_command") as mock_run_command:
295+
result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version]
296+
.commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]]
297+
.commands[op], ["1000", test_ip], obj=db)
298+
print(result.exit_code)
299+
print(result.output)
300+
assert result.exit_code == 0
301+
assert db.cfgdb.get_entry(table, "Vlan1000") == {"dhcpv6_servers": [test_ip]}
302+
assert mock_run_command.call_count == 3

dockers/docker-dhcp-relay/cli/config/plugins/dhcp_relay.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ def validate_ips(ctx, ips, ip_version):
2222
ctx.fail("{} is not IPv{} address".format(ip, ip_version))
2323

2424

25-
def get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str):
26-
table = db.cfgdb.get_entry(table_name, vlan_name)
27-
if len(table.keys()) == 0:
28-
ctx.fail("{} doesn't exist".format(vlan_name))
25+
def get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str, check_is_exist=True):
26+
if check_is_exist:
27+
keys = db.cfgdb.get_keys(table_name)
28+
if vlan_name not in keys:
29+
ctx.fail("{} doesn't exist".format(vlan_name))
2930

31+
table = db.cfgdb.get_entry(table_name, vlan_name)
3032
dhcp_servers = table.get(dhcp_servers_str, [])
3133

3234
return dhcp_servers, table
@@ -49,7 +51,10 @@ def add_dhcp_relay(vid, dhcp_relay_ips, db, ip_version):
4951
ctx = click.get_current_context()
5052
# Verify ip addresses are valid
5153
validate_ips(ctx, dhcp_relay_ips, ip_version)
52-
dhcp_servers, table = get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str)
54+
55+
# It's unnecessary for DHCPv6 Relay to verify entry exist
56+
check_config_exist = True if ip_version == 4 else False
57+
dhcp_servers, table = get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str, check_config_exist)
5358
added_ips = []
5459

5560
for dhcp_relay_ip in dhcp_relay_ips:
@@ -100,6 +105,9 @@ def del_dhcp_relay(vid, dhcp_relay_ips, db, ip_version):
100105
else:
101106
table[dhcp_servers_str] = dhcp_servers
102107

108+
if ip_version == 6 and len(table.keys()) == 0:
109+
table = None
110+
103111
db.cfgdb.set_entry(table_name, vlan_name, table)
104112
click.echo("Removed DHCP relay address [{}] from {}".format(",".join(dhcp_relay_ips), vlan_name))
105113
try:

0 commit comments

Comments
 (0)