From 8d27005b507ed5e8a9c9f66729b8936af65b2b4b Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 25 Jun 2012 12:24:45 +0200 Subject: [PATCH] storage: Introduce --inactive for pool-dumpxml Storage is one of the last domains in libvirt where we don't fully utilize inactive and live XML. Okay, it might be because we don't have support for that. So implement such support. However, we need to fallback when talking to old daemon which doesn't support this new flag called VIR_STORAGE_XML_INACTIVE. --- include/libvirt/libvirt.h.in | 4 ++++ src/libvirt.c | 2 +- src/storage/storage_driver.c | 10 ++++++++-- tools/virsh.c | 24 ++++++++++++++++++++++-- tools/virsh.pod | 4 +++- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 024c4ec552..6e8d5dd433 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2445,6 +2445,10 @@ struct _virStorageVolInfo { typedef virStorageVolInfo *virStorageVolInfoPtr; +typedef enum { + VIR_STORAGE_XML_INACTIVE = (1 << 0), /* dump inactive pool/volume information */ +} virStorageXMLFlags; + /* * Get connection from pool. */ diff --git a/src/libvirt.c b/src/libvirt.c index 0aa50cb6e9..ef5ac47137 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -12169,7 +12169,7 @@ error: /** * virStoragePoolGetXMLDesc: * @pool: pointer to storage pool - * @flags: bitwise-OR of virDomainXMLFlags + * @flags: bitwise-OR of virStorageXMLFlags * * Fetch an XML document describing all aspects of the * storage pool. This is suitable for later feeding back diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 3b95c704b0..fbc630d2bf 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -960,9 +960,10 @@ storagePoolGetXMLDesc(virStoragePoolPtr obj, { virStorageDriverStatePtr driver = obj->conn->storagePrivateData; virStoragePoolObjPtr pool; + virStoragePoolDefPtr def; char *ret = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_STORAGE_XML_INACTIVE, NULL); storageDriverLock(driver); pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid); @@ -974,7 +975,12 @@ storagePoolGetXMLDesc(virStoragePoolPtr obj, goto cleanup; } - ret = virStoragePoolDefFormat(pool->def); + if ((flags & VIR_STORAGE_XML_INACTIVE) && pool->newDef) + def = pool->newDef; + else + def = pool->def; + + ret = virStoragePoolDefFormat(def); cleanup: if (pool) diff --git a/tools/virsh.c b/tools/virsh.c index 567a5f6a08..2b4cb2cea0 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -10807,6 +10807,7 @@ static const vshCmdInfo info_pool_dumpxml[] = { static const vshCmdOptDef opts_pool_dumpxml[] = { {"pool", VSH_OT_DATA, VSH_OFLAG_REQ, N_("pool name or uuid")}, + {"inactive", VSH_OT_BOOL, 0, N_("show inactive defined XML")}, {NULL, 0, 0, NULL} }; @@ -10815,15 +10816,20 @@ cmdPoolDumpXML(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool; bool ret = true; + bool inactive = vshCommandOptBool(cmd, "inactive"); + unsigned int flags = 0; char *dump; + if (inactive) + flags |= VIR_STORAGE_XML_INACTIVE; + if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(pool = vshCommandOptPool(ctl, cmd, "pool", NULL))) return false; - dump = virStoragePoolGetXMLDesc(pool, 0); + dump = virStoragePoolGetXMLDesc(pool, flags); if (dump != NULL) { vshPrint(ctl, "%s", dump); VIR_FREE(dump); @@ -16127,7 +16133,8 @@ cmdPoolEdit(vshControl *ctl, const vshCmd *cmd) bool ret = false; virStoragePoolPtr pool = NULL; virStoragePoolPtr pool_edited = NULL; - unsigned int flags = 0; + unsigned int flags = VIR_STORAGE_XML_INACTIVE; + char *tmp_desc = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; @@ -16136,6 +16143,19 @@ cmdPoolEdit(vshControl *ctl, const vshCmd *cmd) if (pool == NULL) goto cleanup; + /* Some old daemons don't support _INACTIVE flag */ + if (!(tmp_desc = virStoragePoolGetXMLDesc(pool, flags))) { + if (last_error->code == VIR_ERR_INVALID_ARG) { + flags &= ~VIR_STORAGE_XML_INACTIVE; + virFreeError(last_error); + last_error = NULL; + } else { + goto cleanup; + } + } else { + VIR_FREE(tmp_desc); + } + #define EDIT_GET_XML virStoragePoolGetXMLDesc(pool, flags) #define EDIT_NOT_CHANGED \ vshPrint(ctl, _("Pool %s XML configuration not changed.\n"), \ diff --git a/tools/virsh.pod b/tools/virsh.pod index f83a29da07..191c9f2387 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -2112,9 +2112,11 @@ Destroy the resources used by a given I object. This operation is non-recoverable. The I object will still exist after this command, ready for the creation of new storage volumes. -=item B I +=item B [I<--inactive>] I Returns the XML information about the I object. +I<--inactive> tells virsh to dump pool configuration that will be used +on next start of the pool as opposed to the current pool configuration. =item B I