On 09/20/2012 09:05 AM, 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. > > An example usage: > > virsh net-update mynet add-last ip-dhcp-host \ > "<host mac='00:11:22:33:44:55' ip='192.168.122.45'/>" \ > --live --config > > If you like, you can instead put the xml into a file, and call like > this: > > virsh net-update mynet add ip-dhcp-host /tmp/myxml.xml > --live --config > > (since an xml element must always start with "<", but a filename > rarely does, virsh just checks the first character of the supplied > "--xml" argument, and decides whether to use the text directly or as a > filename. In the rare event that someone really does have a filename > starting with "<", they can specify it as "./<xxxx".) I like this version the best. > + * "net-update" command > + */ > +static const vshCmdInfo info_network_update[] = { > + {"help", N_("update parts of an existing network's configuration")}, > + {"desc", ""}, > + {NULL, NULL} > +}; > + > +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-first, add-last (add), delete, or modify)")}, > + {"section", VSH_OT_DATA, VSH_OFLAG_REQ, > + N_("which section of network configuration to update")}, > + {"xml", VSH_OT_DATA, VSH_OFLAG_REQ, > + N_("name of file containing xml (or, if it starts with '<', the complete " > + "xml element itself) to add/modify, or to be matched for search")}, Two spaces after ')' looks fishy. > + > + /* The goal is to have a full xml element in the "xml" > + * string. This is provided in the --xml option, either directly > + * (detected by the first character being "<"), or indirectly by > + * supplying a filename (first character isn't "<") that contains > + * the desired xml. > + */ > + > + if (vshCommandOptString(cmd, "xml", &xml) < 0) { > + vshError(ctl, "%s", _("malformed or missing xml argument")); > + goto cleanup; > + } > + > + if (*xml != '<') { > + /* contents of xmldata is actually the name of a file that > + * contains the xml. > + */ > + if (virFileReadAll(xml, VSH_MAX_XML_FILE, &xmlFromFile) < 0) > + return false; > + /* NB: the original xml is just a const char * that points > + * to a string owned by the Command object, and will be freed > + * by vshCommandFree. so it's safe to lose its pointer here. > + */ > + xml = xmlFromFile; > + } > + > + if (current) { > + if (live || config) { > + vshError(ctl, "%s", _("--current must be specified exclusively")); > + return false; > + } > + flags |= VIR_NETWORK_UPDATE_AFFECT_CURRENT; > + } else { > + if (config) > + flags |= VIR_NETWORK_UPDATE_AFFECT_CONFIG; > + if (live) > + flags |= VIR_NETWORK_UPDATE_AFFECT_LIVE; > + } > + > + if (virNetworkUpdate(network, command, > + section, parentIndex, xml, flags) < 0) { > + vshError(ctl, _("Failed to update network %s"), > + virNetworkGetName(network)); > + goto cleanup; > + } > + > + if (flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG) { If you want, this could be simplified to: 'if (config) {' > + if (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE) > + affected = _("persistent config and live state"); > + else > + affected = _("persistent config"); > + } else if (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE) { and likewise simplify these two bitwise ops to 'if (live)'. ACK (unless I get outvoted by other opinions :). -- Eric Blake eblake@xxxxxxxxxx +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list