[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] Domain XML format using defined storage volume + RFC



Daniel P. Berrange schreef:
and a volume can be either a file
or a physical device, so fixing it to be 'phy:' is not correct.
How can we know if the volume is a file or a device?

virStorageVolGetInfo() will tell you via the 'info' field of the struct
it fills

As attached. I updated the 'typ' option.

We also need to apply the reverse mapping when generating the XML. eg
do a virStorageVolLookupByPath() to discover the volume/pool.
Mmm... that sounds not trivial... (I mean duplicate wise).

This is true - until we merge all the XML processing for drivers together
there will be a non-trivial bit of duplication

Not done yet... and I prefer the last thing to be a different patch.


Stefan
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 02ca509..8e2a7b6 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -344,7 +344,7 @@
     <dl>
       <dt><code>disk</code></dt>
       <dd>The <code>disk</code> element is the main container for describing
-	disks. The <code>type</code> attribute is either "file" or "block"
+	disks. The <code>type</code> attribute is either "file", "block" or "pool"
 	and refers to the underlying source for the disk. The optional
 	<code>device</code> attribute indicates how the disk is to be exposed
 	to the guest OS. Possible values for this attribute are "floppy", "disk"
@@ -354,7 +354,11 @@
       <dd>If the disk <code>type</code> is "file", then the <code>file</code> attribute
 	specifies the fully-qualified path to the file holding the disk. If the disk
 	<code>type</code> is "block", then the <code>dev</code> attribute specifies
-	the path to the host device to serve as the disk. <span class="since">Since 0.0.3</span></dd>
+	the path to the host device to serve as the disk. If the disk <code>type</code>
+    is "pool", then the <code>pool</code> and <code>volume</code> specify the
+    virtual location of the disk, the path is automatically resolved if the pool
+    and the volume exist.
+    <span class="since">Since 0.0.3</span></dd>
       <dt><code>target</code></dt>
       <dd>The <code>target</code> element controls the bus / device under which the
 	disk is exposed to the guest OS. The <code>dev</code> attribute indicates
diff --git a/src/xml.c b/src/xml.c
index 22dc211..598bfb3 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -1300,6 +1300,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
             typ = 0;
         else if (xmlStrEqual(type, BAD_CAST "block"))
             typ = 1;
+        else if (xmlStrEqual(type, BAD_CAST "pool"))
+            typ = 2;
         xmlFree(type);
     }
     device = xmlGetProp(node, BAD_CAST "device");
@@ -1309,11 +1311,32 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
         if (cur->type == XML_ELEMENT_NODE) {
             if ((source == NULL) &&
                 (xmlStrEqual(cur->name, BAD_CAST "source"))) {
-
                 if (typ == 0)
                     source = xmlGetProp(cur, BAD_CAST "file");
-                else
+                else if (typ == 1)
                     source = xmlGetProp(cur, BAD_CAST "dev");
+                else if (typ == 2) {
+                    xmlChar *pool   = xmlGetProp(cur, BAD_CAST "pool");
+                    xmlChar *volume = xmlGetProp(cur, BAD_CAST "volume");
+                    if (pool != NULL && volume != NULL) {
+                        virStoragePoolPtr virPool;
+                        virPool = virStoragePoolLookupByName(conn, (const char *) pool);
+                        if (virPool != NULL) {
+                            virStorageVolPtr virVol;
+                            virVol = virStorageVolLookupByName(virPool, (const char *) volume);
+                            if (virVol != NULL) {
+                                virStorageVolInfo info;
+                                if (virStorageVolGetInfo(virVol, &info) == 0) {
+                                    source = BAD_CAST virStorageVolGetPath(virVol);
+                                    /* We set the type to the 'native' type */
+                                    typ = info.type;
+                                }
+                            }
+                        }
+                    }
+                    xmlFree(pool);
+                    xmlFree(volume);
+                }
             } else if ((target == NULL) &&
                        (xmlStrEqual(cur->name, BAD_CAST "target"))) {
                 target = xmlGetProp(cur, BAD_CAST "dev");
@@ -1411,7 +1434,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
                 virBufferVSprintf(buf, "(uname 'phy:%s')", source);
             else
                 virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", source);
-        }
+        } 
     }
     if (ro == 1)
         virBufferAddLit(buf, "(mode 'r')");

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]