Change in vdsm[master]: sysprep: implement virt-sysprep functionality
by Martin Polednik
Martin Polednik has uploaded a new change for review.
Change subject: sysprep: implement virt-sysprep functionality
......................................................................
sysprep: implement virt-sysprep functionality
Virt-sysprep is a utility to mount qcow2/raw images and remove
host specific data on them. This patch allows virt-sysprep to be called
from within VDSM via sysprepImage verb.
Change-Id: I6815e101bd1f037bf21c9233b18e86f3667cce6e
Signed-off-by: Martin Polednik <mpolednik(a)redhat.com>
---
M client/vdsClient.py
M lib/vdsm/guestfs.py
M vdsm/API.py
M vdsm/rpc/BindingXMLRPC.py
M vdsm/storage/hsm.py
M vdsm/storage/image.py
M vdsm/storage/sp.py
M vdsm/storage/storage_exception.py
8 files changed, 82 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/45/33545/1
diff --git a/client/vdsClient.py b/client/vdsClient.py
index dafca9e..c52132e 100644
--- a/client/vdsClient.py
+++ b/client/vdsClient.py
@@ -1370,6 +1370,13 @@
return status['status']['code'], status['status']['message']
return 0, status['uuid']
+ def sysprepImage(self, args):
+ (spUUID, sdUUID, imgUUID) = args
+ status = self.s.sysprepImage(spUUID, sdUUID, imgUUID)
+ if status['status']['code']:
+ return status['status']['code'], status['status']['message']
+ return 0, status['uuid']
+
def cloneImageStructure(self, args):
spUUID, sdUUID, imgUUID, dstSdUUID = args
image = self.s.cloneImageStructure(spUUID, sdUUID, imgUUID, dstSdUUID)
@@ -2533,6 +2540,11 @@
'free space on image to free space on storage '
'domain using virt-sparsify'
)),
+ 'sysprepImage': (serv.sysprepImage,
+ ('<spUUID> <sdUUID> <imgUUID>'
+ 'Erase host specific data from image using '
+ 'virt-sparsify'
+ )),
'cloneImageStructure': (serv.cloneImageStructure,
('<spUUID> <sdUUID> <imgUUID> <dstSdUUID>',
'Clone an image structure from a source '
diff --git a/lib/vdsm/guestfs.py b/lib/vdsm/guestfs.py
index dd1cfdd..0c5b361 100644
--- a/lib/vdsm/guestfs.py
+++ b/lib/vdsm/guestfs.py
@@ -25,6 +25,8 @@
# Fedora, EL6
_VIRTSPARSIFY = utils.CommandPath("virt-sparsify",
"/usr/bin/virt-sparsify",)
+_VIRTSYSPREP = utils.CommandPath("virt-sysprep",
+ "/usr/bin/virt-sysprep",)
class Error(Exception):
@@ -61,3 +63,21 @@
if rc != 0:
raise Error(rc, err)
+
+
+def sysprep(volume, vol_format=None):
+ """
+ Sysprep the 'src_vol' volume (src_format) using libguestfs virt-sysprep
+
+ volume: path of base volume
+ format: format of base volume ('raw' or `qcow2')
+ """
+ cmd = [_VIRTSPARSIFY.cmd, '-a ' + volume]
+
+ if vol_format:
+ cmd.extend(("--format", vol_format))
+
+ rc, _, err = utils.execCmd(cmd, deathSignal=signal.SIGKILL)
+
+ if rc != 0:
+ raise Error(rc, err)
diff --git a/vdsm/API.py b/vdsm/API.py
index a1129b3..767cba2 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -870,6 +870,10 @@
tmpVolUUID, dstSdUUID, dstImgUUID,
dstVolUUID)
+ def sysprep(self, volUUID):
+ return self._irs.sysprepImage(self._spUUID, self._sdUUID, self._UUID,
+ volUUID)
+
def cloneStructure(self, dstSdUUID):
return self._irs.cloneImageStructure(self._spUUID, self._sdUUID,
self._UUID, dstSdUUID)
diff --git a/vdsm/rpc/BindingXMLRPC.py b/vdsm/rpc/BindingXMLRPC.py
index f2dcbdf..df0c899 100644
--- a/vdsm/rpc/BindingXMLRPC.py
+++ b/vdsm/rpc/BindingXMLRPC.py
@@ -690,6 +690,10 @@
image = API.Image(imgUUID, spUUID, sdUUID)
return image.sparsify(tmpVolUUID, dstSdUUID, dstImgUUID, dstVolUUID)
+ def imageSysprep(self, spUUID, sdUUID, imgUUID):
+ image = API.Image(imgUUID, spUUID, sdUUID)
+ return image.sparsify(imgUUID)
+
def imageCloneStructure(self, spUUID, sdUUID, imgUUID, dstSdUUID):
image = API.Image(imgUUID, spUUID, sdUUID)
return image.cloneStructure(dstSdUUID)
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index cde80ff..a5e8e6f 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -1638,6 +1638,20 @@
dstImgUUID, dstVolUUID)
@public
+ def sysprepImage(self, spUUID, sdUUID, imgUUID, volUUID):
+ """
+ Reduce sparse image size by converting free space on image to free
+ space on storage domain using virt-sparsify.
+ """
+
+ pool = self.getPool(spUUID)
+
+ vars.task.getSharedLock(STORAGE, sdUUID)
+
+ self._spmSchedule(spUUID, "sysprepImage", pool.sparsifyImage,
+ sdUUID, imgUUID, volUUID)
+
+ @public
def cloneImageStructure(self, spUUID, sdUUID, imgUUID, dstSdUUID):
"""
Clone an image structure (volume chain) to a destination domain within
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 974ba66..d337341 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -591,6 +591,26 @@
tmpVolume.shrinkToOptimalSize()
dstVolume.shrinkToOptimalSize()
+ def sysprep(self, sdUUID, imgUUID, volUUID):
+ """
+ Erase host-specific data from image using libguestfs virt-sysprep
+ """
+ self.log.info("dstSdUUID=%s, dstImgUUID=%s, dstVolUUID=%s",
+ sdUUID, imgUUID, volUUID)
+
+ volume = self._getSparsifyVolume(sdUUID, imgUUID, volUUID)
+
+ volume.prepare()
+ try:
+ volume_format = volume.fmt2str(volume.getFormat())
+
+ guestfs.sysprep(volume.getVolumePath(), vol_format=volume_format)
+ except Exception:
+ self.log.exception('Unexpected error sysprepping %s', volUUID)
+ raise se.CannotSysprepVolume(volUUID)
+ finally:
+ volume.teardown(sdUUID=sdUUID, volUUID=volUUID)
+
def cloneStructure(self, sdUUID, imgUUID, dstSdUUID):
self._createTargetImage(sdCache.produce(dstSdUUID), sdUUID, imgUUID)
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index 34a8fbf..65f9238 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1588,6 +1588,9 @@
tmpSdUUID, tmpImgUUID, tmpVolUUID, dstSdUUID, dstImgUUID,
dstVolUUID)
+ def sysprepImage(self):
+ pass
+
def cloneImageStructure(self, sdUUID, imgUUID, dstSdUUID):
"""
Clone an image structure from a source domain to a destination domain
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 4e2e2e0..8da1d2c 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -339,6 +339,11 @@
message = "Cannot sparsify volume"
+class CannotSysprepVolume(StorageException):
+ code = 235
+ message = "Cannot sysprep volume"
+
+
#################################################
# Images Exceptions
#################################################
--
To view, visit http://gerrit.ovirt.org/33545
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6815e101bd1f037bf21c9233b18e86f3667cce6e
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Martin Polednik <mpolednik(a)redhat.com>
9 years, 7 months
Change in vdsm[master]: guestfs: rename virtsparsify to guestfs
by Martin Polednik
Martin Polednik has uploaded a new change for review.
Change subject: guestfs: rename virtsparsify to guestfs
......................................................................
guestfs: rename virtsparsify to guestfs
Virt-sparsify was implemented as a single functionality from libguestfs
library, but in order to support more libguestfs functionality
without needing module for each functionality it makes sense to name
the module "guestfs" (without lib as the path itself is lib/vdsm/... ->
lib/vdsm/guestfs.py)
Change-Id: Id2d965b74371db8e9112f47e8f31e5d24e9d4029
Signed-off-by: Martin Polednik <mpolednik(a)redhat.com>
---
M debian/vdsm-python.install
M lib/vdsm/Makefile.am
R lib/vdsm/guestfs.py
M vdsm.spec.in
M vdsm/storage/image.py
5 files changed, 9 insertions(+), 9 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/44/33544/1
diff --git a/debian/vdsm-python.install b/debian/vdsm-python.install
index 1158db2..d98254b 100644
--- a/debian/vdsm-python.install
+++ b/debian/vdsm-python.install
@@ -35,5 +35,5 @@
./usr/lib/python2.7/dist-packages/vdsm/tool/vdsm-id.py
./usr/lib/python2.7/dist-packages/vdsm/utils.py
./usr/lib/python2.7/dist-packages/vdsm/vdscli.py
-./usr/lib/python2.7/dist-packages/vdsm/virtsparsify.py
+./usr/lib/python2.7/dist-packages/vdsm/guestfs.py
./usr/lib/python2.7/dist-packages/vdsm/xmlrpc.py
diff --git a/lib/vdsm/Makefile.am b/lib/vdsm/Makefile.am
index 4bebf28..377d17a 100644
--- a/lib/vdsm/Makefile.am
+++ b/lib/vdsm/Makefile.am
@@ -35,7 +35,7 @@
sslutils.py \
utils.py \
vdscli.py \
- virtsparsify.py \
+ guestfs.py \
xmlrpc.py \
$(NULL)
diff --git a/lib/vdsm/virtsparsify.py b/lib/vdsm/guestfs.py
similarity index 100%
rename from lib/vdsm/virtsparsify.py
rename to lib/vdsm/guestfs.py
diff --git a/vdsm.spec.in b/vdsm.spec.in
index cd1c0e4..dde6d31 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -1228,7 +1228,7 @@
%{python_sitearch}/%{vdsm_name}/sslutils.py*
%{python_sitearch}/%{vdsm_name}/utils.py*
%{python_sitearch}/%{vdsm_name}/vdscli.py*
-%{python_sitearch}/%{vdsm_name}/virtsparsify.py*
+%{python_sitearch}/%{vdsm_name}/guestfs.py*
%{python_sitearch}/%{vdsm_name}/xmlrpc.py*
%{python_sitearch}/%{vdsm_name}/tool/__init__.py*
%if 0%{?with_systemd}
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 9855a26..974ba66 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -26,7 +26,7 @@
import volume
from vdsm import qemuimg
-from vdsm import virtsparsify
+from vdsm import guestfs
from sdc import sdCache
import sd
import misc
@@ -574,11 +574,11 @@
srcFormat = volume.fmt2str(srcVolume.getFormat())
dstFormat = volume.fmt2str(dstVolume.getFormat())
- virtsparsify.sparsify(srcVolume.getVolumePath(),
- tmpVolume.getVolumePath(),
- dstVolume.getVolumePath(),
- src_format=srcFormat,
- dst_format=dstFormat)
+ guestfs.sparsify(srcVolume.getVolumePath(),
+ tmpVolume.getVolumePath(),
+ dstVolume.getVolumePath(),
+ src_format=srcFormat,
+ dst_format=dstFormat)
except Exception:
self.log.exception('Unexpected error sparsifying %s',
tmpVolUUID)
--
To view, visit http://gerrit.ovirt.org/33544
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Id2d965b74371db8e9112f47e8f31e5d24e9d4029
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Martin Polednik <mpolednik(a)redhat.com>
9 years, 7 months
Change in vdsm[master]: libguestfs: rename virtsparsify to guestfs
by Martin Polednik
Martin Polednik has uploaded a new change for review.
Change subject: libguestfs: rename virtsparsify to guestfs
......................................................................
libguestfs: rename virtsparsify to guestfs
http://gerrit.ovirt.org/#/c/28328/16 added way to use libguestfs
virt-sparsify functionality to VDSM. In order to use more than just
sparsify, it's feasible to rename the module virtsparsify->guestfs and
use it for more future functionality.
Change-Id: I07a7f4d5ebd5d8c16df4a35904a8bdf80f77e7b9
Signed-off-by: Martin Polednik <mpolednik(a)redhat.com>
---
M debian/vdsm-python.install
M lib/vdsm/Makefile.am
R lib/vdsm/guestfs.py
M vdsm.spec.in
M vdsm/storage/image.py
5 files changed, 9 insertions(+), 9 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/43/33543/1
diff --git a/debian/vdsm-python.install b/debian/vdsm-python.install
index 1158db2..d98254b 100644
--- a/debian/vdsm-python.install
+++ b/debian/vdsm-python.install
@@ -35,5 +35,5 @@
./usr/lib/python2.7/dist-packages/vdsm/tool/vdsm-id.py
./usr/lib/python2.7/dist-packages/vdsm/utils.py
./usr/lib/python2.7/dist-packages/vdsm/vdscli.py
-./usr/lib/python2.7/dist-packages/vdsm/virtsparsify.py
+./usr/lib/python2.7/dist-packages/vdsm/guestfs.py
./usr/lib/python2.7/dist-packages/vdsm/xmlrpc.py
diff --git a/lib/vdsm/Makefile.am b/lib/vdsm/Makefile.am
index 4bebf28..377d17a 100644
--- a/lib/vdsm/Makefile.am
+++ b/lib/vdsm/Makefile.am
@@ -35,7 +35,7 @@
sslutils.py \
utils.py \
vdscli.py \
- virtsparsify.py \
+ guestfs.py \
xmlrpc.py \
$(NULL)
diff --git a/lib/vdsm/virtsparsify.py b/lib/vdsm/guestfs.py
similarity index 100%
rename from lib/vdsm/virtsparsify.py
rename to lib/vdsm/guestfs.py
diff --git a/vdsm.spec.in b/vdsm.spec.in
index cd1c0e4..dde6d31 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -1228,7 +1228,7 @@
%{python_sitearch}/%{vdsm_name}/sslutils.py*
%{python_sitearch}/%{vdsm_name}/utils.py*
%{python_sitearch}/%{vdsm_name}/vdscli.py*
-%{python_sitearch}/%{vdsm_name}/virtsparsify.py*
+%{python_sitearch}/%{vdsm_name}/guestfs.py*
%{python_sitearch}/%{vdsm_name}/xmlrpc.py*
%{python_sitearch}/%{vdsm_name}/tool/__init__.py*
%if 0%{?with_systemd}
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 9855a26..974ba66 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -26,7 +26,7 @@
import volume
from vdsm import qemuimg
-from vdsm import virtsparsify
+from vdsm import guestfs
from sdc import sdCache
import sd
import misc
@@ -574,11 +574,11 @@
srcFormat = volume.fmt2str(srcVolume.getFormat())
dstFormat = volume.fmt2str(dstVolume.getFormat())
- virtsparsify.sparsify(srcVolume.getVolumePath(),
- tmpVolume.getVolumePath(),
- dstVolume.getVolumePath(),
- src_format=srcFormat,
- dst_format=dstFormat)
+ guestfs.sparsify(srcVolume.getVolumePath(),
+ tmpVolume.getVolumePath(),
+ dstVolume.getVolumePath(),
+ src_format=srcFormat,
+ dst_format=dstFormat)
except Exception:
self.log.exception('Unexpected error sparsifying %s',
tmpVolUUID)
--
To view, visit http://gerrit.ovirt.org/33543
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I07a7f4d5ebd5d8c16df4a35904a8bdf80f77e7b9
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Martin Polednik <mpolednik(a)redhat.com>
9 years, 7 months
Change in vdsm[master]: addNetwork script: Prevent empty params from reaching Runnin...
by asegurap@redhat.com
Antoni Segura Puimedon has uploaded a new change for review.
Change subject: addNetwork script: Prevent empty params from reaching RunningConfig
......................................................................
addNetwork script: Prevent empty params from reaching RunningConfig
The consumers of the addNetwork script pass empty parameters, e.g. ""
in order to fill the positional arguments that the script takes. The
problem with that is that those parameters were being passed to
addNetwork without modification, and that includes the
_alterNetworkConfig wrapper that makes addNetwork requests reach
runningConfig (and eventually PersistentConfig).
Due to the issue above, a stored network could contain entries like
'bonding': '' that would mess with selective network restoration.
Change-Id: If6d56eefc05cdb7456f80b7ec13d0be8ad087aa3
Bug-Url: https://bugzilla.redhat.com/1144639
Signed-off-by: Antoni S. Puimedon <asegurap(a)redhat.com>
---
M vdsm/network/api.py
1 file changed, 4 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/10/33510/1
diff --git a/vdsm/network/api.py b/vdsm/network/api.py
index 8879245..f2a2cd6 100755
--- a/vdsm/network/api.py
+++ b/vdsm/network/api.py
@@ -822,6 +822,10 @@
kwargs = _parseKwargs(sys.argv[3:])
if 'nics' in kwargs:
kwargs['nics'] = kwargs['nics'].split(',')
+ # Remove empty keys so that they are not taken by _alterRunningConfig
+ for key, value in kwargs.items():
+ if key != 'bondingOptions' and value == '':
+ del kwargs[key]
addNetwork(bridge, **kwargs)
elif sys.argv[1] == 'del':
bridge = sys.argv[2]
--
To view, visit http://gerrit.ovirt.org/33510
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If6d56eefc05cdb7456f80b7ec13d0be8ad087aa3
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Antoni Segura Puimedon <asegurap(a)redhat.com>
9 years, 7 months
Change in vdsm[master]: toolTests: Fix pyflakes error.
by mtayer@redhat.com
mooli tayer has uploaded a new change for review.
Change subject: toolTests: Fix pyflakes error.
......................................................................
toolTests: Fix pyflakes error.
At change 32713 I introduced a pyflakes violation:
./tests/toolTests.py:309: undefined name 'Libvirt'
Change-Id: Ibb8fb3a8413d97d3ad6dca6ccbb81748facafe84
Signed-off-by: Mooli Tayer <mtayer(a)redhat.com>
---
M tests/toolTests.py
1 file changed, 2 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/31/33531/1
diff --git a/tests/toolTests.py b/tests/toolTests.py
index 058c038..67d9f6b 100644
--- a/tests/toolTests.py
+++ b/tests/toolTests.py
@@ -306,7 +306,8 @@
with open(os.path.join(dirName,
'toolTests_%s.conf' % type_)) as template:
data = template.read()
- data = data % {'LATEST_CONF_VERSION': Libvirt.CONF_VERSION}
+ data = data % {
+ 'LATEST_CONF_VERSION': libvirt.Configurator.CONF_VERSION}
with open(self.test_env[file_], 'w') as testConf:
testConf.write(data)
--
To view, visit http://gerrit.ovirt.org/33531
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb8fb3a8413d97d3ad6dca6ccbb81748facafe84
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: mooli tayer <mtayer(a)redhat.com>
9 years, 7 months