diff mbox series

[08/14] include/hw: add macros for deprecation & removal of versioned machines

Message ID 20240501182759.2934195-9-berrange@redhat.com
State New
Headers show
Series hw: define and enforce a standard lifecycle for versioned machines | expand

Commit Message

Daniel P. Berrangé May 1, 2024, 6:27 p.m. UTC
Versioned machines live for a long time to provide back compat for
incoming migration and restore of saved images. To guide users away from
usage of old machines, however, we want to deprecate any older than 3
years (equiv of 9 releases), and delete any older than 6 years (equiva
of 18 releases).

To get a standardized deprecation message and avoid having to remember
to manually add it after three years, this introduces two macros to be
used by targets when defining versioned machines.

* MACHINE_VER_DEPRECATION(major, minor)

  Automates the task of setting the 'deprecation_reason' field on the
  machine, if-and-only-if the major/minor version is older than 3 years.

* MACHINE_VER_DEPRECATION(major, minor)

  Simulates the deletion of by skipping registration of the QOM type
  for a versioned machine, if-and-only-if the major/minor version is
  older than 6 years.

By using these two macros there is no longer any manual work required
per-release to deprecate old machines. By preventing the use of machines
that have reached their deletion date, it is also no neccessary to
manually delete machines per-release. Deletion can be batched up once a
year or whenever makes most sense.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

Comments

Thomas Huth May 2, 2024, 10:59 a.m. UTC | #1
On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> Versioned machines live for a long time to provide back compat for
> incoming migration and restore of saved images. To guide users away from
> usage of old machines, however, we want to deprecate any older than 3
> years (equiv of 9 releases), and delete any older than 6 years (equiva
> of 18 releases).
> 
> To get a standardized deprecation message and avoid having to remember
> to manually add it after three years, this introduces two macros to be
> used by targets when defining versioned machines.
> 
> * MACHINE_VER_DEPRECATION(major, minor)
> 
>    Automates the task of setting the 'deprecation_reason' field on the
>    machine, if-and-only-if the major/minor version is older than 3 years.
> 
> * MACHINE_VER_DEPRECATION(major, minor)

That should be MACHINE_VER_DELETION instead.

>    Simulates the deletion of by skipping registration of the QOM type
>    for a versioned machine, if-and-only-if the major/minor version is
>    older than 6 years.
> 
> By using these two macros there is no longer any manual work required
> per-release to deprecate old machines. By preventing the use of machines
> that have reached their deletion date, it is also no neccessary to

s/neccessary/necessary/

> manually delete machines per-release. Deletion can be batched up once a
> year or whenever makes most sense.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 84 insertions(+)

With the typos fixed:
Reviewed-by: Thomas Huth <thuth@redhat.com>
Daniel P. Berrangé May 9, 2024, 2:42 p.m. UTC | #2
On Thu, May 02, 2024 at 12:59:05PM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > Versioned machines live for a long time to provide back compat for
> > incoming migration and restore of saved images. To guide users away from
> > usage of old machines, however, we want to deprecate any older than 3
> > years (equiv of 9 releases), and delete any older than 6 years (equiva
> > of 18 releases).
> > 
> > To get a standardized deprecation message and avoid having to remember
> > to manually add it after three years, this introduces two macros to be
> > used by targets when defining versioned machines.
> > 
> > * MACHINE_VER_DEPRECATION(major, minor)
> > 
> >    Automates the task of setting the 'deprecation_reason' field on the
> >    machine, if-and-only-if the major/minor version is older than 3 years.
> > 
> > * MACHINE_VER_DEPRECATION(major, minor)
> 
> That should be MACHINE_VER_DELETION instead.

Opps, yes.

> 
> >    Simulates the deletion of by skipping registration of the QOM type
> >    for a versioned machine, if-and-only-if the major/minor version is
> >    older than 6 years.
> > 
> > By using these two macros there is no longer any manual work required
> > per-release to deprecate old machines. By preventing the use of machines
> > that have reached their deletion date, it is also no neccessary to
> 
> s/neccessary/necessary/
> 
> > manually delete machines per-release. Deletion can be batched up once a
> > year or whenever makes most sense.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 84 insertions(+)
> 
> With the typos fixed:
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 

With regards,
Daniel
diff mbox series

Patch

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 47ca450fca..48b6c98c77 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -427,6 +427,7 @@  struct MachineState {
  *          MachineClass *mc = MACHINE_CLASS(oc); \
  *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
  *          mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " Virtual Machine"; \
+ *          MACHINE_VER_DEPRECATION(__VA_ARGS__); \
  *          if (latest) { \
  *              mc->alias = "virt"; \
  *          } \
@@ -438,6 +439,7 @@  struct MachineState {
  *      }; \
  *      static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
  *      { \
+ *          MACHINE_VER_DELETION(__VA_ARGS__); \
  *          type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
  *      } \
  *      type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
@@ -580,6 +582,88 @@  struct MachineState {
                       _MACHINE_VER_SYM2) (sym, prefix, __VA_ARGS__)
 
 
+/*
+ * How many years/major releases for each phase
+ * of the life cycle. Assumes use of versioning
+ * scheme where major is bumped each year
+ */
+#define MACHINE_VER_DELETION_MAJOR 6
+#define MACHINE_VER_DEPRECATION_MAJOR 3
+
+/*
+ * Expands to a static string containing a deprecation
+ * message for a versioned machine type
+ */
+#define MACHINE_VER_DEPRECATION_MSG \
+    "machines more than " stringify(MACHINE_VER_DEPRECATION_MAJOR) \
+    " years old are subject to deletion after " \
+    stringify(MACHINE_VER_DELETION_MAJOR) " years"
+
+#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \
+    (((QEMU_VERSION_MAJOR - major) > cutoff) || \
+     (((QEMU_VERSION_MAJOR - major) == cutoff) && \
+      (QEMU_VERSION_MINOR - minor) >= 0))
+
+#define _MACHINE_VER_IS_EXPIRED2(cutoff, major, minor) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED3(cutoff, major, minor, micro) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED4(cutoff, major, minor, _unused, tag) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED5(cutoff, major, minor, micro, _unused, tag)   \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+
+#define _MACHINE_IS_EXPIRED(cutoff, ...) \
+    _MACHINE_VER_PICK(__VA_ARGS__, \
+                      _MACHINE_VER_IS_EXPIRED5, \
+                      _MACHINE_VER_IS_EXPIRED4, \
+                      _MACHINE_VER_IS_EXPIRED3, \
+                      _MACHINE_VER_IS_EXPIRED2) (cutoff, __VA_ARGS__)
+
+/*
+ * Evaluates true when a machine type with (major, minor)
+ * or (major, minor, micro) version should be considered
+ * deprecated based on the current versioned machine type
+ * lifecycle rules
+ */
+#define MACHINE_VER_IS_DEPRECATED(...) \
+    _MACHINE_IS_EXPIRED(MACHINE_VER_DEPRECATION_MAJOR, __VA_ARGS__)
+
+/*
+ * Evaluates true when a machine type with (major, minor)
+ * or (major, minor, micro) version should be considered
+ * for deletion based on the current versioned machine type
+ * lifecycle rules
+ */
+#define MACHINE_VER_SHOULD_DELETE(...) \
+    _MACHINE_IS_EXPIRED(MACHINE_VER_DELETION_MAJOR, __VA_ARGS__)
+
+/*
+ * Sets the deprecation reason for a versioned machine based
+ * on its lifecycle
+ *
+ * This must be unconditionally used in the _class_init
+ * function for all machine types which support versioning.
+ *
+ * Initially it will be an effective no-op, but after a
+ * suitable period of time has passed, it will set the
+ * 'deprecation_reason' field on the machine, to warn users
+ * about forthcoming removal.
+ */
+#define MACHINE_VER_DEPRECATION(...) \
+    do { \
+        if (MACHINE_VER_IS_DEPRECATED(__VA_ARGS__)) { \
+            mc->deprecation_reason = MACHINE_VER_DEPRECATION_MSG; \
+        } \
+    } while (0)
+
+#define MACHINE_VER_DELETION(...) \
+    do { \
+        if (MACHINE_VER_SHOULD_DELETE(__VA_ARGS__)) { \
+            return; \
+        } \
+    } while (0)
+
 #define DEFINE_MACHINE(namestr, machine_initfn) \
     static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
     { \