package org.ovirt.engine.core.bll;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Collections;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner.Strict;
import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
import org.ovirt.engine.core.bll.validator.VmValidator;
import org.ovirt.engine.core.common.action.AddVmFromSnapshotParameters;
import org.ovirt.engine.core.common.businessentities.Snapshot;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.DiskInterface;
import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
@RunWith(Strict.class)
public class AddVmFromSnapshotCommandTest extends AddVmCommandTestBase<AddVmFromSnapshotCommand<AddVmFromSnapshotParameters>> {
private static final Guid SOURCE_SNAPSHOT_ID = Guid.newGuid();
@Spy
private SnapshotsValidator snapshotsValidator;
@Override
protected AddVmFromSnapshotCommand<AddVmFromSnapshotParameters> createCommand() {
initVM();
AddVmFromSnapshotParameters param = new AddVmFromSnapshotParameters();
param.setVm(vm);
param.setSourceSnapshotId(SOURCE_SNAPSHOT_ID);
param.setStorageDomainId(Guid.newGuid());
AddVmFromSnapshotCommand<AddVmFromSnapshotParameters> cmd = new AddVmFromSnapshotCommand<>(param, null);
cmd.setVm(vm);
cmd.setVmId(vm.getId());
return cmd;
}
@Override
public void setUp() {
super.setUp();
generateStorageToDisksMap();
initDestSDs();
}
@Test
public void validateSpaceAndThreshold() {
mockGetAllSnapshots();
assertTrue(cmd.validateSpaceRequirements());
verify(storageDomainValidator, times(TOTAL_NUM_DOMAINS)).hasSpaceForClonedDisks(anyList());
verify(storageDomainValidator, never()).hasSpaceForNewDisks(anyList());
}
@Test
public void validateSpaceNotEnough() throws Exception {
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).
when(storageDomainValidator).hasSpaceForClonedDisks(anyList());
mockGetAllSnapshots();
assertFalse(cmd.validateSpaceRequirements());
//The following is mocked to fail, should happen only once.
verify(storageDomainValidator).hasSpaceForClonedDisks(anyList());
verify(storageDomainValidator, never()).hasSpaceForNewDisks(anyList());
}
@Test
public void validateSpaceNotWithinThreshold() throws Exception {
doReturn(new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).
when(storageDomainValidator).isDomainWithinThresholds();
assertFalse(cmd.validateSpaceRequirements());
}
@Test
public void testCannotDisableVirtioScsiCanDisableIDE() {
cmd.getParameters().setVirtioScsiEnabled(false);
VM vm = new VM();
doReturn(vm).when(cmd).getVmFromConfiguration();
DiskImage disk = new DiskImage();
disk.setPlugged(true);
DiskVmElement dve = new DiskVmElement(disk.getId(), vm.getId());
dve.setDiskInterface(DiskInterface.VirtIO_SCSI);
disk.setDiskVmElements(Collections.singletonList(dve));
doReturn(Collections.singletonList(disk)).when(cmd).getAdjustedDiskImagesFromConfiguration();
VmValidator vmValidator = spy(new VmValidator(vm));
doReturn(vmValidator).when(cmd).createVmValidator(vm);
assertFalse(cmd.checkCanDisableVirtIoScsi());
ValidateTestUtils.assertValidationMessages("Validation should prevent disabling of virtIO-scsi.",
cmd,
EngineMessage.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS);
dve.setDiskInterface(DiskInterface.IDE);
assertTrue(cmd.checkCanDisableVirtIoScsi());
}
@Test
public void canAddCloneVmFromSnapshotSnapshotDoesNotExist() {
cmd.getVm().setName("vm1");
ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST);
}
@Test
public void canAddCloneVmFromSnapshotNoConfiguration() {
cmd.getVm().setName("vm1");
doReturn(null).when(cmd).getVmFromConfiguration();
doReturn(ValidationResult.VALID).when(snapshotsValidator).vmNotDuringSnapshot(any());
when(snapshotDao.get(SOURCE_SNAPSHOT_ID)).thenReturn(new Snapshot());
ValidateTestUtils.runAndAssertValidateFailure
(cmd, EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_HAS_NO_CONFIGURATION);
}
}