On 08/31/2015 10:53 PM, Eric Blake wrote:
On 08/31/2015 03:01 AM, Yang Hongyang wrote:
Sorry that I don't know much about the QAPI part, I have a question, in
previous reply, Eric suggested:
>
> Then this becomes something like:
>
> { 'command': 'netfilter-add', 'data': 'NetFilter' }
If we do this (which requires pending patches to be flushed), then the
user specifies the following QMP:
{ "execute":"netfilter-add",
"arguments":{ "id":"abc", "netdev":"def", "type":"dummy" }}
or use NetFilter as a union, but have the command be:
{ 'command': 'netfilter-add',
'data': { 'data': 'NetFilter' } }
This approach would work right now without waiting for pending qapi
commits, but the QMP command would look like:
{ "execute":"netfilter-add",
"arguments":{ "data":{ "id":"abc", "netdev":"def", "type":"dummy" }}}
where you have to pass an extra layer of nesting at the QMP layer.
What do you mean by pass an extra layer of nesting?
The fact that I had to pass "arguments":{"data":{...}}, thereby nesting
the real options inside another relatively pointless data wrapper.
Now I understand, with the flat union, all I need to do now is to specify the
command schema like:
{ 'command': 'netfilter-add',
'data': { 'data': 'NetFilter' } }
and use the qmp command like you noted above.
Thanks a lot Eric!
I've already switched to flat union as you suggested:
{ 'struct': 'NetFilterDummyOptions',
'data': { } }
{ 'enum': 'NetFilterType',
'data': ['dummy'] }
{ 'struct': 'NetFilterBase',
'data': {
'id': 'str',
'netdev': 'str',
'*chain': 'str',
'type': 'NetFilterType' } }
{ 'union': 'NetFilter',
'base': 'NetFilterBase',
'discriminator': 'type',
'data': {
'dummy': 'NetFilterDummyOptions' } }
Looks reasonable for a first round. Some of the pending qapi commits
may allow us to further simplify things to not be quite so verbose, but
that doesn't stop us from using this now.
--
Thanks,
Yang.