diff --git a/cloudinit/cmd/main.py b/cloudinit/cmd/main.py index 3052730bbb8..9e9454ee646 100644 --- a/cloudinit/cmd/main.py +++ b/cloudinit/cmd/main.py @@ -41,6 +41,7 @@ setup_logging, reset_logging, configure_root_logger, + DEPRECATED, ) from cloudinit.reporting import events from cloudinit.safeyaml import load @@ -221,11 +222,17 @@ def attempt_cmdline_url(path, network=True, cmdline=None) -> Tuple[int, str]: is_cloud_cfg = False if is_cloud_cfg: if cmdline_name == "url": - util.deprecate( - deprecated="The kernel command line key `url`", - deprecated_version="22.3", - extra_message=" Please use `cloud-config-url` " - "kernel command line parameter instead", + return ( + DEPRECATED, + str( + util.deprecate( + deprecated="The kernel command line key `url`", + deprecated_version="22.3", + extra_message=" Please use `cloud-config-url` " + "kernel command line parameter instead", + return_log=True, + ), + ), ) else: if cmdline_name == "cloud-config-url": diff --git a/cloudinit/log.py b/cloudinit/log.py index 863d481693a..fcfc5ef8b24 100644 --- a/cloudinit/log.py +++ b/cloudinit/log.py @@ -22,6 +22,7 @@ from typing import DefaultDict DEFAULT_LOG_FORMAT = "%(asctime)s - %(filename)s[%(levelname)s]: %(message)s" +DEPRECATED = 35 def setup_basic_logging(level=logging.DEBUG, formatter=None): @@ -44,7 +45,7 @@ def flush_loggers(root): flush_loggers(root.parent) -def define_deprecation_logger(lvl=35): +def define_deprecation_logger(lvl=DEPRECATED): logging.addLevelName(lvl, "DEPRECATED") def deprecated(self, message, *args, **kwargs): diff --git a/cloudinit/util.py b/cloudinit/util.py index 253c80d6a2d..bdf5990924f 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -3233,6 +3233,7 @@ def deprecate( deprecated_version: str, extra_message: Optional[str] = None, schedule: int = 5, + return_log: bool = False, ): """Mark a "thing" as deprecated. Deduplicated deprecations are logged. @@ -3249,6 +3250,8 @@ def deprecate( @param schedule: Manually set the deprecation schedule. Defaults to 5 years. Leave a comment explaining your reason for deviation if setting this value. + @param return_log: Return log text rather than logging it. Useful for + running prior to logging setup. Note: uses keyword-only arguments to improve legibility """ @@ -3258,13 +3261,15 @@ def deprecate( dedup = hash(deprecated + message + deprecated_version + str(schedule)) version = Version.from_str(deprecated_version) version_removed = Version(version.major + schedule, version.minor) + deprecate_msg = ( + f"{deprecated} is deprecated in " + f"{deprecated_version} and scheduled to be removed in " + f"{version_removed}. {message}" + ).rstrip() + if return_log: + return deprecate_msg if dedup not in deprecate._log: # type: ignore deprecate._log.add(dedup) # type: ignore - deprecate_msg = ( - f"{deprecated} is deprecated in " - f"{deprecated_version} and scheduled to be removed in " - f"{version_removed}. {message}" - ).rstrip() if hasattr(LOG, "deprecated"): LOG.deprecated(deprecate_msg) # type: ignore else: