[libvirt] [PATCH] virsh: new net-update command

Laine Stump laine at laine.org
Thu Sep 20 00:04:04 UTC 2012


On 09/19/2012 02:32 PM, Eric Blake wrote:
> On 09/19/2012 12:08 PM, Laine Stump wrote:
>> This new virsh command uses the new virNetworkUpdate() API to modify
>> an existing network definition, and optionally have those
>> modifications take effect immediately without restarting the network.
>>
>> +
>> +static const vshCmdOptDef opts_network_update[] = {
>> +    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, N_("network name or uuid")},
>> +    {"command", VSH_OT_DATA, VSH_OFLAG_REQ,
>> +     N_("type of update (add, delete, or modify)")},
> s/add/add-first, add-last/


Right. I also just added manual recognition of "add" as a synonym for
"add-last".


>
>> +    {"section", VSH_OT_DATA, VSH_OFLAG_REQ,
>> +     N_("which section of network configuration to update")},
>> +    {"xml", VSH_OT_BOOL, 0, N_("xml is specified directly on commandline")},
>> +    {"file", VSH_OT_BOOL, 0, N_("file containing xml is specified on commandline")},
>> +    {"xmldata", VSH_OT_DATA, VSH_OFLAG_REQ,
>> +     N_("complete xml element (or name of file containing xml) to add/modify, "
>> +        "or to be matched for search")},
> Interesting choice to make --xml and --file be boolean flags, and
> '[--xmldata] data' be the string that becomes either the file name or
> the xml content.  I might have done just two optional VSH_OT_DATA
> arguments for --xml and --file and then manually checked that exactly
> one of the two was supplied, instead of using three arguments.  But what
> you did works, so no need to change it.

That's how I originally did it, but I didn't like being required to
always say "--file xyz.xml" (while the existing commands that take a
filename don't require that - the filename option can be positionally
determined). Dan gave me the idea of having the (optionally unnamed)
string option, along with two booleans. Of course, "--file" is kind of
pointless, since that's the default behavior anyway.

I'm kind of on the fence between the two methods right now - whether to
be more compatible with existing command syntax, or have fewer options.
I realize that one problem of having the two booleans is that if
somebody wants to specify the args in a different order, they would need
to use the name of the string option, and it would end up looking
something like this:

    net-update add --file --xmldata myfile.xml --section ip-dhcp-host
               --parent-index 4 --live

(Likely nobody would ever knowingly choose to do it that way, but...)

So, the two possibilities are:

1) two string options, --file and --xml, so the command would look like
one of these:

   net-update add ip-dhcp-host --file xyz.xml --live
   net-update add ip-dhcp-host --xml "<host mac='x:x:x:x:x:x'
ip='1.2.3.4'/>"

2) two booleans and a string which is mandatory, but can be unnamed if
in the right position:

   net-update add ip-dhcp-host xyz.xml --live
   net-update add ip-dhcp-host --xml "<host mac='x:x:x:x:x:x'
ip='1.2.3.4'/>"

Any votes for one or the other?


>> +    /* the goal is to have a full xml element in the "xmldata"
>> +     * string. This can either be directly given with the --xml
>> +     * option, or indirectly with the --file option (default,
>> +     * indicates that the xmldata on the commandline is really the
>> +     * name of a file whose contents are the desired xml).
>> +     */
>> +
>> +    if (!isXml)
>> +       isFile = true;
>> +    if (isXml && isFile) {
>> +        vshError(ctl, "%s", _("you can specify file (default) or xml, "
>> +                              "but not both"));
>> +        goto cleanup;
>> +    }
>> +    if (vshCommandOptString(cmd, "xmldata", (const char **)&xmldata) < 0) {
> This cast shouldn't be necessary.


Yes, that was leftover from interim hacking when I was trying to use the
same pointer for vshCommandOptString() and virFileReadAll().


>> +        vshError(ctl, "%s", _("malformed xmldata argument"));
>> +        goto cleanup;
>> +    }
>> +
>> +    if (isFile) {
>> +        /* contents of xmldata is actually the name of a file that
>> +         * contains the xml.
>> +         */
>> +        if (virFileReadAll(xmldata, VSH_MAX_XML_FILE, &xmldataFromFile) < 0)
>> +            return false;
>> +        /* NB: the original xmldata is freed by the vshCommand
>> +         * infrastructure, so it's safe to lose its pointer here.
> Misleading comment; rather, xmldata is a 'const char *' and doesn't need
> to be freed.


Well, it points to data that is in an arg that's parsed/allocated by
vshCommandParse, and later freed by vshCommandFree, so both are correct
statements. I'll change it to something that makes us both happy :-)


> However, there's one major omission preventing me acking this: virsh.pod
> needs to document the new command.

Oops. Yeah, I'll do that before I submit it again.




More information about the libvir-list mailing list