[libvirt] [RFC: PATCHv3 3/3] save: generate idempotent inactive xml for running domain
Laine Stump
laine at laine.org
Thu Jul 28 18:59:41 UTC 2011
On 07/22/2011 12:21 AM, Eric Blake wrote:
> Noticed by comparing the xml generated by virDomainSave with the
> xml produced by reparsing and redumping that xml.
>
> * src/conf/domain_conf.c (virDomainDeviceInfoIsSet): Add
> parameter, and update all callers. Make static.
> (virDomainNetDefFormat): Skip generated ifname.
> * src/conf/domain_conf.h (virDomainDeviceInfoIsSet): Delete.
> * src/libvirt_private.syms (domain_conf.h): Update.
> ---
>
> Sending this now, to get review started, but I still have some
> more fixing to do - right now, active domains still include:
>
> +<seclabel type='dynamic' model='selinux' relabel='yes'/>
>
> which is not present on reparse, but I'm too tired to find out why.
I know the feeling :-)
So does it turn out that this is important, or not?
> src/conf/domain_conf.c | 26 ++++++++++++++++----------
> src/conf/domain_conf.h | 1 -
> src/libvirt_private.syms | 1 -
> 3 files changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 919a75a..52e8ada 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1388,11 +1388,12 @@ int virDomainDeviceVirtioSerialAddressIsValid(
> }
>
>
> -int virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info)
> +static int
> +virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info, unsigned int flags)
> {
> if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
> return 1;
> - if (info->alias)
> + if (info->alias&& !(flags& VIR_DOMAIN_XML_INACTIVE))
> return 1;
> return 0;
> }
> @@ -8580,7 +8581,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
> break;
> }
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, ">\n");
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> @@ -8806,9 +8807,14 @@ virDomainNetDefFormat(virBufferPtr buf,
> break;
> }
>
> - if (def->ifname)
> +
> + if (def->ifname&&
> + !((flags& VIR_DOMAIN_XML_INACTIVE)&&
> + (STRPREFIX(def->ifname, "vnet")))) {
> + /* Skip auto-generated target names for inactive config. */
It's kind of bothersome that use of this magic device name prefix isn't
self-contained in domain_conf.c (or somewhere else). Perhaps the string
could be defined in domain_conf.h, then used here and in qemu_command.c
(is it used any place else?).
Aside from that bit of ugliness, ACK. (And I could live with this. at
least temporarily, as well, although making all the places work off a
single string constant might hypothetically save someone lots of
frustration in some uncharted future.)
> virBufferEscapeString(buf, "<target dev='%s'/>\n",
> def->ifname);
> + }
> if (def->model) {
> virBufferEscapeString(buf, "<model type='%s'/>\n",
> def->model);
> @@ -9041,7 +9047,7 @@ virDomainChrDefFormat(virBufferPtr buf,
> break;
> }
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> }
> @@ -9069,7 +9075,7 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<smartcard mode='%s'", mode);
> switch (def->type) {
> case VIR_DOMAIN_SMARTCARD_TYPE_HOST:
> - if (!virDomainDeviceInfoIsSet(&def->info)) {
> + if (!virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, "/>\n");
> return 0;
> }
> @@ -9119,7 +9125,7 @@ virDomainSoundDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<sound model='%s'",
> model);
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, ">\n");
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> @@ -9148,7 +9154,7 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<memballoon model='%s'",
> model);
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, ">\n");
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> @@ -9197,7 +9203,7 @@ virDomainWatchdogDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<watchdog model='%s' action='%s'",
> model, action);
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, ">\n");
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> @@ -9280,7 +9286,7 @@ virDomainInputDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<input type='%s' bus='%s'",
> type, bus);
>
> - if (virDomainDeviceInfoIsSet(&def->info)) {
> + if (virDomainDeviceInfoIsSet(&def->info, flags)) {
> virBufferAddLit(buf, ">\n");
> if (virDomainDeviceInfoFormat(buf,&def->info, flags)< 0)
> return -1;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 551946b..b97a57a 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1388,7 +1388,6 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
> int virDomainDevicePCIAddressIsValid(virDomainDevicePCIAddressPtr addr);
> int virDomainDeviceDriveAddressIsValid(virDomainDeviceDriveAddressPtr addr);
> int virDomainDeviceVirtioSerialAddressIsValid(virDomainDeviceVirtioSerialAddressPtr addr);
> -int virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info);
> void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
> void virDomainDefClearPCIAddresses(virDomainDefPtr def);
> void virDomainDefClearDeviceAliases(virDomainDefPtr def);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index e7d2579..3996efa 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -267,7 +267,6 @@ virDomainDeviceAddressIsValid;
> virDomainDeviceAddressTypeToString;
> virDomainDeviceDefFree;
> virDomainDeviceDefParse;
> -virDomainDeviceInfoIsSet;
> virDomainDeviceInfoIterate;
> virDomainDevicePCIAddressIsValid;
> virDomainDeviceTypeToString;
More information about the libvir-list
mailing list