Vered Volansky has uploaded a new change for review. Change subject: core: disable illegal operations on a pooled VM ......................................................................
core: disable illegal operations on a pooled VM When a disk is defined as ReadOnly or Wipe After Delete in a VmTemplate, after which a VmPool was created, these values shouldn't be allowed to be changed as long as the vm is still attached to the pool. This patch enforces this in the backend. Change-Id: Ie3a6e1542f3ef4fb78f074b62e854a4907dfbca6 Bug-Url: https://bugzilla.redhat.com/1057721 Signed-off-by: Vered Volansky <vvola...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java 2 files changed, 53 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/35457/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java index d5ad91e..5701138 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java @@ -167,6 +167,7 @@ DiskValidator diskValidator = getDiskValidator(getNewDisk()); return validateCanUpdateShareable() && validateCanUpdateReadOnly(diskValidator) && + validateVmNotAttachedToPool() && validate(diskValidator.isVirtIoScsiValid(getVm())) && (getOldDisk().getDiskInterface() == getNewDisk().getDiskInterface() || validate(diskValidator.isDiskInterfaceSupported(getVm()))) && @@ -272,8 +273,17 @@ if(getVm().getStatus() != VMStatus.Down && vmDeviceForVm.getIsPlugged()) { return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN); } + if (!validateVmNotAttachedToPool()) { + return false; + } return validate(diskValidator.isReadOnlyPropertyCompatibleWithInterface()); } + return true; + } + + protected boolean validateVmNotAttachedToPool() { + if ((updateReadOnlyRequested() || updateWipeAfterDeleteRequested()) && getVm().getVmPoolId() != null) + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); return true; } @@ -594,7 +604,11 @@ protected boolean updateReadOnlyRequested() { Boolean readOnlyNewValue = getNewDisk().getReadOnly(); - return readOnlyNewValue != null && !vmDeviceForVm.getIsReadOnly().equals(readOnlyNewValue); + return readOnlyNewValue != null && !getVmDeviceForVm().getIsReadOnly().equals(readOnlyNewValue); + } + + protected boolean updateWipeAfterDeleteRequested() { + return getNewDisk().isWipeAfterDelete() != getOldDisk().isWipeAfterDelete(); } protected boolean isAtLeastOneVmIsNotDown(List<VM> vmsDiskPluggedTo) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java index e856c34..2c7c4bf 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java @@ -208,6 +208,44 @@ } @Test + public void canDoActionFailedROVmAttachedToPool() { + when(diskDao.get(diskImageGuid)).thenReturn(createDiskImage()); + UpdateVmDiskParameters parameters = createParameters(); + parameters.getDiskInfo().setReadOnly(true); + VM vm = createVm(VMStatus.Down); + vm.setVmPoolId(Guid.newGuid()); + initializeCommand(parameters, Collections.singletonList(vm)); + + VmDevice vmDevice = createVmDevice(diskImageGuid, vmId); // Default RO is false + when(command.getVmDeviceForVm()).thenReturn(vmDevice); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); + + vmDevice.setIsReadOnly(true); + parameters.getDiskInfo().setReadOnly(false); + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); + } + + @Test + public void canDoActionFailedWipeVmAttachedToPool() { + Disk oldDisk = createDiskImage(); + oldDisk.setWipeAfterDelete(true); + when(diskDao.get(diskImageGuid)).thenReturn(oldDisk); + + UpdateVmDiskParameters parameters = createParameters(); + parameters.getDiskInfo().setWipeAfterDelete(false); + VM vm = createVm(VMStatus.Down); + vm.setVmPoolId(Guid.newGuid()); + initializeCommand(parameters, Collections.singletonList(vm)); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); + + oldDisk.setWipeAfterDelete(false); + parameters.getDiskInfo().setWipeAfterDelete(true); + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); + } + + @Test public void canDoActionFailedShareableDiskOnGlusterDomain() throws Exception { UpdateVmDiskParameters parameters = createParameters(); DiskImage disk = createShareableDisk(VolumeFormat.RAW); -- To view, visit http://gerrit.ovirt.org/35457 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie3a6e1542f3ef4fb78f074b62e854a4907dfbca6 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Vered Volansky <vvola...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches