Message ID | 20200317115459.31821-31-armbru@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Configurable policy for handling deprecated interfaces | expand |
On 3/17/20 6:54 AM, Markus Armbruster wrote: > This policy suppresses deprecated bits in output, and thus permits > "testing the future". Implement it for QMP event data: suppress > deprecated members. > > No QMP event data is deprecated right now. > > Signed-off-by: Markus Armbruster <armbru@redhat.com> > --- > +static void test_event_deprecated_data(TestEventData *data, const void *unused) > +{ > + memset(&compat_policy, 0, sizeof(compat_policy)); > + > + data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0'," > + " 'data': { 'foo': 42 } }"); > + qapi_event_send_test_event_features0(42); > + g_assert(data->emitted); > + > + qobject_unref(data->expect); > + > + compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_HIDE; Again, playing fast-and-loose with compat_policy.has_deprecated_output. > +++ b/scripts/qapi/events.py > @@ -104,7 +104,7 @@ def gen_event_send(name, arg_type, features, boxed, > > if have_args: > ret += mcgen(''' > - v = qobject_output_visitor_new(&obj); > + v = qobject_output_visitor_new_qmp(&obj); > ''') > if not arg_type.is_implicit(): > ret += mcgen(''' > @@ -123,7 +123,11 @@ def gen_event_send(name, arg_type, features, boxed, > ret += mcgen(''' > > visit_complete(v, &obj); > - qdict_put_obj(qmp, "data", obj); > + if (qdict_size(qobject_to(QDict, obj))) { > + qdict_put_obj(qmp, "data", obj); > + } else { > + qobject_unref(obj); > + } So you'd rather omit data altogether than emit "data":{} when all deprecated members disappear. Fair enough; both approaches work. Reviewed-by: Eric Blake <eblake@redhat.com>
Eric Blake <eblake@redhat.com> writes: > On 3/17/20 6:54 AM, Markus Armbruster wrote: >> This policy suppresses deprecated bits in output, and thus permits >> "testing the future". Implement it for QMP event data: suppress >> deprecated members. >> >> No QMP event data is deprecated right now. >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com> >> --- > >> +static void test_event_deprecated_data(TestEventData *data, const void *unused) >> +{ >> + memset(&compat_policy, 0, sizeof(compat_policy)); >> + >> + data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0'," >> + " 'data': { 'foo': 42 } }"); >> + qapi_event_send_test_event_features0(42); >> + g_assert(data->emitted); >> + >> + qobject_unref(data->expect); >> + >> + compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_HIDE; > > Again, playing fast-and-loose with compat_policy.has_deprecated_output. I'll clean it up. >> +++ b/scripts/qapi/events.py >> @@ -104,7 +104,7 @@ def gen_event_send(name, arg_type, features, boxed, >> if have_args: >> ret += mcgen(''' >> - v = qobject_output_visitor_new(&obj); >> + v = qobject_output_visitor_new_qmp(&obj); >> ''') >> if not arg_type.is_implicit(): >> ret += mcgen(''' >> @@ -123,7 +123,11 @@ def gen_event_send(name, arg_type, features, boxed, >> ret += mcgen(''' >> visit_complete(v, &obj); >> - qdict_put_obj(qmp, "data", obj); >> + if (qdict_size(qobject_to(QDict, obj))) { >> + qdict_put_obj(qmp, "data", obj); >> + } else { >> + qobject_unref(obj); >> + } > > So you'd rather omit data altogether than emit "data":{} when all > deprecated members disappear. Fair enough; both approaches work. I initially didn't do this until my testing demonstrated that "data" goes away entirely when I delete the last member from the schema. To actually fulfill the "test the future" mission, I need policy hide drop data, too. > Reviewed-by: Eric Blake <eblake@redhat.com> Thanks!
diff --git a/tests/test-qmp-event.c b/tests/test-qmp-event.c index ae4913ceb3..8f77485454 100644 --- a/tests/test-qmp-event.c +++ b/tests/test-qmp-event.c @@ -158,6 +158,25 @@ static void test_event_deprecated(TestEventData *data, const void *unused) qobject_unref(data->expect); } +static void test_event_deprecated_data(TestEventData *data, const void *unused) +{ + memset(&compat_policy, 0, sizeof(compat_policy)); + + data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0'," + " 'data': { 'foo': 42 } }"); + qapi_event_send_test_event_features0(42); + g_assert(data->emitted); + + qobject_unref(data->expect); + + compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_HIDE; + data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0' }"); + qapi_event_send_test_event_features0(42); + g_assert(data->emitted); + + qobject_unref(data->expect); +} + int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); @@ -167,6 +186,7 @@ int main(int argc, char **argv) event_test_add("/event/event_c", test_event_c); event_test_add("/event/event_d", test_event_d); event_test_add("/event/deprecated", test_event_deprecated); + event_test_add("/event/deprecated_data", test_event_deprecated_data); g_test_run(); return 0; diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py index 95ca4b4753..f03c825cc1 100644 --- a/scripts/qapi/events.py +++ b/scripts/qapi/events.py @@ -104,7 +104,7 @@ def gen_event_send(name, arg_type, features, boxed, if have_args: ret += mcgen(''' - v = qobject_output_visitor_new(&obj); + v = qobject_output_visitor_new_qmp(&obj); ''') if not arg_type.is_implicit(): ret += mcgen(''' @@ -123,7 +123,11 @@ def gen_event_send(name, arg_type, features, boxed, ret += mcgen(''' visit_complete(v, &obj); - qdict_put_obj(qmp, "data", obj); + if (qdict_size(qobject_to(QDict, obj))) { + qdict_put_obj(qmp, "data", obj); + } else { + qobject_unref(obj); + } ''') ret += mcgen(''' diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json index e4cce0d5b0..23f58b8724 100644 --- a/tests/qapi-schema/qapi-schema-test.json +++ b/tests/qapi-schema/qapi-schema-test.json @@ -322,5 +322,8 @@ 'features': [ { 'name': 'feature1', 'if': [ 'defined(TEST_IF_COND_1)', 'defined(TEST_IF_COND_2)'] } ] } +{ 'event': 'TEST-EVENT-FEATURES0', + 'data': 'FeatureStruct1' } + { 'event': 'TEST-EVENT-FEATURES1', 'features': [ 'deprecated' ] } diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out index cd53323abd..1a63d3bca7 100644 --- a/tests/qapi-schema/qapi-schema-test.out +++ b/tests/qapi-schema/qapi-schema-test.out @@ -438,6 +438,8 @@ command test-command-cond-features3 None -> None gen=True success_response=True boxed=False oob=False preconfig=False feature feature1 if ['defined(TEST_IF_COND_1)', 'defined(TEST_IF_COND_2)'] +event TEST-EVENT-FEATURES0 FeatureStruct1 + boxed=False event TEST-EVENT-FEATURES1 None boxed=False feature deprecated
This policy suppresses deprecated bits in output, and thus permits "testing the future". Implement it for QMP event data: suppress deprecated members. No QMP event data is deprecated right now. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- tests/test-qmp-event.c | 20 ++++++++++++++++++++ scripts/qapi/events.py | 8 ++++++-- tests/qapi-schema/qapi-schema-test.json | 3 +++ tests/qapi-schema/qapi-schema-test.out | 2 ++ 4 files changed, 31 insertions(+), 2 deletions(-)