From b5922923678fe977caa1e5d75266d24f8c7af613 Mon Sep 17 00:00:00 2001
From: jingwenxie <jingwenxie@microsoft.com>
Date: Tue, 20 Sep 2022 13:40:02 +0800
Subject: [PATCH] [minigraph] add option to specify golden path in
 load_minigraph (#2350)

What I did
Add an option for load_minigraph to specify golden path

How I did it
Add an option for load_minigraph

How to verify it
Unit test
---
 config/main.py       | 16 ++++++++++++----
 tests/config_test.py | 25 +++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/config/main.py b/config/main.py
index b6290e6a450..20739fc9321 100644
--- a/config/main.py
+++ b/config/main.py
@@ -1720,8 +1720,9 @@ def load_mgmt_config(filename):
                 expose_value=False, prompt='Reload config from minigraph?')
 @click.option('-n', '--no_service_restart', default=False, is_flag=True, help='Do not restart docker services')
 @click.option('-t', '--traffic_shift_away', default=False, is_flag=True, help='Keep device in maintenance with TSA')
+@click.option('-p', '--golden_config_path', help='The path of golden config file')
 @clicommon.pass_db
-def load_minigraph(db, no_service_restart, traffic_shift_away):
+def load_minigraph(db, no_service_restart, traffic_shift_away, golden_config_path):
     """Reconfigure based on minigraph."""
     log.log_info("'load_minigraph' executing...")
 
@@ -1794,13 +1795,20 @@ def load_minigraph(db, no_service_restart, traffic_shift_away):
     # Keep device isolated with TSA 
     if traffic_shift_away:
         clicommon.run_command("TSA", display_cmd=True)
-        if os.path.isfile(DEFAULT_GOLDEN_CONFIG_DB_FILE):
+        if golden_config_path or not golden_config_path and os.path.isfile(DEFAULT_GOLDEN_CONFIG_DB_FILE):
             log.log_warning("Golden configuration may override System Maintenance state. Please execute TSC to check the current System mode")
             click.secho("[WARNING] Golden configuration may override Traffic-shift-away state. Please execute TSC to check the current System mode")
 
     # Load golden_config_db.json
-    if os.path.isfile(DEFAULT_GOLDEN_CONFIG_DB_FILE):
-        override_config_by(DEFAULT_GOLDEN_CONFIG_DB_FILE)
+    if golden_config_path:
+        if not os.path.isfile(golden_config_path):
+            click.secho("Cannot find '{}'!".format(golden_config_path),
+                        fg='magenta')
+            raise click.Abort()
+        override_config_by(golden_config_path)
+    else:
+        if os.path.isfile(DEFAULT_GOLDEN_CONFIG_DB_FILE):
+            override_config_by(DEFAULT_GOLDEN_CONFIG_DB_FILE)
 
     # We first run "systemctl reset-failed" to remove the "failed"
     # status from all services before we attempt to restart them
diff --git a/tests/config_test.py b/tests/config_test.py
index a9f49825482..1374181f8b7 100644
--- a/tests/config_test.py
+++ b/tests/config_test.py
@@ -430,6 +430,31 @@ def is_file_side_effect(filename):
             assert result.exit_code == 0
             assert expected_output in result.output
 
+    def test_load_minigraph_with_non_exist_golden_config_path(self, get_cmd_module):
+        def is_file_side_effect(filename):
+            return True if 'golden_config' in filename else False
+        with mock.patch("utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect)) as mock_run_command, \
+                mock.patch('os.path.isfile', mock.MagicMock(side_effect=is_file_side_effect)):
+            (config, show) = get_cmd_module
+            runner = CliRunner()
+            result = runner.invoke(config.config.commands["load_minigraph"], ["-p", "non_exist.json", "-y"])
+            assert result.exit_code != 0
+            assert "Cannot find 'non_exist.json'" in result.output
+
+    def test_load_minigraph_with_golden_config_path(self, get_cmd_module):
+        def is_file_side_effect(filename):
+            return True if 'golden_config' in filename else False
+        with mock.patch("utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect)) as mock_run_command, \
+                mock.patch('os.path.isfile', mock.MagicMock(side_effect=is_file_side_effect)):
+            (config, show) = get_cmd_module
+            runner = CliRunner()
+            result = runner.invoke(config.config.commands["load_minigraph"], ["-p", "golden_config.json", "-y"])
+            print(result.exit_code)
+            print(result.output)
+            traceback.print_tb(result.exc_info[2])
+            assert result.exit_code == 0
+            assert "config override-config-table golden_config.json" in result.output
+
     def test_load_minigraph_with_traffic_shift_away(self, get_cmd_module):
         with mock.patch("utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect)) as mock_run_command:
             (config, show) = get_cmd_module