Re: [PATCH v3 28/34] qapi: Implement deprecated-output=hide for QMP command results

2020-03-16 Thread Markus Armbruster
Marc-André Lureau  writes:

> Hi
>
> On Sun, Mar 15, 2020 at 4:11 PM Markus Armbruster  wrote:
>>
>> This policy suppresses deprecated bits in output, and thus permits
>> "testing the future".  Implement it for QMP command results.  Example:
>> when QEMU is run with -compat deprecated-output=hide, then
>>
>> {"execute": "query-cpus-fast"}
>>
>> yields
>>
>> {"return": [{"thread-id": 9805, "props": {"core-id": 0, "thread-id": 0, 
>> "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", "cpu-index": 
>> 0, "target": "x86_64"}]}
>>
>> instead of
>>
>> {"return": [{"arch": "x86", "thread-id": 22436, "props": {"core-id": 0, 
>> "thread-id": 0, "socket-id": 0}, "qom-path": 
>> "/machine/unattached/device[0]", "cpu-index": 0, "target": "x86_64"}]}
>>
>> Note the suppression of deprecated member "arch".
>>
>> Signed-off-by: Markus Armbruster 
>> ---
>>  include/qapi/qobject-output-visitor.h   |  9 ++
>>  include/qapi/visitor-impl.h |  3 ++
>>  include/qapi/visitor.h  |  9 ++
>>  qapi/qapi-visit-core.c  |  9 ++
>>  qapi/qobject-output-visitor.c   | 19 +++
>>  tests/test-qmp-cmds.c   | 42 ++---
>>  qapi/trace-events   |  1 +
>>  scripts/qapi/commands.py|  2 +-
>>  scripts/qapi/visit.py   | 12 +++
>>  tests/qapi-schema/qapi-schema-test.json | 17 +-
>>  tests/qapi-schema/qapi-schema-test.out  | 18 +--
>>  11 files changed, 118 insertions(+), 23 deletions(-)
>>
>> diff --git a/include/qapi/qobject-output-visitor.h 
>> b/include/qapi/qobject-output-visitor.h
>> index 2b1726baf5..29f4ea6aad 100644
>> --- a/include/qapi/qobject-output-visitor.h
>> +++ b/include/qapi/qobject-output-visitor.h
>> @@ -53,4 +53,13 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor;
>>   */
>>  Visitor *qobject_output_visitor_new(QObject **result);
>>
>> +/*
>> + * Create a QObject output visitor for @obj for use with QMP
>> + *
>> + * This is like qobject_output_visitor_new(), except it obeys the
>> + * policy for handling deprecated management interfaces set with
>> + * -compat.
>> + */
>> +Visitor *qobject_output_visitor_new_qmp(QObject **result);
>> +
>>  #endif
>> diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
>> index 8ccb3b6c20..a6b26b7a5b 100644
>> --- a/include/qapi/visitor-impl.h
>> +++ b/include/qapi/visitor-impl.h
>> @@ -110,6 +110,9 @@ struct Visitor
>> The core takes care of the return type in the public interface. */
>>  void (*optional)(Visitor *v, const char *name, bool *present);
>>
>> +/* Optional */
>> +bool (*deprecated)(Visitor *v, const char *name);
>> +
>>  /* Must be set */
>>  VisitorType type;
>>
>> diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
>> index c5b23851a1..c89d51b2a4 100644
>> --- a/include/qapi/visitor.h
>> +++ b/include/qapi/visitor.h
>> @@ -449,6 +449,15 @@ void visit_end_alternate(Visitor *v, void **obj);
>>   */
>>  bool visit_optional(Visitor *v, const char *name, bool *present);
>>
>> +/*
>> + * Should we visit deprecated member @name?
>> + *
>> + * @name must not be NULL.  This function is only useful between
>> + * visit_start_struct() and visit_end_struct(), since only objects
>> + * have deprecated members.
>> + */
>> +bool visit_deprecated(Visitor *v, const char *name);
>> +
>>  /*
>>   * Visit an enum value.
>>   *
>> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
>> index 5365561b07..501b3ccdef 100644
>> --- a/qapi/qapi-visit-core.c
>> +++ b/qapi/qapi-visit-core.c
>> @@ -137,6 +137,15 @@ bool visit_optional(Visitor *v, const char *name, bool 
>> *present)
>>  return *present;
>>  }
>>
>> +bool visit_deprecated(Visitor *v, const char *name)
>> +{
>> +trace_visit_deprecated(v, name);
>> +if (v->deprecated) {
>> +return v->deprecated(v, name);
>> +}
>> +return true;
>> +}
>> +
>>  bool visit_is_input(Visitor *v)
>>  {
>>  return v->type == VISITOR_INPUT;
>> diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
>> index 26d7be5ec9..84cee17596 100644
>> --- a/qapi/qobject-output-visitor.c
>> +++ b/qapi/qobject-output-visitor.c
>> @@ -13,6 +13,7 @@
>>   */
>>
>>  #include "qemu/osdep.h"
>> +#include "qapi/compat-policy.h"
>>  #include "qapi/qobject-output-visitor.h"
>>  #include "qapi/visitor-impl.h"
>>  #include "qemu/queue.h"
>> @@ -31,6 +32,8 @@ typedef struct QStackEntry {
>>
>>  struct QObjectOutputVisitor {
>>  Visitor visitor;
>> +CompatPolicyOutput deprecated_policy;
>> +
>>  QSLIST_HEAD(, QStackEntry) stack; /* Stack of unfinished containers */
>>  QObject *root; /* Root of the output visit */
>>  QObject **result; /* User's storage location for result */
>> @@ -198,6 +201,13 @@ static void qobject_output_type_null(Visitor *v, const 
>> char *name,
>>  qobject_output_add(qov, name, qnull());
>>  }
>>
>> +static bool 

Re: [PATCH v3 28/34] qapi: Implement deprecated-output=hide for QMP command results

2020-03-16 Thread Marc-André Lureau
Hi

On Sun, Mar 15, 2020 at 4:11 PM Markus Armbruster  wrote:
>
> This policy suppresses deprecated bits in output, and thus permits
> "testing the future".  Implement it for QMP command results.  Example:
> when QEMU is run with -compat deprecated-output=hide, then
>
> {"execute": "query-cpus-fast"}
>
> yields
>
> {"return": [{"thread-id": 9805, "props": {"core-id": 0, "thread-id": 0, 
> "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", "cpu-index": 0, 
> "target": "x86_64"}]}
>
> instead of
>
> {"return": [{"arch": "x86", "thread-id": 22436, "props": {"core-id": 0, 
> "thread-id": 0, "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", 
> "cpu-index": 0, "target": "x86_64"}]}
>
> Note the suppression of deprecated member "arch".
>
> Signed-off-by: Markus Armbruster 
> ---
>  include/qapi/qobject-output-visitor.h   |  9 ++
>  include/qapi/visitor-impl.h |  3 ++
>  include/qapi/visitor.h  |  9 ++
>  qapi/qapi-visit-core.c  |  9 ++
>  qapi/qobject-output-visitor.c   | 19 +++
>  tests/test-qmp-cmds.c   | 42 ++---
>  qapi/trace-events   |  1 +
>  scripts/qapi/commands.py|  2 +-
>  scripts/qapi/visit.py   | 12 +++
>  tests/qapi-schema/qapi-schema-test.json | 17 +-
>  tests/qapi-schema/qapi-schema-test.out  | 18 +--
>  11 files changed, 118 insertions(+), 23 deletions(-)
>
> diff --git a/include/qapi/qobject-output-visitor.h 
> b/include/qapi/qobject-output-visitor.h
> index 2b1726baf5..29f4ea6aad 100644
> --- a/include/qapi/qobject-output-visitor.h
> +++ b/include/qapi/qobject-output-visitor.h
> @@ -53,4 +53,13 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor;
>   */
>  Visitor *qobject_output_visitor_new(QObject **result);
>
> +/*
> + * Create a QObject output visitor for @obj for use with QMP
> + *
> + * This is like qobject_output_visitor_new(), except it obeys the
> + * policy for handling deprecated management interfaces set with
> + * -compat.
> + */
> +Visitor *qobject_output_visitor_new_qmp(QObject **result);
> +
>  #endif
> diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
> index 8ccb3b6c20..a6b26b7a5b 100644
> --- a/include/qapi/visitor-impl.h
> +++ b/include/qapi/visitor-impl.h
> @@ -110,6 +110,9 @@ struct Visitor
> The core takes care of the return type in the public interface. */
>  void (*optional)(Visitor *v, const char *name, bool *present);
>
> +/* Optional */
> +bool (*deprecated)(Visitor *v, const char *name);
> +
>  /* Must be set */
>  VisitorType type;
>
> diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
> index c5b23851a1..c89d51b2a4 100644
> --- a/include/qapi/visitor.h
> +++ b/include/qapi/visitor.h
> @@ -449,6 +449,15 @@ void visit_end_alternate(Visitor *v, void **obj);
>   */
>  bool visit_optional(Visitor *v, const char *name, bool *present);
>
> +/*
> + * Should we visit deprecated member @name?
> + *
> + * @name must not be NULL.  This function is only useful between
> + * visit_start_struct() and visit_end_struct(), since only objects
> + * have deprecated members.
> + */
> +bool visit_deprecated(Visitor *v, const char *name);
> +
>  /*
>   * Visit an enum value.
>   *
> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> index 5365561b07..501b3ccdef 100644
> --- a/qapi/qapi-visit-core.c
> +++ b/qapi/qapi-visit-core.c
> @@ -137,6 +137,15 @@ bool visit_optional(Visitor *v, const char *name, bool 
> *present)
>  return *present;
>  }
>
> +bool visit_deprecated(Visitor *v, const char *name)
> +{
> +trace_visit_deprecated(v, name);
> +if (v->deprecated) {
> +return v->deprecated(v, name);
> +}
> +return true;
> +}
> +
>  bool visit_is_input(Visitor *v)
>  {
>  return v->type == VISITOR_INPUT;
> diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
> index 26d7be5ec9..84cee17596 100644
> --- a/qapi/qobject-output-visitor.c
> +++ b/qapi/qobject-output-visitor.c
> @@ -13,6 +13,7 @@
>   */
>
>  #include "qemu/osdep.h"
> +#include "qapi/compat-policy.h"
>  #include "qapi/qobject-output-visitor.h"
>  #include "qapi/visitor-impl.h"
>  #include "qemu/queue.h"
> @@ -31,6 +32,8 @@ typedef struct QStackEntry {
>
>  struct QObjectOutputVisitor {
>  Visitor visitor;
> +CompatPolicyOutput deprecated_policy;
> +
>  QSLIST_HEAD(, QStackEntry) stack; /* Stack of unfinished containers */
>  QObject *root; /* Root of the output visit */
>  QObject **result; /* User's storage location for result */
> @@ -198,6 +201,13 @@ static void qobject_output_type_null(Visitor *v, const 
> char *name,
>  qobject_output_add(qov, name, qnull());
>  }
>
> +static bool qobject_output_deprecated(Visitor *v, const char *name)
> +{
> +QObjectOutputVisitor *qov = to_qov(v);
> +
> +return qov->deprecated_policy != COMPAT_POLICY_OUTPUT_HIDE;
> +}
> 

[PATCH v3 28/34] qapi: Implement deprecated-output=hide for QMP command results

2020-03-15 Thread Markus Armbruster
This policy suppresses deprecated bits in output, and thus permits
"testing the future".  Implement it for QMP command results.  Example:
when QEMU is run with -compat deprecated-output=hide, then

{"execute": "query-cpus-fast"}

yields

{"return": [{"thread-id": 9805, "props": {"core-id": 0, "thread-id": 0, 
"socket-id": 0}, "qom-path": "/machine/unattached/device[0]", "cpu-index": 0, 
"target": "x86_64"}]}

instead of

{"return": [{"arch": "x86", "thread-id": 22436, "props": {"core-id": 0, 
"thread-id": 0, "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", 
"cpu-index": 0, "target": "x86_64"}]}

Note the suppression of deprecated member "arch".

Signed-off-by: Markus Armbruster 
---
 include/qapi/qobject-output-visitor.h   |  9 ++
 include/qapi/visitor-impl.h |  3 ++
 include/qapi/visitor.h  |  9 ++
 qapi/qapi-visit-core.c  |  9 ++
 qapi/qobject-output-visitor.c   | 19 +++
 tests/test-qmp-cmds.c   | 42 ++---
 qapi/trace-events   |  1 +
 scripts/qapi/commands.py|  2 +-
 scripts/qapi/visit.py   | 12 +++
 tests/qapi-schema/qapi-schema-test.json | 17 +-
 tests/qapi-schema/qapi-schema-test.out  | 18 +--
 11 files changed, 118 insertions(+), 23 deletions(-)

diff --git a/include/qapi/qobject-output-visitor.h 
b/include/qapi/qobject-output-visitor.h
index 2b1726baf5..29f4ea6aad 100644
--- a/include/qapi/qobject-output-visitor.h
+++ b/include/qapi/qobject-output-visitor.h
@@ -53,4 +53,13 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor;
  */
 Visitor *qobject_output_visitor_new(QObject **result);
 
+/*
+ * Create a QObject output visitor for @obj for use with QMP
+ *
+ * This is like qobject_output_visitor_new(), except it obeys the
+ * policy for handling deprecated management interfaces set with
+ * -compat.
+ */
+Visitor *qobject_output_visitor_new_qmp(QObject **result);
+
 #endif
diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
index 8ccb3b6c20..a6b26b7a5b 100644
--- a/include/qapi/visitor-impl.h
+++ b/include/qapi/visitor-impl.h
@@ -110,6 +110,9 @@ struct Visitor
The core takes care of the return type in the public interface. */
 void (*optional)(Visitor *v, const char *name, bool *present);
 
+/* Optional */
+bool (*deprecated)(Visitor *v, const char *name);
+
 /* Must be set */
 VisitorType type;
 
diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index c5b23851a1..c89d51b2a4 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -449,6 +449,15 @@ void visit_end_alternate(Visitor *v, void **obj);
  */
 bool visit_optional(Visitor *v, const char *name, bool *present);
 
+/*
+ * Should we visit deprecated member @name?
+ *
+ * @name must not be NULL.  This function is only useful between
+ * visit_start_struct() and visit_end_struct(), since only objects
+ * have deprecated members.
+ */
+bool visit_deprecated(Visitor *v, const char *name);
+
 /*
  * Visit an enum value.
  *
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index 5365561b07..501b3ccdef 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -137,6 +137,15 @@ bool visit_optional(Visitor *v, const char *name, bool 
*present)
 return *present;
 }
 
+bool visit_deprecated(Visitor *v, const char *name)
+{
+trace_visit_deprecated(v, name);
+if (v->deprecated) {
+return v->deprecated(v, name);
+}
+return true;
+}
+
 bool visit_is_input(Visitor *v)
 {
 return v->type == VISITOR_INPUT;
diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
index 26d7be5ec9..84cee17596 100644
--- a/qapi/qobject-output-visitor.c
+++ b/qapi/qobject-output-visitor.c
@@ -13,6 +13,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/compat-policy.h"
 #include "qapi/qobject-output-visitor.h"
 #include "qapi/visitor-impl.h"
 #include "qemu/queue.h"
@@ -31,6 +32,8 @@ typedef struct QStackEntry {
 
 struct QObjectOutputVisitor {
 Visitor visitor;
+CompatPolicyOutput deprecated_policy;
+
 QSLIST_HEAD(, QStackEntry) stack; /* Stack of unfinished containers */
 QObject *root; /* Root of the output visit */
 QObject **result; /* User's storage location for result */
@@ -198,6 +201,13 @@ static void qobject_output_type_null(Visitor *v, const 
char *name,
 qobject_output_add(qov, name, qnull());
 }
 
+static bool qobject_output_deprecated(Visitor *v, const char *name)
+{
+QObjectOutputVisitor *qov = to_qov(v);
+
+return qov->deprecated_policy != COMPAT_POLICY_OUTPUT_HIDE;
+}
+
 /* Finish building, and return the root object.
  * The root object is never null. The caller becomes the object's
  * owner, and should use qobject_unref() when done with it.  */
@@ -247,6 +257,7 @@ Visitor *qobject_output_visitor_new(QObject **result)
 v->visitor.type_number = qobject_output_type_number;