aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Skultety <eskultet@redhat.com>2023-05-18 15:29:53 +0200
committerErik Skultety <eskultet@redhat.com>2023-06-22 12:05:04 +0000
commit10dc8f3a3d17c38f5089616e541da4b2105bf8fe (patch)
tree5c34936f5e44ff1b6b5daa4d1240b76d62ef67cd
parent84229eb3610b3819890d0bcb806d8c0bd362bd14 (diff)
downloadlibvirt-ci-10dc8f3a3d17c38f5089616e541da4b2105bf8fe.zip
libvirt-ci-10dc8f3a3d17c38f5089616e541da4b2105bf8fe.tar.gz
libvirt-ci-10dc8f3a3d17c38f5089616e541da4b2105bf8fe.tar.bz2
libvirt_wrapper: Add support for specifying a backing volume for create
This whole storage volume creation process we decided to go through only makes sense when paired with a backing store volume. This can either be a vendor provided cloud image or a custom template image. What's important though is that in most cases we won't probably know anything about this backing volume but we need to in order to construct a correct volume XML for libvirt. This patch was inspired by virt-manager which (though in much more complexity) creates a transient storage pool for user-specified backing store files to let libvirt gather the necessary information for us to be populated back to libvirt in an XML for a new volume to be created. Signed-off-by: Erik Skultety <eskultet@redhat.com>
-rw-r--r--lcitool/libvirt_wrapper.py32
1 files changed, 31 insertions, 1 deletions
diff --git a/lcitool/libvirt_wrapper.py b/lcitool/libvirt_wrapper.py
index 87154c6..e044861 100644
--- a/lcitool/libvirt_wrapper.py
+++ b/lcitool/libvirt_wrapper.py
@@ -182,7 +182,8 @@ class LibvirtStoragePoolObject(LibvirtAbstractObject):
self.raw.storageVolLookupByName(name))
def create_volume(self, name, capacity, allocation=None, _format="qcow2",
- units='bytes', owner=None, group=None, mode=None,):
+ units='bytes', owner=None, group=None, mode=None,
+ backing_store=None):
import re
unit_pattern = '^(bytes|B|[K,M,G,T,P,E](iB|B)?)$'
@@ -221,6 +222,35 @@ class LibvirtStoragePoolObject(LibvirtAbstractObject):
node_el = ET.SubElement(perms_el, perm)
node_el.text = perm_var
+ if backing_store:
+ backing_store_path_str = backing_store.as_posix()
+ backingStore_el = ET.SubElement(root_el, "backingStore")
+ path_el = ET.SubElement(backingStore_el, "path")
+ format_el = ET.SubElement(backingStore_el, "format")
+ path_el.text = backing_store_path_str
+
+ volobj = self._volume_by_path(backing_store_path_str)
+ if volobj:
+ format_ = volobj.format
+ else:
+ import uuid
+
+ # We could not locate the backing store in any storage pool.
+ # In order to fill in the backingStore volume data correctly we
+ # need to create a transient pool of type dir which contains
+ # the backingStore file storage volume to let libvirt fetch the
+ # information for us. We'll destroy the pool afterwards.
+
+ pool_dir = backing_store.parent.as_posix()
+ pool_name = "lcitool_" + str(uuid.uuid1())
+ poolobj = self._create_transient_pool(self._conn, pool_name,
+ pool_dir)
+ volobj = self._volume_by_path(backing_store_path_str)
+ format_ = volobj.format
+ poolobj.destroy()
+
+ format_el.attrib["type"] = format_
+
volume_xml = ET.tostring(root_el, encoding="UTF-8", method="xml")
return self._create_from_xml(name, volume_xml.decode("UTF-8"))