Signed-off-by: Katerina Koukiou <kkoukiou(a)redhat.com>
---
data/org.libvirt.StoragePool.xml | 7 +++++++
src/storagepool.c | 34 ++++++++++++++++++++++++++++++++++
tests/libvirttest.py | 17 +++++++++++++++++
tests/test_storage.py | 4 ++++
4 files changed, 62 insertions(+)
diff --git a/data/org.libvirt.StoragePool.xml b/data/org.libvirt.StoragePool.xml
index 764c9c1..51d65ab 100644
--- a/data/org.libvirt.StoragePool.xml
+++ b/data/org.libvirt.StoragePool.xml
@@ -68,6 +68,13 @@
value="See
https://libvirt.org/html/libvirt-libvirt-storage.html#virStoragePoolRefre...
<arg name="flags" type="u" direction="in"/>
</method>
+ <method name="StorageVolCreateXML">
+ <annotation name="org.gtk.GDBus.DocString"
+ value="See
https://libvirt.org/html/libvirt-libvirt-storage.html#virStorageVolCreate...
+ <arg name="xml" type="s" direction="in"/>
+ <arg name="flags" type="u" direction="in"/>
+ <arg name="storageVol" type="o"
direction="out"/>
+ </method>
<method name="Undefine">
<annotation name="org.gtk.GDBus.DocString"
value="See
https://libvirt.org/html/libvirt-libvirt-storage.html#virStoragePoolUndef...
diff --git a/src/storagepool.c b/src/storagepool.c
index 11e356c..c3fd0bf 100644
--- a/src/storagepool.c
+++ b/src/storagepool.c
@@ -368,6 +368,39 @@ virtDBusStoragePoolRefresh(GVariant *inArgs,
virtDBusUtilSetLastVirtError(error);
}
+static void
+virtDBusStoragePoolStorageVolCreateXML(GVariant *inArgs,
+ GUnixFDList *inFDs G_GNUC_UNUSED,
+ const gchar *objectPath,
+ gpointer userData,
+ GVariant **outArgs,
+ GUnixFDList **outFDs G_GNUC_UNUSED,
+ GError **error)
+{
+ virtDBusConnect *connect = userData;
+ g_autoptr(virStoragePool) storagePool = NULL;
+ g_autoptr(virStorageVol) storageVol = NULL;
+ gchar *xml;
+ guint flags;
+ g_autofree gchar *path = NULL;
+
+ g_variant_get(inArgs, "(&su)", &xml, &flags);
+
+ storagePool = virtDBusStoragePoolGetVirStoragePool(connect, objectPath,
+ error);
+ if (!storagePool)
+ return;
+
+ storageVol = virStorageVolCreateXML(storagePool, xml, flags);
+ if (!storageVol)
+ return virtDBusUtilSetLastVirtError(error);
+
+ path = virtDBusUtilBusPathForVirStorageVol(storageVol,
+ connect->storageVolPath);
+
+ *outArgs = g_variant_new("(o)", path);
+}
+
static void
virtDBusStoragePoolUndefine(GVariant *inArgs G_GNUC_UNUSED,
GUnixFDList *inFDs G_GNUC_UNUSED,
@@ -408,6 +441,7 @@ static virtDBusGDBusMethodTable virtDBusStoragePoolMethodTable[] = {
{ "GetXMLDesc", virtDBusStoragePoolGetXMLDesc },
{ "ListStorageVolumes", virtDBusStoragePoolListAllVolumes },
{ "Refresh", virtDBusStoragePoolRefresh },
+ { "StorageVolCreateXML", virtDBusStoragePoolStorageVolCreateXML },
{ "Undefine", virtDBusStoragePoolUndefine },
{ 0 }
};
diff --git a/tests/libvirttest.py b/tests/libvirttest.py
index 3cd02ef..f65251a 100644
--- a/tests/libvirttest.py
+++ b/tests/libvirttest.py
@@ -100,6 +100,23 @@ class BaseTestClass():
obj = self.bus.get_object('org.libvirt', path)
return path, obj
+ def test_storage_vol(self):
+ minimal_storage_vol_xml = '''
+ <volume>
+ <name>sparse.img</name>
+ <capacity unit="G">2</capacity>
+ <target>
+ <path>/var/lib/virt/images/sparse.img</path>
+ </target>
+ </volume>
+ '''
+ _, test_storage_pool = self.test_storage_pool()
+ interface_obj = dbus.Interface(test_storage_pool,
+ 'org.libvirt.StoragePool')
+ path = interface_obj.StorageVolCreateXML(minimal_storage_vol_xml, 0)
+ obj = self.bus.get_object('org.libvirt', path)
+ return path, obj
Right, so there is no default volume defined for the test driver so we
cannot use the same approach as for other object types. However, the
XML of the new storage volume should be in the storage_pool test file as
we have new domain XML in the connect test file. Or we can move all the
XMLs into specific file and include it.
+
class DomainEvent(IntEnum):
DEFINED = 0
diff --git a/tests/test_storage.py b/tests/test_storage.py
index 79e0c16..1cd1249 100755
--- a/tests/test_storage.py
+++ b/tests/test_storage.py
@@ -126,6 +126,10 @@ class TestStoragePool(libvirttest.BaseTestClass):
self.main_loop()
+ def test_storage_pool_volume_create(self):
+ path, _ = self.test_storage_vol()
+ assert isinstance(path, dbus.ObjectPath)
+
The test_storage_vol hides the actual StorageVolCreateXML call. I
understand the we need to create the storage volume for every single
test-case because the libvirt-dbus deamon is restarted every time.
It would be nice to do it differently, for example to have some method
that would precreate the storage volume and this one would do the same
as for other objects.
Otherwise looks good. If it turn out to be difficult to make it work
that way we can use this current solution for tests.
Pavel