This is an automated email from the ASF dual-hosted git repository.

dmeden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 7a572a6815 Make sure we let the user know we are about to perform an 
invalid (#9378)
7a572a6815 is described below

commit 7a572a6815b78aa99efda58736dd604f8e85af38
Author: Damian Meden <dme...@apache.org>
AuthorDate: Fri Feb 3 17:44:23 2023 +0000

    Make sure we let the user know we are about to perform an invalid (#9378)
    
    The convert2yaml script now shows a friendly message before failing.
    Also make the traceback output optional, add (-e) option.
---
 .../records/legacy_config/override_map.config       |  3 +++
 .../records/legacy_config/override_value.config     |  4 ++++
 .../records/records_config_to_yaml.test.py          | 17 +++++++++++++++++
 tools/records/convert2yaml.py                       | 21 ++++++++++++++++-----
 4 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/tests/gold_tests/records/legacy_config/override_map.config 
b/tests/gold_tests/records/legacy_config/override_map.config
new file mode 100644
index 0000000000..4a3b79ba99
--- /dev/null
+++ b/tests/gold_tests/records/legacy_config/override_map.config
@@ -0,0 +1,3 @@
+CONFIG proxy.config.ssl.client.verify.server.policy STRING DISABLED
+CONFIG proxy.config.ssl.client.verify.server.properties STRING ALL
+CONFIG proxy.config.ssl.client.verify.server INT 1
diff --git a/tests/gold_tests/records/legacy_config/override_value.config 
b/tests/gold_tests/records/legacy_config/override_value.config
new file mode 100644
index 0000000000..092f475dd1
--- /dev/null
+++ b/tests/gold_tests/records/legacy_config/override_value.config
@@ -0,0 +1,4 @@
+
+CONFIG proxy.config.ssl.client.verify.server INT 1
+CONFIG proxy.config.ssl.client.verify.server.policy STRING DISABLED
+CONFIG proxy.config.ssl.client.verify.server.properties STRING ALL
diff --git a/tests/gold_tests/records/records_config_to_yaml.test.py 
b/tests/gold_tests/records/records_config_to_yaml.test.py
index 7b160eb218..264e0ea504 100644
--- a/tests/gold_tests/records/records_config_to_yaml.test.py
+++ b/tests/gold_tests/records/records_config_to_yaml.test.py
@@ -41,3 +41,20 @@ tr.Processes.Default.Command = f'python3 convert2yaml.py -f 
old_records.config -
 tr.Processes.Default.Stream = 'gold/renamed_records.out'
 f = tr.Disk.File(f"generated{file_suffix}.yaml")
 f.Content = "gold/renamed_records.yaml"
+
+
+tr = Test.AddTestRun("Test errors when trying to override values ")
+tr.Setup.Copy(os.path.join(Test.Variables.BuildRoot, 
"tools/records/convert2yaml.py"))
+tr.Setup.Copy('legacy_config/override_value.config')
+tr.Processes.Default.Command = f'python3 convert2yaml.py -f 
override_value.config --save2 generated{file_suffix}.yaml --yaml -m'
+tr.Processes.Default.Streams.stdout += Testers.ContainsExpression(
+    "We cannot continue with 'proxy.config.ssl.client.verify.server.policy' at 
line '3' as a value node will be overridden",
+    "Error should be present")
+
+tr = Test.AddTestRun("Test errors when trying to override maps")
+tr.Setup.Copy(os.path.join(Test.Variables.BuildRoot, 
"tools/records/convert2yaml.py"))
+tr.Setup.Copy('legacy_config/override_map.config')
+tr.Processes.Default.Command = f'python3 convert2yaml.py -f 
override_map.config --save2 generated{file_suffix}.yaml --yaml -m'
+tr.Processes.Default.Streams.stdout += Testers.ContainsExpression(
+    "We cannot continue with 'proxy.config.ssl.client.verify.server' at line 
'3' as an existing YAML map will be overridden.",
+    "Error should be present")
diff --git a/tools/records/convert2yaml.py b/tools/records/convert2yaml.py
index fbf1ebf559..8407e27a11 100644
--- a/tools/records/convert2yaml.py
+++ b/tools/records/convert2yaml.py
@@ -190,17 +190,25 @@ def get_value(type, value):
     return None
 
 
-def add_object(config, var, value, type=None):
+def add_object(config, var, value, type, track_info):
     key = ''
     index = var.find('.')
     if index < 0:  # last part
+        if isinstance(config, dict) == False:
+            line, rec = track_info
+            raise Exception(
+                f"We cannot continue with '{rec}' at line '{line}' as a value 
node will be overridden.\nPlease check your config.")
+        elif var in config and isinstance(config[var], dict):
+            line, rec = track_info
+            raise Exception(
+                f"We cannot continue with '{rec}' at line '{line}' as an 
existing YAML map will be overridden.\nPlease check your config.")
         config[var] = get_value(type, value)
     else:
         key = var[:index]
         if key not in config:
             config[key] = {}
 
-        add_object(config[key], var[index + 1:], value, type=type)
+        add_object(config[key], var[index + 1:], value, type, track_info)
 
 
 def fix_record_names(file):
@@ -247,6 +255,7 @@ def handle_file_input(args):
             type = s[2]
             value = s[3]
 
+            track_info = (idx + 1, name)  # in case we want to show any error. 
rec name is always handy.
             # We ignore the prefix and work away from  there.
             if name.startswith("proxy.config."):
                 name = name[len("proxy.config."):]
@@ -256,7 +265,7 @@ def handle_file_input(args):
                 name = name[len("proxy."):]
 
             # Build the object
-            add_object(config, name, value[:-1], type)
+            add_object(config, name, value[:-1], type, track_info)
             idx = idx + 1
 
     ts = {}
@@ -286,6 +295,7 @@ if __name__ == '__main__':
         help="Be quiet, do not output anything, except for errors",
         required=False,
         action='store_true')
+    parser.add_argument('-e', '--error', help="Show traceback", 
required=False, action='store_true', default=False)
     kk = parser.add_mutually_exclusive_group(required=True)
     kk.add_argument('-j', '--json', help="Output as json", action='store_true')
     kk.add_argument('-y', '--yaml', help="Output as yaml", action='store_true')
@@ -302,9 +312,10 @@ if __name__ == '__main__':
             print_summary()
 
     except Exception as e:
-        print("Something went wrong: {}".format(e))
+        print("Something went wrong:\n{}".format(e))
 
-        print(traceback.format_exc())
+        if args.error:
+            print(f"\n{traceback.format_exc()}")
         sys.exit(1)
 
     sys.exit(0)

Reply via email to