diff --git a/config/config_mgmt.py b/config/config_mgmt.py index 05353a343a..a10393c72c 100644 --- a/config/config_mgmt.py +++ b/config/config_mgmt.py @@ -35,8 +35,7 @@ class ConfigMgmt(): to verify config for the commands which are capable of change in config DB. ''' - def __init__(self, source="configDB", debug=False, allowTablesWithoutYang=True, - sonicYangOptions=0, configdb=None): + def __init__(self, source="configDB", debug=False, allowTablesWithoutYang=True, sonicYangOptions=0): ''' Initialise the class, --read the config, --load in data tree. @@ -45,7 +44,6 @@ def __init__(self, source="configDB", debug=False, allowTablesWithoutYang=True, debug (bool): verbose mode. allowTablesWithoutYang (bool): allow tables without yang model in config or not. - configdb: configdb to work on. Returns: void @@ -56,11 +54,6 @@ def __init__(self, source="configDB", debug=False, allowTablesWithoutYang=True, self.source = source self.allowTablesWithoutYang = allowTablesWithoutYang self.sonicYangOptions = sonicYangOptions - if configdb is None: - self.configdb = ConfigDBConnector() - self.configdb.connect() - else: - self.configdb = configdb # logging vars self.SYSLOG_IDENTIFIER = "ConfigMgmt" @@ -201,7 +194,8 @@ def readConfigDB(self): self.sysLog(doPrint=True, msg='Reading data from Redis configDb') # Read from config DB on sonic switch data = dict() - configdb = self.configdb + configdb = ConfigDBConnector() + configdb.connect() sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.db_to_output(configdb.get_config())) self.configdbJsonIn = sonic_cfggen.FormatConverter.to_serialized(data) self.sysLog(syslog.LOG_DEBUG, 'Reading Input from ConfigDB {}'.\ @@ -221,7 +215,8 @@ def writeConfigDB(self, jDiff): ''' self.sysLog(doPrint=True, msg='Writing in Config DB') data = dict() - configdb = self.configdb + configdb = ConfigDBConnector() + configdb.connect(False) sonic_cfggen.deep_update(data, sonic_cfggen.FormatConverter.to_deserialized(jDiff)) self.sysLog(msg="Write in DB: {}".format(data)) configdb.mod_config(sonic_cfggen.FormatConverter.output_to_db(data)) diff --git a/config/main.py b/config/main.py index a18f11e3ef..cfe862af52 100644 --- a/config/main.py +++ b/config/main.py @@ -1849,41 +1849,36 @@ def override_config_table(db, input_config_db, dry_run): fg='magenta') sys.exit(1) - cfgdb_clients = db.cfgdb_clients + config_db = db.cfgdb - for ns, config_db in cfgdb_clients.items(): - # Read config from configDB - current_config = config_db.get_config() - # Serialize to the same format as json input - sonic_cfggen.FormatConverter.to_serialized(current_config) + # Read config from configDB + current_config = config_db.get_config() + # Serialize to the same format as json input + sonic_cfggen.FormatConverter.to_serialized(current_config) - if multi_asic.is_multi_asic(): - ns_config_input = config_input[ns] - else: - ns_config_input = config_input - updated_config = update_config(current_config, ns_config_input) + updated_config = update_config(current_config, config_input) - yang_enabled = device_info.is_yang_config_validation_enabled(config_db) - if yang_enabled: - # The ConfigMgmt will load YANG and running - # config during initialization. - try: - cm = ConfigMgmt(configdb=config_db) - cm.validateConfigData() - except Exception as ex: - click.secho("Failed to validate running config. Error: {}".format(ex), fg="magenta") - sys.exit(1) + yang_enabled = device_info.is_yang_config_validation_enabled(config_db) + if yang_enabled: + # The ConfigMgmt will load YANG and running + # config during initialization. + try: + cm = ConfigMgmt() + cm.validateConfigData() + except Exception as ex: + click.secho("Failed to validate running config. Error: {}".format(ex), fg="magenta") + sys.exit(1) - # Validate input config - validate_config_by_cm(cm, ns_config_input, "config_input") - # Validate updated whole config - validate_config_by_cm(cm, updated_config, "updated_config") + # Validate input config + validate_config_by_cm(cm, config_input, "config_input") + # Validate updated whole config + validate_config_by_cm(cm, updated_config, "updated_config") - if dry_run: - print(json.dumps(updated_config, sort_keys=True, - indent=4, cls=minigraph_encoder)) - else: - override_config_db(config_db, ns_config_input) + if dry_run: + print(json.dumps(updated_config, sort_keys=True, + indent=4, cls=minigraph_encoder)) + else: + override_config_db(config_db, config_input) def validate_config_by_cm(cm, config_json, jname): diff --git a/tests/config_override_input/multi_asic_dm_rm.json b/tests/config_override_input/multi_asic_dm_rm.json deleted file mode 100644 index 51c0da15c6..0000000000 --- a/tests/config_override_input/multi_asic_dm_rm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "": { - "DEVICE_METADATA": {} - }, - "asic0": { - "DEVICE_METADATA": {} - }, - "asic1": { - "DEVICE_METADATA": {} - } -} diff --git a/tests/config_override_input/multi_asic_macsec_ov.json b/tests/config_override_input/multi_asic_macsec_ov.json deleted file mode 100644 index 220d779f76..0000000000 --- a/tests/config_override_input/multi_asic_macsec_ov.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "": { - "MACSEC_PROFILE": { - "profile": { - "key": "value" - } - } - }, - "asic0": { - "MACSEC_PROFILE": { - "profile": { - "key": "value" - } - } - }, - "asic1": { - "MACSEC_PROFILE": { - "profile": { - "key": "value" - } - } - } -} diff --git a/tests/config_override_test.py b/tests/config_override_test.py index ca14ae75bb..1b058ace13 100644 --- a/tests/config_override_test.py +++ b/tests/config_override_test.py @@ -1,7 +1,6 @@ import os import json import filecmp -import importlib import config.main as config from click.testing import CliRunner @@ -21,8 +20,6 @@ RUNNING_CONFIG_YANG_FAILURE = os.path.join(DATA_DIR, "running_config_yang_failure.json") GOLDEN_INPUT_YANG_FAILURE = os.path.join(DATA_DIR, "golden_input_yang_failure.json") FINAL_CONFIG_YANG_FAILURE = os.path.join(DATA_DIR, "final_config_yang_failure.json") -MULTI_ASIC_MACSEC_OV = os.path.join(DATA_DIR, "multi_asic_macsec_ov.json") -MULTI_ASIC_DEVICE_METADATA_RM = os.path.join(DATA_DIR, "multi_asic_dm_rm.json") # Load sonic-cfggen from source since /usr/local/bin/sonic-cfggen does not have .py extension. sonic_cfggen = load_module_from_source('sonic_cfggen', '/usr/local/bin/sonic-cfggen') @@ -176,7 +173,7 @@ def test_yang_verification_enabled(self): def is_yang_config_validation_enabled_side_effect(filename): return True - def config_mgmt_side_effect(configdb): + def config_mgmt_side_effect(): return config_mgmt.ConfigMgmt(source=CONFIG_DB_JSON_FILE) db = Db() @@ -235,7 +232,7 @@ def check_yang_verification_failure(self, db, config, running_config, def read_json_file_side_effect(filename): return golden_config - def config_mgmt_side_effect(configdb): + def config_mgmt_side_effect(): return config_mgmt.ConfigMgmt(source=CONFIG_DB_JSON_FILE) # ConfigMgmt will call ConfigDBConnector to load default config_db.json. @@ -260,73 +257,3 @@ def teardown_class(cls): print("TEARDOWN") os.environ["UTILITIES_UNIT_TESTING"] = "0" return - - -class TestConfigOverrideMultiasic(object): - @classmethod - def setup_class(cls): - print("SETUP") - os.environ["UTILITIES_UNIT_TESTING"] = "1" - os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic" - # change to multi asic config - from .mock_tables import dbconnector - from .mock_tables import mock_multi_asic - importlib.reload(mock_multi_asic) - dbconnector.load_namespace_config() - return - - def test_macsec_override(self): - def read_json_file_side_effect(filename): - with open(MULTI_ASIC_MACSEC_OV, "r") as f: - macsec_profile = json.load(f) - return macsec_profile - db = Db() - cfgdb_clients = db.cfgdb_clients - - # The profile_content was copied from MULTI_ASIC_MACSEC_OV, where all - # ns sharing the same content: {"profile": {"key": "value"}} - profile_content = {"profile": {"key": "value"}} - - with mock.patch('config.main.read_json_file', - mock.MagicMock(side_effect=read_json_file_side_effect)): - runner = CliRunner() - result = runner.invoke(config.config.commands["override-config-table"], - ['golden_config_db.json'], obj=db) - assert result.exit_code == 0 - - for ns, config_db in cfgdb_clients.items(): - assert config_db.get_config()['MACSEC_PROFILE'] == profile_content - - def test_device_metadata_table_rm(self): - def read_json_file_side_effect(filename): - with open(MULTI_ASIC_DEVICE_METADATA_RM, "r") as f: - device_metadata = json.load(f) - return device_metadata - db = Db() - cfgdb_clients = db.cfgdb_clients - - for ns, config_db in cfgdb_clients.items(): - assert 'DEVICE_METADATA' in config_db.get_config() - - with mock.patch('config.main.read_json_file', - mock.MagicMock(side_effect=read_json_file_side_effect)): - runner = CliRunner() - result = runner.invoke(config.config.commands["override-config-table"], - ['golden_config_db.json'], obj=db) - assert result.exit_code == 0 - - for ns, config_db in cfgdb_clients.items(): - assert 'DEVICE_METADATA' not in config_db.get_config() - - - @classmethod - def teardown_class(cls): - print("TEARDOWN") - os.environ["UTILITIES_UNIT_TESTING"] = "0" - os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "" - # change back to single asic config - from .mock_tables import dbconnector - from .mock_tables import mock_single_asic - importlib.reload(mock_single_asic) - dbconnector.load_namespace_config() - return