From f2a5d795fa4022685a341ec7e2e2a6838bb2f2a0 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Mon, 23 Jan 2023 00:55:32 -0800 Subject: [PATCH 1/3] Update override_config_table fr multi-asic platforms --- config/main.py | 65 +++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/config/main.py b/config/main.py index 5fdc177e2e..30eb03bc7e 100644 --- a/config/main.py +++ b/config/main.py @@ -1893,36 +1893,37 @@ def override_config_table(db, input_config_db, dry_run): fg='magenta') sys.exit(1) - config_db = db.cfgdb - - # 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) - - 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() - cm.validateConfigData() - except Exception as ex: - click.secho("Failed to validate running config. Error: {}".format(ex), fg="magenta") - sys.exit(1) + # Do the yang validation and config override for host namespace and + # other namespaces in case of multi-asic platform + for ns, config_db in db.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) + + 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() + 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, 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, 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): @@ -1944,17 +1945,17 @@ def update_config(current_config, config_input): def override_config_db(config_db, config_input): + namespace = "Host" if ns is DEFAULT_NAMESPACE else ns # Deserialized golden config to DB recognized format sonic_cfggen.FormatConverter.to_deserialized(config_input) # Delete table from DB then mod_config to apply golden config - click.echo("Removing configDB overriden table first ...") + click.echo("{} namespace - Removing configDB overriden table first ...".format(namespace)) for table in config_input: config_db.delete_table(table) - click.echo("Overriding input config to configDB ...") + click.echo("{} namespace - Overriding input config to configDB ...".format(namespace)) data = sonic_cfggen.FormatConverter.output_to_db(config_input) config_db.mod_config(data) - click.echo("Overriding completed. No service is restarted.") - + click.echo("{} namespace - Overriding completed. No service is restarted.".format(namespace)) # # 'hostname' command From 1afd692a21e888f4c22262f84f0789debc8fcc6a Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Mon, 23 Jan 2023 13:24:44 -0800 Subject: [PATCH 2/3] Fix the missing parameter to function override_config_db --- config/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/main.py b/config/main.py index 30eb03bc7e..38eb11b932 100644 --- a/config/main.py +++ b/config/main.py @@ -1923,7 +1923,7 @@ def override_config_table(db, input_config_db, dry_run): print(json.dumps(updated_config, sort_keys=True, indent=4, cls=minigraph_encoder)) else: - override_config_db(config_db, config_input) + override_config_db(ns, config_db, config_input) def validate_config_by_cm(cm, config_json, jname): @@ -1944,7 +1944,7 @@ def update_config(current_config, config_input): return updated_config -def override_config_db(config_db, config_input): +def override_config_db(ns, config_db, config_input): namespace = "Host" if ns is DEFAULT_NAMESPACE else ns # Deserialized golden config to DB recognized format sonic_cfggen.FormatConverter.to_deserialized(config_input) From 1bca842cd913225add5f641741dbdf04f77f61ec Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Fri, 10 Feb 2023 10:39:50 -0800 Subject: [PATCH 3/3] Fix comments --- config/main.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/config/main.py b/config/main.py index 38eb11b932..bf242aa8c2 100644 --- a/config/main.py +++ b/config/main.py @@ -1893,9 +1893,23 @@ def override_config_table(db, input_config_db, dry_run): fg='magenta') sys.exit(1) - # Do the yang validation and config override for host namespace and + + # List of Tables that needs to be populated in host and asic namespaces + tables_per_namespace = {"MACSEC_PROFILE"} + + # Get the namespace db connector where we really need to override the config. + # if any of the table in config_input is part of the list tables_per_namespace + # we override config in all namespaces, else do it only in host namespace. + db_list = {} + db_list[DEFAULT_NAMESPACE] = db.cfgdb + for table in config_input: + if table in tables_per_namespace: + db_list = db.cfgdb_clients + break + + # Do the yang validation and config override for host namespace and # other namespaces in case of multi-asic platform - for ns, config_db in db.cfgdb_clients.items(): + for ns, config_db in db_list.items(): # Read config from configDB current_config = config_db.get_config() # Serialize to the same format as json input @@ -1923,8 +1937,9 @@ def override_config_table(db, input_config_db, dry_run): print(json.dumps(updated_config, sort_keys=True, indent=4, cls=minigraph_encoder)) else: - override_config_db(ns, config_db, config_input) - + namespace = "Host" if ns is DEFAULT_NAMESPACE else ns + click.echo("Working in {} namespace :".format(namespace)) + override_config_db(config_db, config_input) def validate_config_by_cm(cm, config_json, jname): tmp_config_json = copy.deepcopy(config_json) @@ -1944,18 +1959,17 @@ def update_config(current_config, config_input): return updated_config -def override_config_db(ns, config_db, config_input): - namespace = "Host" if ns is DEFAULT_NAMESPACE else ns +def override_config_db(config_db, config_input): # Deserialized golden config to DB recognized format sonic_cfggen.FormatConverter.to_deserialized(config_input) # Delete table from DB then mod_config to apply golden config - click.echo("{} namespace - Removing configDB overriden table first ...".format(namespace)) + click.echo(" - Removing configDB overriden table first ...") for table in config_input: config_db.delete_table(table) - click.echo("{} namespace - Overriding input config to configDB ...".format(namespace)) + click.echo(" - Overriding input config to configDB ...") data = sonic_cfggen.FormatConverter.output_to_db(config_input) config_db.mod_config(data) - click.echo("{} namespace - Overriding completed. No service is restarted.".format(namespace)) + click.echo(" - Overriding completed. No service is restarted.") # # 'hostname' command