From 54539aebe19e3fd604723b3cf0da1f34bd86b841 Mon Sep 17 00:00:00 2001
From: sxt1001 <shixuantong1@huawei.com>
Date: Sun, 14 May 2023 22:24:32 +0800
Subject: [PATCH] remove schema errors from log for cloudinit/config/cc_*

---
 cloudinit/config/cc_apk_configure.py                  |  2 +-
 cloudinit/config/cc_apt_configure.py                  |  2 +-
 cloudinit/config/cc_bootcmd.py                        |  2 +-
 cloudinit/config/cc_chef.py                           |  2 +-
 cloudinit/config/cc_install_hotplug.py                |  2 +-
 cloudinit/config/cc_locale.py                         |  2 +-
 cloudinit/config/cc_ntp.py                            |  2 +-
 cloudinit/config/cc_resizefs.py                       |  2 +-
 cloudinit/config/cc_runcmd.py                         |  2 +-
 cloudinit/config/cc_snap.py                           |  2 +-
 cloudinit/config/cc_ubuntu_advantage.py               |  2 +-
 cloudinit/config/cc_ubuntu_drivers.py                 |  2 +-
 cloudinit/config/cc_write_files.py                    |  2 +-
 cloudinit/config/cc_write_files_deferred.py           |  2 +-
 cloudinit/config/tests/test_snap.py                   |  5 ++---
 tests/unittests/test_handler/test_handler_bootcmd.py  |  8 ++++----
 tests/unittests/test_handler/test_handler_resizefs.py |  4 ++--
 tests/unittests/test_handler/test_handler_runcmd.py   |  8 ++++----
 .../test_handler/test_handler_write_files.py          | 11 ++++++-----
 .../test_handler/test_handler_write_files_deferred.py |  7 +++++--
 20 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/cloudinit/config/cc_apk_configure.py b/cloudinit/config/cc_apk_configure.py
index 84d7a0b..09acdbd 100644
--- a/cloudinit/config/cc_apk_configure.py
+++ b/cloudinit/config/cc_apk_configure.py
@@ -200,7 +200,7 @@ def handle(name, cfg, cloud, log, _args):
                    " no 'apk_repos' section found"), name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
 
     # If "preserve_repositories" is explicitly set to True in
     # the configuration do nothing.
diff --git a/cloudinit/config/cc_apt_configure.py b/cloudinit/config/cc_apt_configure.py
index 86d0fea..342eded 100644
--- a/cloudinit/config/cc_apt_configure.py
+++ b/cloudinit/config/cc_apt_configure.py
@@ -451,7 +451,7 @@ def handle(name, ocfg, cloud, log, _):
             "Expected dictionary for 'apt' config, found {config_type}".format(
                 config_type=type(cfg)))
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     apply_debconf_selections(cfg, target)
     apply_apt(cfg, cloud, target)
 
diff --git a/cloudinit/config/cc_bootcmd.py b/cloudinit/config/cc_bootcmd.py
index 246e449..5383126 100644
--- a/cloudinit/config/cc_bootcmd.py
+++ b/cloudinit/config/cc_bootcmd.py
@@ -84,7 +84,7 @@ def handle(name, cfg, cloud, log, _args):
                    " no 'bootcmd' key in configuration"), name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     with temp_utils.ExtendedTemporaryFile(suffix=".sh") as tmpf:
         try:
             content = util.shellify(cfg["bootcmd"])
diff --git a/cloudinit/config/cc_chef.py b/cloudinit/config/cc_chef.py
index 7b20222..cb9fe12 100644
--- a/cloudinit/config/cc_chef.py
+++ b/cloudinit/config/cc_chef.py
@@ -408,7 +408,7 @@ def handle(name, cfg, cloud, log, _args):
                    " no 'chef' key in configuration"), name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     chef_cfg = cfg['chef']
 
     # Ensure the chef directories we use exist
diff --git a/cloudinit/config/cc_install_hotplug.py b/cloudinit/config/cc_install_hotplug.py
index da98c40..08cc802 100644
--- a/cloudinit/config/cc_install_hotplug.py
+++ b/cloudinit/config/cc_install_hotplug.py
@@ -95,7 +95,7 @@ LABEL="cloudinit_end"
 
 
 def handle(_name, cfg, cloud, log, _args):
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     network_hotplug_enabled = (
         'updates' in cfg and
         'network' in cfg['updates'] and
diff --git a/cloudinit/config/cc_locale.py b/cloudinit/config/cc_locale.py
index 4f8b7bf..ff55186 100644
--- a/cloudinit/config/cc_locale.py
+++ b/cloudinit/config/cc_locale.py
@@ -71,7 +71,7 @@ def handle(name, cfg, cloud, log, args):
                   name, locale)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
 
     log.debug("Setting locale to %s", locale)
     locale_cfgfile = util.get_cfg_option_str(cfg, "locale_configfile")
diff --git a/cloudinit/config/cc_ntp.py b/cloudinit/config/cc_ntp.py
index b107359..d37cb3f 100644
--- a/cloudinit/config/cc_ntp.py
+++ b/cloudinit/config/cc_ntp.py
@@ -539,7 +539,7 @@ def handle(name, cfg, cloud, log, _args):
             "'ntp' key existed in config, but not a dictionary type,"
             " is a {_type} instead".format(_type=type_utils.obj_name(ntp_cfg)))
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
 
     # Allow users to explicitly enable/disable
     enabled = ntp_cfg.get('enabled', True)
diff --git a/cloudinit/config/cc_resizefs.py b/cloudinit/config/cc_resizefs.py
index 990a693..abb812b 100644
--- a/cloudinit/config/cc_resizefs.py
+++ b/cloudinit/config/cc_resizefs.py
@@ -201,7 +201,7 @@ def handle(name, cfg, _cloud, log, args):
         resize_root = args[0]
     else:
         resize_root = util.get_cfg_option_str(cfg, "resize_rootfs", True)
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     if not util.translate_bool(resize_root, addons=[NOBLOCK]):
         log.debug("Skipping module named %s, resizing disabled", name)
         return
diff --git a/cloudinit/config/cc_runcmd.py b/cloudinit/config/cc_runcmd.py
index 15960c7..47905f4 100644
--- a/cloudinit/config/cc_runcmd.py
+++ b/cloudinit/config/cc_runcmd.py
@@ -85,7 +85,7 @@ def handle(name, cfg, cloud, log, _args):
                    " no 'runcmd' key in configuration"), name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     out_fn = os.path.join(cloud.get_ipath('scripts'), "runcmd")
     cmd = cfg["runcmd"]
     try:
diff --git a/cloudinit/config/cc_snap.py b/cloudinit/config/cc_snap.py
index 20ed7d2..003955d 100644
--- a/cloudinit/config/cc_snap.py
+++ b/cloudinit/config/cc_snap.py
@@ -239,7 +239,7 @@ def handle(name, cfg, cloud, log, args):
                    " no 'snap' key in configuration"), name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     if util.is_true(cfgin.get('squashfuse_in_container', False)):
         maybe_install_squashfuse(cloud)
     add_assertions(cfgin.get('assertions', []))
diff --git a/cloudinit/config/cc_ubuntu_advantage.py b/cloudinit/config/cc_ubuntu_advantage.py
index d61dc65..e55772a 100644
--- a/cloudinit/config/cc_ubuntu_advantage.py
+++ b/cloudinit/config/cc_ubuntu_advantage.py
@@ -163,7 +163,7 @@ def handle(name, cfg, cloud, log, args):
         LOG.debug("Skipping module named %s,"
                   " no 'ubuntu_advantage' configuration found", name)
         return
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     if 'commands' in ua_section:
         msg = (
             'Deprecated configuration "ubuntu-advantage: commands" provided.'
diff --git a/cloudinit/config/cc_ubuntu_drivers.py b/cloudinit/config/cc_ubuntu_drivers.py
index 2d1d2b3..7ee3fef 100644
--- a/cloudinit/config/cc_ubuntu_drivers.py
+++ b/cloudinit/config/cc_ubuntu_drivers.py
@@ -157,5 +157,5 @@ def handle(name, cfg, cloud, log, _args):
         log.debug("Skipping module named %s, no 'drivers' key in config", name)
         return
 
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     install_drivers(cfg['drivers'], cloud.distro.install_packages)
diff --git a/cloudinit/config/cc_write_files.py b/cloudinit/config/cc_write_files.py
index 41c75fa..b1678b8 100644
--- a/cloudinit/config/cc_write_files.py
+++ b/cloudinit/config/cc_write_files.py
@@ -191,7 +191,7 @@ __doc__ = get_schema_doc(schema)  # Supplement python help()
 
 
 def handle(name, cfg, _cloud, log, _args):
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     file_list = cfg.get('write_files', [])
     filtered_files = [
         f for f in file_list if not util.get_cfg_option_bool(f,
diff --git a/cloudinit/config/cc_write_files_deferred.py b/cloudinit/config/cc_write_files_deferred.py
index 0c75aa2..b055871 100644
--- a/cloudinit/config/cc_write_files_deferred.py
+++ b/cloudinit/config/cc_write_files_deferred.py
@@ -38,7 +38,7 @@ __doc__ = None
 
 
 def handle(name, cfg, _cloud, log, _args):
-    validate_cloudconfig_schema(cfg, schema)
+    validate_cloudconfig_schema(cfg, schema, log_details=False)
     file_list = cfg.get('write_files', [])
     filtered_files = [
         f for f in file_list if util.get_cfg_option_bool(f,
diff --git a/cloudinit/config/tests/test_snap.py b/cloudinit/config/tests/test_snap.py
index 6d4c014..8877c8e 100644
--- a/cloudinit/config/tests/test_snap.py
+++ b/cloudinit/config/tests/test_snap.py
@@ -503,9 +503,8 @@ class TestHandle(CiTestCase):
             'cloudinit.config.cc_snap',
             {'ASSERTIONS_FILE': {'new': assert_file}},
             handle, 'snap', cfg=cfg, cloud=None, log=self.logger, args=None)
-        self.assertEqual(
-            "WARNING: Invalid config:\nsnap: Additional properties are not"
-            " allowed ('invalid' was unexpected)\n",
+        self.assertIn(
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or 'cloud-init devel schema -c config-file' to see the schema errors.",
             self.logs.getvalue())
 
 
diff --git a/tests/unittests/test_handler/test_handler_bootcmd.py b/tests/unittests/test_handler/test_handler_bootcmd.py
index 8cd3a5e..4368640 100644
--- a/tests/unittests/test_handler/test_handler_bootcmd.py
+++ b/tests/unittests/test_handler/test_handler_bootcmd.py
@@ -70,7 +70,8 @@ class TestBootcmd(CiTestCase):
         with self.assertRaises(TypeError):
             handle('cc_bootcmd', invalid_config, cc, LOG, [])
         self.assertIn(
-            'Invalid config:\nbootcmd: 1 is not of type \'array\'',
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
             self.logs.getvalue())
         self.assertIn('Failed to shellify', self.logs.getvalue())
 
@@ -87,9 +88,8 @@ class TestBootcmd(CiTestCase):
         with self.assertRaises(TypeError) as context_manager:
             handle('cc_bootcmd', invalid_config, cc, LOG, [])
         expected_warnings = [
-            'bootcmd.1: 20 is not valid under any of the given schemas',
-            'bootcmd.3: {\'a\': \'n\'} is not valid under any of the given'
-            ' schema'
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
         ]
         logs = self.logs.getvalue()
         for warning in expected_warnings:
diff --git a/tests/unittests/test_handler/test_handler_resizefs.py b/tests/unittests/test_handler/test_handler_resizefs.py
index 28d5507..a4d15ed 100644
--- a/tests/unittests/test_handler/test_handler_resizefs.py
+++ b/tests/unittests/test_handler/test_handler_resizefs.py
@@ -79,8 +79,8 @@ class TestResizefs(CiTestCase):
         handle('cc_resizefs', cfg, _cloud=None, log=LOG, args=[])
         logs = self.logs.getvalue()
         self.assertIn(
-            "WARNING: Invalid config:\nresize_rootfs: 'junk' is not one of"
-            " [True, False, 'noblock']",
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
             logs)
         self.assertIn(
             'DEBUG: Skipping module named cc_resizefs, resizing disabled\n',
diff --git a/tests/unittests/test_handler/test_handler_runcmd.py b/tests/unittests/test_handler/test_handler_runcmd.py
index 672e809..79785df 100644
--- a/tests/unittests/test_handler/test_handler_runcmd.py
+++ b/tests/unittests/test_handler/test_handler_runcmd.py
@@ -69,7 +69,8 @@ class TestRuncmd(FilesystemMockingTestCase):
         with self.assertRaises(TypeError) as cm:
             handle('cc_runcmd', invalid_config, cc, LOG, [])
         self.assertIn(
-            'Invalid config:\nruncmd: 1 is not of type \'array\'',
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
             self.logs.getvalue())
         self.assertIn('Failed to shellify', str(cm.exception))
 
@@ -86,9 +87,8 @@ class TestRuncmd(FilesystemMockingTestCase):
         with self.assertRaises(TypeError) as cm:
             handle('cc_runcmd', invalid_config, cc, LOG, [])
         expected_warnings = [
-            'runcmd.1: 20 is not valid under any of the given schemas',
-            'runcmd.3: {\'a\': \'n\'} is not valid under any of the given'
-            ' schema'
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
         ]
         logs = self.logs.getvalue()
         for warning in expected_warnings:
diff --git a/tests/unittests/test_handler/test_handler_write_files.py b/tests/unittests/test_handler/test_handler_write_files.py
index 0af9280..3c5093e 100644
--- a/tests/unittests/test_handler/test_handler_write_files.py
+++ b/tests/unittests/test_handler/test_handler_write_files.py
@@ -69,7 +69,6 @@ class TestWriteFilesSchema(CiTestCase):
         self.assertNotIn('Invalid config:', self.logs.getvalue())
         handle('cc_write_file', INVALID_SCHEMA, cc, LOG, [])
         self.assertIn('Invalid config:', self.logs.getvalue())
-        self.assertIn("'path' is a required property", self.logs.getvalue())
 
     def test_schema_validation_warns_non_string_type_for_files(
             self, m_write_files):
@@ -87,7 +86,8 @@ class TestWriteFilesSchema(CiTestCase):
                 mock.call('cc_write_file', invalid_config['write_files']),
                 m_write_files.call_args_list)
             self.assertIn(
-                'write_files.0.%s: 1 is not of type \'%s\'' % (key, key_type),
+                "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+                " 'cloud-init devel schema -c config-file' to see the schema errors.",
                 self.logs.getvalue())
         self.assertIn('Invalid config:', self.logs.getvalue())
 
@@ -99,8 +99,8 @@ class TestWriteFilesSchema(CiTestCase):
         invalid_config['write_files'][0]['bogus'] = 'value'
         handle('cc_write_file', invalid_config, cc, LOG, [])
         self.assertIn(
-            "Invalid config:\nwrite_files.0: Additional properties"
-            " are not allowed ('bogus' was unexpected)",
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
             self.logs.getvalue())
 
 
@@ -121,7 +121,8 @@ class TestWriteFiles(FilesystemMockingTestCase):
         with self.assertRaises(TypeError):
             handle('cc_write_file', invalid_config, cc, LOG, [])
         self.assertIn(
-            'Invalid config:\nwrite_files: 1 is not of type \'array\'',
+            "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+            " 'cloud-init devel schema -c config-file' to see the schema errors.",
             self.logs.getvalue())
 
     def test_simple(self):
diff --git a/tests/unittests/test_handler/test_handler_write_files_deferred.py b/tests/unittests/test_handler/test_handler_write_files_deferred.py
index 57b6934..48a4f5e 100644
--- a/tests/unittests/test_handler/test_handler_write_files_deferred.py
+++ b/tests/unittests/test_handler/test_handler_write_files_deferred.py
@@ -41,8 +41,11 @@ class TestWriteFilesDeferredSchema(CiTestCase):
         self.assertNotIn('Invalid config:', self.logs.getvalue())
         handle('cc_write_files_deferred', invalid_config, cc, LOG, [])
         self.assertIn('Invalid config:', self.logs.getvalue())
-        self.assertIn("defer: 'no' is not of type 'boolean'",
-                      self.logs.getvalue())
+        self.assertIn(
+                      "Invalid config:Please run 'sudo cloud-init devel schema --system' or"
+                      " 'cloud-init devel schema -c config-file' to see the schema errors.",
+                      self.logs.getvalue()
+                      )
 
 
 class TestWriteFilesDeferred(FilesystemMockingTestCase):
-- 
2.33.0

