diff mbox series

[v5,1/8] qemu-options: New -compat to set policy for deprecated interfaces

Message ID 20200914084802.4185028-2-armbru@redhat.com
State New
Headers show
Series Configurable policy for handling deprecated interfaces | expand

Commit Message

Markus Armbruster Sept. 14, 2020, 8:47 a.m. UTC
Policy is separate for input and output.

Input policy can be "accept" (accept silently), or "reject" (reject
the request with an error).

Output policy can be "accept" (pass on unchanged), or "hide" (filter
out the deprecated parts).

Default is "accept".  Policies other than "accept" are implemented
later in this series.

For now, -compat covers only syntactic aspects of QMP, i.e. stuff
tagged with feature 'deprecated'.  We may want to extend it to cover
semantic aspects, CLI, and experimental features.

The option is experimental.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qapi/compat.json             | 51 ++++++++++++++++++++++++++++++++++++
 qapi/qapi-schema.json        |  1 +
 include/qapi/compat-policy.h | 20 ++++++++++++++
 qapi/qmp-dispatch.c          |  3 +++
 softmmu/vl.c                 | 17 ++++++++++++
 qapi/meson.build             |  1 +
 qemu-options.hx              | 20 ++++++++++++++
 7 files changed, 113 insertions(+)
 create mode 100644 qapi/compat.json
 create mode 100644 include/qapi/compat-policy.h

Comments

Peter Krempa Sept. 14, 2020, 11:50 a.m. UTC | #1
On Mon, Sep 14, 2020 at 10:47:55 +0200, Markus Armbruster wrote:
> Policy is separate for input and output.
> 
> Input policy can be "accept" (accept silently), or "reject" (reject
> the request with an error).
> 
> Output policy can be "accept" (pass on unchanged), or "hide" (filter
> out the deprecated parts).
> 
> Default is "accept".  Policies other than "accept" are implemented
> later in this series.
> 
> For now, -compat covers only syntactic aspects of QMP, i.e. stuff
> tagged with feature 'deprecated'.  We may want to extend it to cover
> semantic aspects, CLI, and experimental features.
> 
> The option is experimental.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

I wasn't able to find any good anchor point which would allow me to
detect that this command line option/feature is present.

Is there anything in e.g. in query-qmp-schema or query-command-line-options
I could base this capability on?
Eric Blake Sept. 14, 2020, 3:08 p.m. UTC | #2
On 9/14/20 3:47 AM, Markus Armbruster wrote:
> Policy is separate for input and output.

> 

> Input policy can be "accept" (accept silently), or "reject" (reject

> the request with an error).

> 

> Output policy can be "accept" (pass on unchanged), or "hide" (filter

> out the deprecated parts).

> 

> Default is "accept".  Policies other than "accept" are implemented

> later in this series.

> 

> For now, -compat covers only syntactic aspects of QMP, i.e. stuff

> tagged with feature 'deprecated'.  We may want to extend it to cover

> semantic aspects, CLI, and experimental features.

> 

> The option is experimental.

> 

> Signed-off-by: Markus Armbruster <armbru@redhat.com>

> ---


Reviewed-by: Eric Blake <eblake@redhat.com>


But as Peter points out, where is the introspection for whether this 
command line argument exists?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org
Richard W.M. Jones Sept. 21, 2020, 12:01 p.m. UTC | #3
On Mon, Sep 14, 2020 at 10:08:50AM -0500, Eric Blake wrote:
> On 9/14/20 3:47 AM, Markus Armbruster wrote:
> >Policy is separate for input and output.
> >
> >Input policy can be "accept" (accept silently), or "reject" (reject
> >the request with an error).
> >
> >Output policy can be "accept" (pass on unchanged), or "hide" (filter
> >out the deprecated parts).
> >
> >Default is "accept".  Policies other than "accept" are implemented
> >later in this series.
> >
> >For now, -compat covers only syntactic aspects of QMP, i.e. stuff
> >tagged with feature 'deprecated'.  We may want to extend it to cover
> >semantic aspects, CLI, and experimental features.
> >
> >The option is experimental.
> >
> >Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >---
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>
> 
> But as Peter points out, where is the introspection for whether this
> command line argument exists?

FWIW libguestfs still tests some qemu features by grepping -help
output.  That's actually what I'm intending to do with this one, at
least for now.

Rich.
Markus Armbruster Sept. 21, 2020, 2:35 p.m. UTC | #4
Peter Krempa <pkrempa@redhat.com> writes:

> On Mon, Sep 14, 2020 at 10:47:55 +0200, Markus Armbruster wrote:

>> Policy is separate for input and output.

>> 

>> Input policy can be "accept" (accept silently), or "reject" (reject

>> the request with an error).

>> 

>> Output policy can be "accept" (pass on unchanged), or "hide" (filter

>> out the deprecated parts).

>> 

>> Default is "accept".  Policies other than "accept" are implemented

>> later in this series.

>> 

>> For now, -compat covers only syntactic aspects of QMP, i.e. stuff

>> tagged with feature 'deprecated'.  We may want to extend it to cover

>> semantic aspects, CLI, and experimental features.

>> 

>> The option is experimental.

>> 

>> Signed-off-by: Markus Armbruster <armbru@redhat.com>

>> ---

>

> I wasn't able to find any good anchor point which would allow me to

> detect that this command line option/feature is present.

>

> Is there anything in e.g. in query-qmp-schema or query-command-line-options

> I could base this capability on?


You asked this in review of v4.  I didn't have a ready answer then, and
forgot to figure out a solution before I post v5.  Thanks for the
reminder!
diff mbox series

Patch

diff --git a/qapi/compat.json b/qapi/compat.json
new file mode 100644
index 0000000000..d2c02a21aa
--- /dev/null
+++ b/qapi/compat.json
@@ -0,0 +1,51 @@ 
+# -*- Mode: Python -*-
+
+##
+# = Compatibility policy
+##
+
+##
+# @CompatPolicyInput:
+#
+# Policy for handling "funny" input.
+#
+# @accept: Accept silently
+# @reject: Reject with an error
+#
+# Since: 5.2
+##
+{ 'enum': 'CompatPolicyInput',
+  'data': [ 'accept', 'reject' ] }
+
+##
+# @CompatPolicyOutput:
+#
+# Policy for handling "funny" output.
+#
+# @accept: Pass on unchanged
+# @hide: Filter out
+#
+# Since: 5.2
+##
+{ 'enum': 'CompatPolicyOutput',
+  'data': [ 'accept', 'hide' ] }
+
+##
+# @CompatPolicy:
+#
+# Policy for handling deprecated management interfaces.
+#
+# This is intended for testing users of the management interfaces.
+#
+# Limitation: covers only syntactic aspects of QMP, i.e. stuff tagged
+# with feature 'deprecated'.  We may want to extend it to cover
+# semantic aspects, CLI, and experimental features.
+#
+# @deprecated-input: how to handle deprecated input (default 'accept')
+# @deprecated-output: how to handle deprecated output (default 'accept')
+#
+# Since: 5.2
+##
+{ 'struct': 'CompatPolicy',
+  'data': { '*deprecated-input': 'CompatPolicyInput',
+            '*deprecated-output': 'CompatPolicyOutput' } }
diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json
index f03ff91ceb..2550b16028 100644
--- a/qapi/qapi-schema.json
+++ b/qapi/qapi-schema.json
@@ -76,6 +76,7 @@ 
 { 'include': 'migration.json' }
 { 'include': 'transaction.json' }
 { 'include': 'trace.json' }
+{ 'include': 'compat.json' }
 { 'include': 'control.json' }
 { 'include': 'introspect.json' }
 { 'include': 'qom.json' }
diff --git a/include/qapi/compat-policy.h b/include/qapi/compat-policy.h
new file mode 100644
index 0000000000..b8c6638156
--- /dev/null
+++ b/include/qapi/compat-policy.h
@@ -0,0 +1,20 @@ 
+/*
+ * Policy for handling "funny" management interfaces
+ *
+ * Copyright (C) 2020 Red Hat, Inc.
+ *
+ * Authors:
+ *  Markus Armbruster <armbru@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * later.  See the COPYING file in the top-level directory.
+ */
+
+#ifndef QAPI_COMPAT_POLICY_H
+#define QAPI_COMPAT_POLICY_H
+
+#include "qapi/qapi-types-compat.h"
+
+extern CompatPolicy compat_policy;
+
+#endif
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 79347e0864..f65b8cf000 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -12,6 +12,7 @@ 
  */
 
 #include "qemu/osdep.h"
+#include "qapi/compat-policy.h"
 #include "qapi/error.h"
 #include "qapi/qmp/dispatch.h"
 #include "qapi/qmp/qdict.h"
@@ -19,6 +20,8 @@ 
 #include "sysemu/runstate.h"
 #include "qapi/qmp/qbool.h"
 
+CompatPolicy compat_policy;
+
 static QDict *qmp_dispatch_check_obj(QDict *dict, bool allow_oob,
                                      Error **errp)
 {
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 0cc86b0766..dbe9dc06f0 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -27,6 +27,7 @@ 
 #include "qemu/units.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
+#include "qapi/compat-policy.h"
 #include "qapi/error.h"
 #include "qemu-version.h"
 #include "qemu/cutils.h"
@@ -106,6 +107,7 @@ 
 #include "sysemu/replay.h"
 #include "qapi/qapi-events-run-state.h"
 #include "qapi/qapi-visit-block-core.h"
+#include "qapi/qapi-visit-compat.h"
 #include "qapi/qapi-visit-ui.h"
 #include "qapi/qapi-commands-block-core.h"
 #include "qapi/qapi-commands-run-state.h"
@@ -3771,6 +3773,21 @@  void qemu_init(int argc, char **argv, char **envp)
                     qemu_opt_get_bool(opts, "mem-lock", false);
                 enable_cpu_pm = qemu_opt_get_bool(opts, "cpu-pm", false);
                 break;
+            case QEMU_OPTION_compat:
+                {
+                    CompatPolicy *opts;
+                    Visitor *v;
+
+                    v = qobject_input_visitor_new_str(optarg, NULL,
+                                                      &error_fatal);
+
+                    visit_type_CompatPolicy(v, NULL, &opts, &error_fatal);
+                    QAPI_CLONE_MEMBERS(CompatPolicy, &compat_policy, opts);
+
+                    qapi_free_CompatPolicy(opts);
+                    visit_free(v);
+                    break;
+                }
             case QEMU_OPTION_msg:
                 opts = qemu_opts_parse_noisily(qemu_find_opts("msg"), optarg,
                                                false);
diff --git a/qapi/meson.build b/qapi/meson.build
index 2b2872a41d..c72fcd9616 100644
--- a/qapi/meson.build
+++ b/qapi/meson.build
@@ -20,6 +20,7 @@  qapi_all_modules = [
   'block',
   'char',
   'common',
+  'compat',
   'control',
   'crypto',
   'dump',
diff --git a/qemu-options.hx b/qemu-options.hx
index b0f020594e..bb0c6bb70e 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3391,6 +3391,26 @@  DEFHEADING()
 
 DEFHEADING(Debug/Expert options:)
 
+DEF("compat", HAS_ARG, QEMU_OPTION_compat,
+    "-compat [deprecated-input=accept|reject][,deprecated-output=accept|hide]\n"
+    "                Policy for handling deprecated management interfaces\n",
+    QEMU_ARCH_ALL)
+SRST
+``-compat [deprecated-input=@var{input-policy}][,deprecated-output=@var{output-policy}]``
+    Set policy for handling deprecated management interfaces (experimental):
+
+    ``deprecated-input=accept`` (default)
+        Accept deprecated commands and arguments
+    ``deprecated-input=reject``
+        Reject deprecated commands and arguments
+    ``deprecated-output=accept`` (default)
+        Emit deprecated command results and events
+    ``deprecated-output=hide``
+        Suppress deprecated command results and events
+
+    Limitation: covers only syntactic aspects of QMP.
+ERST
+
 DEF("fw_cfg", HAS_ARG, QEMU_OPTION_fwcfg,
     "-fw_cfg [name=]<name>,file=<file>\n"
     "                add named fw_cfg entry with contents from file\n"