From 39cb45c908c18c3ff992de162d4893090340a0d2 Mon Sep 17 00:00:00 2001 From: Yevhen Fastiuk Date: Thu, 24 Mar 2022 10:02:09 +0200 Subject: [PATCH 1/3] Move hostname handling to hostcfgd Signed-off-by: Yevhen Fastiuk --- config/main.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/config/main.py b/config/main.py index 56aeddc673..579cb8c5dd 100644 --- a/config/main.py +++ b/config/main.py @@ -22,6 +22,7 @@ from sonic_py_common import device_info, multi_asic from sonic_py_common.interface import get_interface_table_name, get_port_table_name, get_intf_longname from utilities_common import util_base +from swsscommon import swsscommon from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector from utilities_common.db import Db from utilities_common.intf_filter import parse_interface_in_filter @@ -1889,19 +1890,11 @@ def hostname(new_hostname): config_db = ConfigDBConnector() config_db.connect() - config_db.mod_entry('DEVICE_METADATA' , 'localhost', {"hostname" : new_hostname}) - try: - command = "service hostname-config restart" - clicommon.run_command(command, display_cmd=True) - except SystemExit as e: - click.echo("Restarting hostname-config service failed with error {}".format(e)) - raise - - # Reload Monit configuration to pick up new hostname in case it changed - click.echo("Reloading Monit configuration ...") - clicommon.run_command("sudo monit reload") + config_db.mod_entry(swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, 'localhost', + {'hostname': new_hostname}) - click.echo("Please note loaded setting will be lost after system reboot. To preserve setting, run `config save`.") + click.echo('Please note loaded setting will be lost after system reboot. To' + ' preserve setting, run `config save`.') # # 'synchronous_mode' command ('config synchronous_mode ...') From 26866a2aa4ae03f2579bc342fafef1ad7384a53e Mon Sep 17 00:00:00 2001 From: Yevhen Fastiuk Date: Wed, 30 Mar 2022 13:11:31 +0300 Subject: [PATCH 2/3] Move mgmt handling to hostcfgd Signed-off-by: Yevhen Fastiuk --- config/main.py | 51 ++------------------------------------------------ 1 file changed, 2 insertions(+), 49 deletions(-) diff --git a/config/main.py b/config/main.py index 579cb8c5dd..ceffa05eda 100644 --- a/config/main.py +++ b/config/main.py @@ -2820,22 +2820,6 @@ def warm_restart_bgp_eoiu(ctx, enable): db = ctx.obj['db'] db.mod_entry('WARM_RESTART', 'bgp', {'bgp_eoiu': enable}) -def mvrf_restart_services(): - """Restart interfaces-config service and NTP service when mvrf is changed""" - """ - When mvrf is enabled, eth0 should be moved to mvrf; when it is disabled, - move it back to default vrf. Restarting the "interfaces-config" service - will recreate the /etc/network/interfaces file and restart the - "networking" service that takes care of the eth0 movement. - NTP service should also be restarted to rerun the NTP service with or - without "cgexec" accordingly. - """ - cmd="service ntp stop" - os.system (cmd) - cmd="systemctl restart interfaces-config" - os.system (cmd) - cmd="service ntp start" - os.system (cmd) def vrf_add_management_vrf(config_db): """Enable management vrf in config DB""" @@ -2845,22 +2829,7 @@ def vrf_add_management_vrf(config_db): click.echo("ManagementVRF is already Enabled.") return None config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "true"}) - mvrf_restart_services() - """ - The regular expression for grep in below cmd is to match eth0 line in /proc/net/route, sample file: - $ cat /proc/net/route - Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT - eth0 00000000 01803B0A 0003 0 0 202 00000000 0 0 0 - """ - cmd = r"cat /proc/net/route | grep -E \"eth0\s+00000000\s+[0-9A-Z]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+202\" | wc -l" - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) - output = proc.communicate() - if int(output[0]) >= 1: - cmd="ip -4 route del default dev eth0 metric 202" - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) - proc.communicate() - if proc.returncode != 0: - click.echo("Could not delete eth0 route") + def vrf_delete_management_vrf(config_db): """Disable management vrf in config DB""" @@ -2870,7 +2839,7 @@ def vrf_delete_management_vrf(config_db): click.echo("ManagementVRF is already Disabled.") return None config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "false"}) - mvrf_restart_services() + @config.group(cls=clicommon.AbbreviationGroup) @click.pass_context @@ -4106,20 +4075,6 @@ def _get_all_mgmtinterface_keys(): config_db.connect() return list(config_db.get_table('MGMT_INTERFACE').keys()) -def mgmt_ip_restart_services(): - """Restart the required services when mgmt inteface IP address is changed""" - """ - Whenever the eth0 IP address is changed, restart the "interfaces-config" - service which regenerates the /etc/network/interfaces file and restarts - the networking service to make the new/null IP address effective for eth0. - "ntp-config" service should also be restarted based on the new - eth0 IP address since the ntp.conf (generated from ntp.conf.j2) is - made to listen on that particular eth0 IP address or reset it back. - """ - cmd="systemctl restart interfaces-config" - os.system (cmd) - cmd="systemctl restart ntp-config" - os.system (cmd) # # 'mtu' subcommand @@ -4267,7 +4222,6 @@ def add(ctx, interface_name, ip_addr, gw): config_db.set_entry("MGMT_INTERFACE", (interface_name, str(ip_address)), {"NULL": "NULL"}) else: config_db.set_entry("MGMT_INTERFACE", (interface_name, str(ip_address)), {"gwaddr": gw}) - mgmt_ip_restart_services() return @@ -4307,7 +4261,6 @@ def remove(ctx, interface_name, ip_addr): if interface_name == 'eth0': config_db.set_entry("MGMT_INTERFACE", (interface_name, str(ip_address)), None) - mgmt_ip_restart_services() return table_name = get_interface_table_name(interface_name) From 64bca6e0f3ad9c5277872bacfeb9bedf466ca80f Mon Sep 17 00:00:00 2001 From: Yevhen Fastiuk Date: Mon, 20 Jun 2022 04:29:04 +0300 Subject: [PATCH 3/3] Add test for hostname setting Signed-off-by: Yevhen Fastiuk --- tests/config_test.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/config_test.py b/tests/config_test.py index e9dbae4194..91b94d312e 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -1585,3 +1585,37 @@ def test_config_rate(self, get_cmd_module, setup_single_broadcom_asic): def teardown_class(cls): print("TEARDOWN") os.environ['UTILITIES_UNIT_TESTING'] = "0" + + +class TestConfigHostname(object): + @classmethod + def setup_class(cls): + print("SETUP") + import config.main + importlib.reload(config.main) + + @mock.patch('config.main.ConfigDBConnector') + def test_hostname_add(self, db_conn_patch, get_cmd_module): + db_conn_patch().mod_entry = mock.Mock() + (config, show) = get_cmd_module + + runner = CliRunner() + result = runner.invoke(config.config.commands["hostname"], + ["new_hostname"]) + + # Verify success + assert result.exit_code == 0 + + # Check was called + args_list = db_conn_patch().mod_entry.call_args_list + assert len(args_list) > 0 + + args, _ = args_list[0] + assert len(args) > 0 + + # Check new hostname was part of args + assert {'hostname': 'new_hostname'} in args + + @classmethod + def teardown_class(cls): + print("TEARDOWN")