Tal Nisan has uploaded a new change for review. Change subject: core: Check live snapshot capabilities in live storage migration CDA ......................................................................
core: Check live snapshot capabilities in live storage migration CDA Change-Id: Idba6581587d1908e4428ea2d18878c2f62a0b317 Bug-Url: https://bugzilla.redhat.com/1158049 Bug-Url: https://bugzilla.redhat.com/1105846 Signed-off-by: Tal Nisan <tni...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/LiveSnapshotValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java 4 files changed, 56 insertions(+), 25 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/41/34841/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java index 2bc7ccb..5f5520c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java @@ -19,6 +19,7 @@ import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; +import org.ovirt.engine.core.bll.validator.LiveSnapshotValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; @@ -541,7 +542,8 @@ } protected boolean validateVM(VmValidator vmValidator) { - return canDoSnapshot(getVm()) && + LiveSnapshotValidator validator = new LiveSnapshotValidator(getStoragePool().getcompatibility_version(), getVds()); + return (getVm().isDown() || validate(validator.canDoSnapshot())) && validate(vmValidator.vmNotSavingRestoring()); } @@ -562,30 +564,6 @@ protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__CREATE); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__SNAPSHOT); - } - - private boolean canDoSnapshot(VM vm) { - // if live snapshot is not available, then if vm is up - snapshot is not possible so it needs to be - // checked if vm up or not - // if live snapshot is enabled, there is no need to check if vm is up since in any case snapshot is possible - if (!isLiveSnapshotEnabled() && !vm.isDown()) { - // if there is no live snapshot and the vm is up - snapshot is not possible - return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_DATA_CENTER_VERSION_DOESNT_SUPPORT_LIVE_SNAPSHOT); - } - VDS vds = getVds(); - // it is possible, even if unlikely, that the QEMU on the host does not support live snapshotting - if (vds != null && !vds.getLiveSnapshotSupport()) { - return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_QEMU_UNSUPPORTED_OPERATION); - } - return true; - } - - /** - * @return If DC level does not support live snapshots. - */ - private boolean isLiveSnapshotEnabled() { - return Config.<Boolean> getValue( - ConfigValues.LiveSnapshotEnabled, getStoragePool().getcompatibility_version().getValue()); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java index 1ef375a..e5e0aeb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java @@ -19,6 +19,7 @@ import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter; import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; +import org.ovirt.engine.core.bll.validator.LiveSnapshotValidator; import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; import org.ovirt.engine.core.bll.utils.PermissionSubject; @@ -297,6 +298,11 @@ protected boolean canDoAction() { setStoragePoolId(getVm().getStoragePoolId()); + LiveSnapshotValidator validator = new LiveSnapshotValidator(getStoragePool().getcompatibility_version(), getVds()); + if (!validate(validator.canDoSnapshot())) { + return false; + } + if (!isValidParametersList() || !checkImagesStatus() || !validateSpaceRequirements() || !performVmRelatedChecks()) { return false; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/LiveSnapshotValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/LiveSnapshotValidator.java new file mode 100644 index 0000000..9b3b6fd --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/LiveSnapshotValidator.java @@ -0,0 +1,38 @@ +package org.ovirt.engine.core.bll.validator; + +import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.compat.Version; + +public class LiveSnapshotValidator { + + private Version compatibilityVersion; + private VDS vds; + + public LiveSnapshotValidator(Version compatibilityVersion, VDS vds) { + this.compatibilityVersion = compatibilityVersion; + this.vds = vds; + } + + public ValidationResult canDoSnapshot() { + if (!isLiveSnapshotEnabled(compatibilityVersion)) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DATA_CENTER_VERSION_DOESNT_SUPPORT_LIVE_SNAPSHOT); + } + + // it is possible, even if unlikely, that the QEMU on the host does not support live snapshotting + if (vds != null && !vds.getLiveSnapshotSupport()) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_QEMU_UNSUPPORTED_OPERATION); + } + return ValidationResult.VALID; + } + + /** + * @return If DC level does not support live snapshots. + */ + private static boolean isLiveSnapshotEnabled(Version version) { + return Config.<Boolean> getValue(ConfigValues.LiveSnapshotEnabled, version.getValue()); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java index 1e05022..c193680 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java @@ -10,6 +10,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; import java.util.ArrayList; import java.util.Arrays; @@ -17,6 +18,7 @@ import java.util.List; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -38,6 +40,7 @@ import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; @@ -46,6 +49,7 @@ import org.ovirt.engine.core.dao.StorageDomainDAO; import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.VmDAO; +import org.ovirt.engine.core.utils.MockConfigRule; @RunWith(MockitoJUnitRunner.class) public class LiveMigrateVmDisksCommandTest { @@ -59,6 +63,11 @@ private final Guid storagePoolId = Guid.newGuid(); private final Guid diskProfileId = Guid.newGuid(); + @ClassRule + public static MockConfigRule mcr = new MockConfigRule( + mockConfig(ConfigValues.LiveSnapshotEnabled, Version.v3_1.toString(), true) + ); + @Mock private DiskImageDAO diskImageDao; -- To view, visit http://gerrit.ovirt.org/34841 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idba6581587d1908e4428ea2d18878c2f62a0b317 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Tal Nisan <tni...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches