Daniel Erez has uploaded a new change for review. Change subject: core: clone VM from snapshot - validate VirtIO-SCSI ......................................................................
core: clone VM from snapshot - validate VirtIO-SCSI Validate whether VirtIO-SCSI can be disabled when cloning a VM from snapshot (similar to the validation on UpdateVmCommand): * Added a validation method to VmValidator. * Added appropriate tests. Change-Id: I31d4ebe3a964fb54cb1a905460b9da785a746419 Bug-Url: https://bugzilla.redhat.com/1133475 Signed-off-by: Daniel Erez <de...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/VmValidatorTest.java 6 files changed, 141 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/31945/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java index 577264f..937d8c6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java @@ -3,6 +3,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddVmFromSnapshotParameters; import org.ovirt.engine.core.common.action.LockProperties; @@ -128,6 +129,12 @@ return false; } + VmValidator vmValidator = createVmValidator(vmFromConfiguration); + if (Boolean.FALSE.equals(getParameters().isVirtioScsiEnabled()) && + !validate(vmValidator.canDisableVirtioScsi(getDiskImagesFromConfiguration()))) { + return false; + } + if (!super.canDoAction()) { return false; } @@ -243,4 +250,8 @@ protected void updateOriginalTemplate(VmStatic vmStatic) { // do not update it - it is already correctly configured from the snapshot } + + public VmValidator createVmValidator(VM vm) { + return new VmValidator(vm); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java index ede5e36..1aadd5b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java @@ -19,6 +19,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; +import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.bll.validator.VmWatchdogValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; @@ -34,7 +35,6 @@ import org.ovirt.engine.core.common.action.WatchdogParameters; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.Disk; -import org.ovirt.engine.core.common.businessentities.DiskInterface; import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.Snapshot; import org.ovirt.engine.core.common.businessentities.VM; @@ -539,13 +539,9 @@ } } - if (Boolean.FALSE.equals(getParameters().isVirtioScsiEnabled())) { - List<Disk> allDisks = getDiskDao().getAllForVm(getVmId(), true); - for (Disk disk : allDisks) { - if (disk.getDiskInterface() == DiskInterface.VirtIO_SCSI) { - return failCanDoAction(VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS); - } - } + VmValidator vmValidator = createVmValidator(vmFromParams); + if (Boolean.FALSE.equals(getParameters().isVirtioScsiEnabled()) && !validate(vmValidator.canDisableVirtioScsi(null))) { + return false; } if (vmFromParams.getMinAllocatedMem() > vmFromParams.getMemSizeMb()) { @@ -746,4 +742,7 @@ return getParameters().getWatchdog() != null; } + public VmValidator createVmValidator(VM vm) { + return new VmValidator(vm); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java index b7ca766..8e78830 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/VmValidator.java @@ -1,20 +1,25 @@ package org.ovirt.engine.core.bll.validator; +import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.Predicate; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ImagesHandler; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.BaseDisk; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.DiskInterface; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.DiskDao; /** A Validator for various VM canDoAction needs */ public class VmValidator { @@ -170,7 +175,34 @@ return ValidationResult.VALID; } - private DbFacade getDbFacade() { + /** + * Determines whether VirtIO-SCSI can be disabled for the VM + * (can be disabled when no disk uses VirtIO-SCSI interface). + */ + public ValidationResult canDisableVirtioScsi(Collection<? extends Disk> vmDisks) { + if (vmDisks == null) { + vmDisks = getDiskDao().getAllForVm(vms.iterator().next().getId(), true); + } + + boolean isVirtioScsiDiskExists = CollectionUtils.exists(vmDisks, new Predicate() { + @Override + public boolean evaluate(Object disk) { + return ((Disk) disk).getDiskInterface() == DiskInterface.VirtIO_SCSI; + } + }); + + if (isVirtioScsiDiskExists) { + return new ValidationResult(VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS); + } + + return ValidationResult.VALID; + } + + public DiskDao getDiskDao() { + return getDbFacade().getDiskDao(); + } + + public DbFacade getDbFacade() { return DbFacade.getInstance(); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java index 67f7d9d..ba66f30 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java @@ -8,6 +8,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -15,16 +16,22 @@ import org.mockito.stubbing.Answer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; +import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.action.AddVmFromSnapshotParameters; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.DiskInterface; import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.common.businessentities.Snapshot; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.compat.Guid; @@ -35,6 +42,8 @@ * The command under test. */ protected AddVmFromSnapshotCommand<AddVmFromSnapshotParameters> command; + + private SnapshotsValidator snapshotsValidator; @Test public void validateSpaceAndThreshold() { @@ -71,6 +80,32 @@ assertFalse(command.validateSpaceRequirements()); } + @Test + public void testCannotDisableVirtioScsi() { + initCommand(); + command.getParameters().setVirtioScsiEnabled(false); + + doReturn(snapshotsValidator).when(command).createSnapshotsValidator(); + doReturn(ValidationResult.VALID).when(snapshotsValidator).snapshotExists(any(Snapshot.class)); + doReturn(ValidationResult.VALID).when(snapshotsValidator).vmNotDuringSnapshot(any(Guid.class)); + + VM vm = new VM(); + Snapshot snapshot = new Snapshot(); + doReturn(vm).when(command).getVmFromConfiguration(); + doReturn(snapshot).when(command).getSnapshot(); + + DiskImage disk = new DiskImage(); + disk.setDiskInterface(DiskInterface.VirtIO_SCSI); + disk.setPlugged(true); + doReturn(Collections.singletonList(disk)).when(command).getDiskImagesFromConfiguration(); + + VmValidator vmValidator = spy(new VmValidator(vm)); + doReturn(vmValidator).when(command).createVmValidator(vm); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, + VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS); + } + @Override protected List<DiskImage> createDiskSnapshot(Guid diskId, int numOfImages) { List<DiskImage> disksList = new ArrayList<>(); @@ -104,5 +139,6 @@ generateStorageToDisksMap(command); initDestSDs(command); storageDomainValidator = mock(StorageDomainValidator.class); + snapshotsValidator = mock(SnapshotsValidator.class); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java index 71f0292..9cb499f 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java @@ -23,6 +23,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmManagementParametersBase; import org.ovirt.engine.core.common.businessentities.ArchitectureType; @@ -283,6 +284,10 @@ mockDiskDaoGetAllForVm(Collections.singletonList(disk), true); + VmValidator vmValidator = spy(new VmValidator(vm)); + doReturn(vmValidator).when(command).createVmValidator(vm); + doReturn(diskDAO).when(vmValidator).getDiskDao(); + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/VmValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/VmValidatorTest.java new file mode 100644 index 0000000..6022861 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/VmValidatorTest.java @@ -0,0 +1,49 @@ +package org.ovirt.engine.core.bll.validator; + +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.spy; +import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith; +import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid; + +import java.util.Collections; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.common.businessentities.Disk; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.DiskInterface; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.errors.VdcBllMessages; + +@RunWith(MockitoJUnitRunner.class) +public class VmValidatorTest { + + private VmValidator validator; + + private VM vm; + + @Before + public void setup() { + vm = new VM(); + validator = spy(new VmValidator(vm)); + } + + @Test + public void canDisableVirtioScsiSuccess() { + Disk disk = new DiskImage(); + disk.setDiskInterface(DiskInterface.VirtIO); + + assertThat(validator.canDisableVirtioScsi(Collections.singletonList(disk)), isValid()); + } + + @Test + public void canDisableVirtioScsiFail() { + Disk disk = new DiskImage(); + disk.setDiskInterface(DiskInterface.VirtIO_SCSI); + + assertThat(validator.canDisableVirtioScsi(Collections.singletonList(disk)), + failsWith(VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS)); + } +} -- To view, visit http://gerrit.ovirt.org/31945 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I31d4ebe3a964fb54cb1a905460b9da785a746419 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches