diff --git a/scripts/db_migrator.py b/scripts/db_migrator.py index c8d452c938..a6b2c9c891 100755 --- a/scripts/db_migrator.py +++ b/scripts/db_migrator.py @@ -45,7 +45,7 @@ def __init__(self, namespace, socket=None): none-zero values. build: sequentially increase within a minor version domain. """ - self.CURRENT_VERSION = 'version_4_0_2' + self.CURRENT_VERSION = 'version_4_0_3' self.TABLE_NAME = 'VERSIONS' self.TABLE_KEY = 'DATABASE' @@ -631,6 +631,20 @@ def update_edgezone_aggregator_config(self): # Set new cable length values self.configDB.set(self.configDB.CONFIG_DB, "CABLE_LENGTH|AZURE", intf, EDGEZONE_AGG_CABLE_LENGTH) + def migrate_config_db_flex_counter_delay_status(self): + """ + Migrate "FLEX_COUNTER_TABLE|*": { "value": { "FLEX_COUNTER_DELAY_STATUS": "false" } } + Set FLEX_COUNTER_DELAY_STATUS true in case of fast-reboot + """ + + flex_counter_objects = self.configDB.get_keys('FLEX_COUNTER_TABLE') + for obj in flex_counter_objects: + flex_counter = self.configDB.get_entry('FLEX_COUNTER_TABLE', obj) + delay_status = flex_counter.get('FLEX_COUNTER_DELAY_STATUS') + if delay_status is None or delay_status == 'false': + flex_counter['FLEX_COUNTER_DELAY_STATUS'] = 'true' + self.configDB.mod_entry('FLEX_COUNTER_TABLE', obj, flex_counter) + def version_unknown(self): """ version_unknown tracks all SONiC versions that doesn't have a version @@ -892,10 +906,9 @@ def version_3_0_5(self): def version_3_0_6(self): """ Version 3_0_6 - This is the latest version for 202211 branch """ - log.log_info('Handling version_3_0_6') + self.set_version('version_4_0_0') return 'version_4_0_0' @@ -929,9 +942,19 @@ def version_4_0_1(self): def version_4_0_2(self): """ Version 4_0_2. - This is the latest version for master branch """ log.log_info('Handling version_4_0_2') + if self.stateDB.keys(self.stateDB.STATE_DB, "FAST_REBOOT|system"): + self.migrate_config_db_flex_counter_delay_status() + self.set_version('version_4_0_3') + return 'version_4_0_3' + + def version_4_0_3(self): + """ + Version 4_0_3. + This is the latest version for 202211 branch + """ + log.log_info('Handling version_4_0_3') return None def get_version(self): diff --git a/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_expected.json b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_expected.json new file mode 100644 index 0000000000..1ebfbc6afe --- /dev/null +++ b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_expected.json @@ -0,0 +1,19 @@ +{ + "VERSIONS|DATABASE": { + "VERSION": "version_4_0_3" + }, + "FLEX_COUNTER_TABLE|ACL": { + "FLEX_COUNTER_STATUS": "true", + "FLEX_COUNTER_DELAY_STATUS": "true", + "POLL_INTERVAL": "10000" + }, + "FLEX_COUNTER_TABLE|QUEUE": { + "FLEX_COUNTER_STATUS": "true", + "FLEX_COUNTER_DELAY_STATUS": "true", + "POLL_INTERVAL": "10000" + }, + "FLEX_COUNTER_TABLE|PG_WATERMARK": { + "FLEX_COUNTER_STATUS": "false", + "FLEX_COUNTER_DELAY_STATUS": "true" + } +} diff --git a/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_input.json b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_input.json new file mode 100644 index 0000000000..07ce763683 --- /dev/null +++ b/tests/db_migrator_input/config_db/cross_branch_upgrade_to_4_0_3_input.json @@ -0,0 +1,18 @@ +{ + "VERSIONS|DATABASE": { + "VERSION": "version_1_0_1" + }, + "FLEX_COUNTER_TABLE|ACL": { + "FLEX_COUNTER_STATUS": "true", + "FLEX_COUNTER_DELAY_STATUS": "true", + "POLL_INTERVAL": "10000" + }, + "FLEX_COUNTER_TABLE|QUEUE": { + "FLEX_COUNTER_STATUS": "true", + "FLEX_COUNTER_DELAY_STATUS": "false", + "POLL_INTERVAL": "10000" + }, + "FLEX_COUNTER_TABLE|PG_WATERMARK": { + "FLEX_COUNTER_STATUS": "false" + } +} diff --git a/tests/db_migrator_input/state_db/fast_reboot_upgrade.json b/tests/db_migrator_input/state_db/fast_reboot_upgrade.json new file mode 100644 index 0000000000..463dd89e73 --- /dev/null +++ b/tests/db_migrator_input/state_db/fast_reboot_upgrade.json @@ -0,0 +1,5 @@ +{ + "FAST_REBOOT|system": { + "enable": "true" + } +} diff --git a/tests/db_migrator_test.py b/tests/db_migrator_test.py index 9c1314ac15..3db5be4155 100644 --- a/tests/db_migrator_test.py +++ b/tests/db_migrator_test.py @@ -588,3 +588,39 @@ def test_warm_upgrade_t0_edgezone_aggregator_same_cable_length(self): diff = DeepDiff(resulting_table, expected_table, ignore_order=True) assert not diff + + +class TestFastUpgrade_to_4_0_3(object): + @classmethod + def setup_class(cls): + os.environ['UTILITIES_UNIT_TESTING'] = "2" + cls.config_db_tables_to_verify = ['FLEX_COUNTER_TABLE'] + dbconnector.dedicated_dbs['STATE_DB'] = os.path.join(mock_db_path, 'state_db', 'fast_reboot_upgrade') + + @classmethod + def teardown_class(cls): + os.environ['UTILITIES_UNIT_TESTING'] = "0" + dbconnector.dedicated_dbs['CONFIG_DB'] = None + dbconnector.dedicated_dbs['STATE_DB'] = None + + def mock_dedicated_config_db(self, filename): + jsonfile = os.path.join(mock_db_path, 'config_db', filename) + dbconnector.dedicated_dbs['CONFIG_DB'] = jsonfile + db = Db() + return db + + def check_config_db(self, result, expected): + for table in self.config_db_tables_to_verify: + assert result.get_table(table) == expected.get_table(table) + + def test_fast_reboot_upgrade_to_4_0_3(self): + db_before_migrate = 'cross_branch_upgrade_to_4_0_3_input' + db_after_migrate = 'cross_branch_upgrade_to_4_0_3_expected' + device_info.get_sonic_version_info = get_sonic_version_info_mlnx + db = self.mock_dedicated_config_db(db_before_migrate) + import db_migrator + dbmgtr = db_migrator.DBMigrator(None) + dbmgtr.migrate() + expected_db = self.mock_dedicated_config_db(db_after_migrate) + assert not self.check_config_db(dbmgtr.configDB, expected_db.cfgdb) + assert dbmgtr.CURRENT_VERSION == expected_db.cfgdb.get_entry('VERSIONS', 'DATABASE')['VERSION']