Re: [PATCH v3 28/34] qapi: Implement deprecated-output=hide for QMP command results
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
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
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;