On 10/17/2016 09:50 AM, Markus Armbruster wrote:
>> But even if I realised that QemuOpts support this syntax, I think we
>> would still have to use the dotted syntax because it's explicit about
>> the index and we need that because the list can contains dicts.
>>
>> Compare this:
>>
>> driver=quorum,
>> child.0.driver=file,child.0.filename=disk1.img,
>> child.1.driver=host_device,child.1.filename=/dev/sdb,
>> child.2.driver=nbd,child.2.host=localhost
>>
>> And this:
>>
>> driver=quorum,
>> child.driver=file,child.filename=disk1.img,
>> child.driver=host_device,child.filename=/dev/sdb,
>> child.driver=nbd,child.host=localhost
>
> Aside: both are about equally illegible, to be honest.

Advertising

> Permit me to digress.
>
> QemuOpts wasn't designed for list-values keys. Doing lists by
> repetition was clever.
>
> QemuOpts wasn't designed for structured values. Doing structured values
> by a dotted key convention plus repetition was clever.
>
> And there's the problem: too much cleverness, not enough "this is being
> pushed way beyond its design limits, time to replace it".
>
> For me, a replacement should do structured values by providing suitable
> *value* syntax instead of hacking it into the keys:
>
> { "driver": "quorum",
> "child": [ { "driver": "file", "filename": "disk1.img" },
> { "driver": "host_device", "filename=/dev/sdb" },
> { "driver": "nbd", "host": "localhost" } ] }
Possible hack solution:
QemuOpts already special-cases id=. What if we ALSO make it
special-case a leading json=? Shown here with shell quoting, the above
example of creating a Quorum -drive argument could then be:
-drive json='
{ "driver": "quorum",
"child": [ { "driver": "file", "filename": "disk1.img" },
{ "driver": "host_device", "filename=/dev/sdb" },
{ "driver": "nbd", "host": "localhost" } ] }
'
As far as I know, we don't have 'json' as any existing QemuOpts key (do
we? A full audit may be better than my quick git grep '"json"'). Thus,
if QemuOpts sees a leading json=, it hands off the rest of the string to
the same parser as we use for QMP, where we no longer have to escape
commas (even nicer than the drive hack where we support
filename=json:{...} but have to double up all commas to make it through
the QemuOpts layer). Encountering json= as anything other than the
first option would be an error, and you would be unable to combine a
json= option with any other old-style option. In other words, the use
of leading json= would be the switch for whether to do old-style parsing
or to use a saner syntax for everything else that needs structure, on a
per-argument basis.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org