diff --git a/scripts/db_migrator.py b/scripts/db_migrator.py index 761f858fe88..0f009985cd4 100755 --- a/scripts/db_migrator.py +++ b/scripts/db_migrator.py @@ -9,9 +9,10 @@ from sonic_py_common import device_info, logger from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector, SonicDBConfig -from db_migrator_constants import RESTAPI, TELEMETRY, CONSOLE_SWITCH +from minigraph import parse_xml INIT_CFG_FILE = '/etc/sonic/init_cfg.json' +MINIGRAPH_FILE = '/etc/sonic/minigraph.xml' # mock the redis for unit test purposes # try: @@ -22,6 +23,7 @@ sys.path.insert(0, modules_path) sys.path.insert(0, tests_path) INIT_CFG_FILE = os.path.join(mocked_db_path, "init_cfg.json") + MINIGRAPH_FILE = os.path.join(mocked_db_path, "minigraph.xml") except KeyError: pass @@ -51,6 +53,16 @@ def __init__(self, namespace, socket=None): self.TABLE_KEY = 'DATABASE' self.TABLE_FIELD = 'VERSION' + # load config data from minigraph to get the default/hardcoded values from minigraph.py + # this is to avoid duplicating the hardcoded these values in db_migrator + self.minigraph_data = None + try: + if os.path.isfile(MINIGRAPH_FILE): + self.minigraph_data = parse_xml(MINIGRAPH_FILE) + except Exception as e: + log.log_error('Caught exception while trying to parse minigraph: ' + str(e)) + pass + db_kwargs = {} if socket: db_kwargs['unix_socket_path'] = socket @@ -527,38 +539,50 @@ def migrate_vxlan_config(self): def migrate_restapi(self): # RESTAPI - add missing key + if not self.minigraph_data or 'RESTAPI' not in self.minigraph_data: + return + restapi_data = self.minigraph_data['RESTAPI'] log.log_notice('Migrate RESTAPI configuration') config = self.configDB.get_entry('RESTAPI', 'config') if not config: - self.configDB.set_entry("RESTAPI", "config", RESTAPI.get("config")) + self.configDB.set_entry("RESTAPI", "config", restapi_data.get("config")) certs = self.configDB.get_entry('RESTAPI', 'certs') if not certs: - self.configDB.set_entry("RESTAPI", "certs", RESTAPI.get("certs")) + self.configDB.set_entry("RESTAPI", "certs", restapi_data.get("certs")) def migrate_telemetry(self): # TELEMETRY - add missing key + if not self.minigraph_data or 'TELEMETRY' not in self.minigraph_data: + return + telemetry_data = self.minigraph_data['TELEMETRY'] log.log_notice('Migrate TELEMETRY configuration') gnmi = self.configDB.get_entry('TELEMETRY', 'gnmi') if not gnmi: - self.configDB.set_entry("TELEMETRY", "gnmi", TELEMETRY.get("gnmi")) + self.configDB.set_entry("TELEMETRY", "gnmi", telemetry_data.get("gnmi")) certs = self.configDB.get_entry('TELEMETRY', 'certs') if not certs: - self.configDB.set_entry("TELEMETRY", "certs", TELEMETRY.get("certs")) + self.configDB.set_entry("TELEMETRY", "certs", telemetry_data.get("certs")) def migrate_console_switch(self): # CONSOLE_SWITCH - add missing key + if not self.minigraph_data or 'CONSOLE_SWITCH' not in self.minigraph_data: + return + console_switch_data = self.minigraph_data['CONSOLE_SWITCH'] log.log_notice('Migrate CONSOLE_SWITCH configuration') console_mgmt = self.configDB.get_entry('CONSOLE_SWITCH', 'console_mgmt') if not console_mgmt: self.configDB.set_entry("CONSOLE_SWITCH", "console_mgmt", - CONSOLE_SWITCH.get("console_mgmt")) + console_switch_data.get("console_mgmt")) def migrate_device_metadata(self): # DEVICE_METADATA - synchronous_mode entry - log.log_notice('Migrate DEVICE_METADATA missing configuration (synchronous_mode=enable)') + if not self.minigraph_data or 'DEVICE_METADATA' not in self.minigraph_data: + return + log.log_notice('Migrate DEVICE_METADATA missing configuration') metadata = self.configDB.get_entry('DEVICE_METADATA', 'localhost') + device_metadata_data = self.minigraph_data["DEVICE_METADATA"]["localhost"] if 'synchronous_mode' not in metadata: - metadata['synchronous_mode'] = 'enable' + metadata['synchronous_mode'] = device_metadata_data.get("synchronous_mode") self.configDB.set_entry('DEVICE_METADATA', 'localhost', metadata) def migrate_port_qos_map_global(self): diff --git a/scripts/db_migrator_constants.py b/scripts/db_migrator_constants.py deleted file mode 100644 index 71237a56557..00000000000 --- a/scripts/db_migrator_constants.py +++ /dev/null @@ -1,32 +0,0 @@ -RESTAPI = { - "config": { - "client_auth": "true", - "log_level": "info", - "allow_insecure": "false" - }, - "certs": { - "server_key": "/etc/sonic/credentials/restapiserver.key", - "ca_crt": "/etc/sonic/credentials/AME_ROOT_CERTIFICATE.pem", - "server_crt": "/etc/sonic/credentials/restapiserver.crt", - "client_crt_cname": "client.restapi.sonic.gbl" - } - } - -TELEMETRY = { - "gnmi": { - "client_auth": "true", - "log_level": "2", - "port": "50051" - }, - "certs": { - "server_key": "/etc/sonic/telemetry/streamingtelemetryserver.key", - "ca_crt": "/etc/sonic/telemetry/dsmsroot.cer", - "server_crt": "/etc/sonic/telemetry/streamingtelemetryserver.cer" - } -} - -CONSOLE_SWITCH = { - "console_mgmt": { - "enabled": "no" - } -} diff --git a/setup.py b/setup.py index 70b7aa66a67..45eefb2a041 100644 --- a/setup.py +++ b/setup.py @@ -117,7 +117,6 @@ 'scripts/coredump-compress', 'scripts/configlet', 'scripts/db_migrator.py', - 'scripts/db_migrator_constants.py', 'scripts/decode-syseeprom', 'scripts/dropcheck', 'scripts/disk_check.py', diff --git a/tests/db_migrator_input/config_db/cross_branch_upgrade_to_version_2_0_2_expected.json b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_version_2_0_2_expected.json index c975229287f..946a9812b75 100644 --- a/tests/db_migrator_input/config_db/cross_branch_upgrade_to_version_2_0_2_expected.json +++ b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_version_2_0_2_expected.json @@ -6,9 +6,9 @@ }, "RESTAPI|certs": { "server_key": "/etc/sonic/credentials/restapiserver.key", - "ca_crt": "/etc/sonic/credentials/AME_ROOT_CERTIFICATE.pem", - "server_crt": "/etc/sonic/credentials/restapiserver.crt", - "client_crt_cname": "client.restapi.sonic.gbl" + "ca_crt": "/etc/sonic/credentials/restapica.crt", + "server_crt": "/etc/sonic/credentials/restapiserver.crt", + "client_crt_cname": "client.restapi.sonic" }, "TELEMETRY|gnmi": { "client_auth": "true", diff --git a/tests/db_migrator_input/minigraph.xml b/tests/db_migrator_input/minigraph.xml new file mode 100644 index 00000000000..dcadac306e0 --- /dev/null +++ b/tests/db_migrator_input/minigraph.xml @@ -0,0 +1,29 @@ + + + + + + + SONiC-Dummy + + + + + + + + + + SONiC-Dummy + + + + + + + + + + + SONiC-Dummy + \ No newline at end of file diff --git a/tests/db_migrator_test.py b/tests/db_migrator_test.py index f063e43e4a7..e038db93bb6 100644 --- a/tests/db_migrator_test.py +++ b/tests/db_migrator_test.py @@ -501,7 +501,6 @@ def test_warm_upgrade_to_2_0_2(self): dbconnector.dedicated_dbs['CONFIG_DB'] = os.path.join(mock_db_path, 'config_db', 'cross_branch_upgrade_to_version_2_0_2_expected') expected_db = Db() - expected_db new_tables = ["RESTAPI", "TELEMETRY", "CONSOLE_SWITCH"] for table in new_tables: resulting_table = dbmgtr.configDB.get_table(table) @@ -509,6 +508,24 @@ def test_warm_upgrade_to_2_0_2(self): diff = DeepDiff(resulting_table, expected_table, ignore_order=True) assert not diff + def test_warm_upgrade__without_mg_to_2_0_2(self): + dbconnector.dedicated_dbs['CONFIG_DB'] = os.path.join(mock_db_path, 'config_db', 'cross_branch_upgrade_to_version_2_0_2_input') + import db_migrator + dbmgtr = db_migrator.DBMigrator(None) + # set minigraph_data to None to mimic the missing minigraph.xml scenario + dbmgtr.minigraph_data = None + dbmgtr.migrate() + dbconnector.dedicated_dbs['CONFIG_DB'] = os.path.join(mock_db_path, 'config_db', 'cross_branch_upgrade_without_mg_2_0_2_expected.json') + expected_db = Db() + + new_tables = ["RESTAPI", "TELEMETRY", "CONSOLE_SWITCH"] + for table in new_tables: + resulting_table = dbmgtr.configDB.get_table(table) + expected_table = expected_db.cfgdb.get_table(table) + print(resulting_table) + diff = DeepDiff(resulting_table, expected_table, ignore_order=True) + assert not diff + class Test_Migrate_Loopback(object): @classmethod def setup_class(cls):