]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: Introduce --inactive for pool-dumpxml
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 25 Jun 2012 10:24:45 +0000 (12:24 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 25 Jun 2012 11:23:28 +0000 (13:23 +0200)
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
src/libvirt.c
src/storage/storage_driver.c
tools/virsh.c
tools/virsh.pod

index 024c4ec552bd1b273c0bd004a7db83bac609e038..6e8d5dd4335d6f385ec4d56507706ff5fbfae8bf 100644 (file)
@@ -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.
  */
index 0aa50cb6e9558b433a788931f49c906bfc62e1f6..ef5ac4713707f2056b2a645564a200b0c15ad48c 100644 (file)
@@ -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
index 3b95c704b0386a2ee0cd82401cf9015f2fc83ed2..fbc630d2bffb3c3dc9cd07fbff1bef47b801c1d8 100644 (file)
@@ -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)
index 567a5f6a0820337d2fa556cab978b6df44f59ccb..2b4cb2cea05a80eae99d82196a05fc0f3801d68b 100644 (file)
@@ -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"),    \
index f83a29da07e503e3b746936079bf5ea2ad751fb4..191c9f2387a2bca599ae87ec13c9b9508f8cb527 100644 (file)
@@ -2112,9 +2112,11 @@ Destroy the resources used by a given I<pool> object. This operation
 is non-recoverable.  The I<pool> object will still exist after this
 command, ready for the creation of new storage volumes.
 
-=item B<pool-dumpxml> I<pool-or-uuid>
+=item B<pool-dumpxml> [I<--inactive>] I<pool-or-uuid>
 
 Returns the XML information about the I<pool> 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<pool-edit> I<pool-or-uuid>