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')");