package org.ovirt.engine.core.bll.storage.disk;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
import org.ovirt.engine.core.bll.validator.storage.DiskValidator;
import org.ovirt.engine.core.bll.validator.storage.DiskVmElementValidator;
import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
import org.ovirt.engine.core.common.action.AttachDetachVmDiskParameters;
import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.StorageDomainDao;
import org.ovirt.engine.core.dao.StoragePoolIsoMapDao;
import org.ovirt.engine.core.dao.VmDeviceDao;
@RunWith(MockitoJUnitRunner.class)
public class AttachDiskToVmCommandTest {
private Guid vmId = Guid.newGuid();
private Guid diskId = Guid.newGuid();
private Guid storageId = Guid.newGuid();
@Mock
private VmDeviceDao vmDeviceDao;
@Mock
private StorageDomainDao storageDomainDao;
@Mock
private StoragePoolIsoMapDao storagePoolIsoMapDao;
@Mock
private DiskValidator diskValidator;
@Mock
private DiskVmElementValidator diskVmElementValidator;
@Mock
private StorageDomainValidator storageDomainValidator;
@Mock
private SnapshotsValidator snapshotsValidator;
@Mock
private DiskHandler diskHandler;
private AttachDetachVmDiskParameters parameters = createParameters();
@Spy
@InjectMocks
private AttachDiskToVmCommand<AttachDetachVmDiskParameters> command = new AttachDiskToVmCommand<>(parameters, null);
@Before
public void initTest() {
initialSetup();
initCommand();
}
private void initialSetup() {
mockValidators();
doNothing().when(command).updateDisksFromDb();
doReturn(mockVm()).when(command).getVm();
doReturn(createDiskImage()).when(diskHandler).loadActiveDisk(any());
doReturn(createDiskImage()).when(diskHandler).loadDiskFromSnapshot(any(), any());
doReturn(true).when(command).isDiskPassPciAndIdeLimit();
doReturn(true).when(command).checkDiskUsedAsOvfStore(diskValidator);
doReturn(false).when(command).isOperationPerformedOnDiskSnapshot();
mockStoragePoolIsoMap();
}
private void initCommand() {
command.init();
}
@Test
public void testValidateSucceed() {
ValidateTestUtils.runAndAssertValidateSuccess(command);
}
@Test
public void testValidateSucceedReadOnlyWithInterface() {
ValidateTestUtils.runAndAssertValidateSuccess(command);
verify(diskVmElementValidator).isReadOnlyPropertyCompatibleWithInterface();
}
@Test
public void testValidateFailReadOnlyOnInterface() {
when(diskVmElementValidator.isReadOnlyPropertyCompatibleWithInterface()).thenReturn(
new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR));
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR);
verify(diskVmElementValidator).isReadOnlyPropertyCompatibleWithInterface();
}
@Test
public void testValidateFailsWhenDiscardIsNotSupported() {
when(diskVmElementValidator.isPassDiscardSupported(any())).thenReturn(
new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PASS_DISCARD_NOT_SUPPORTED_BY_DISK_INTERFACE));
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_PASS_DISCARD_NOT_SUPPORTED_BY_DISK_INTERFACE);
}
private AttachDetachVmDiskParameters createParameters() {
AttachDetachVmDiskParameters parameters = new AttachDetachVmDiskParameters(new DiskVmElement(diskId, vmId));
parameters.setReadOnly(true);
return parameters;
}
private VM mockVm() {
VM vm = new VM();
vm.setStatus(VMStatus.Down);
vm.setStoragePoolId(Guid.newGuid());
vm.setId(vmId);
return vm;
}
private void mockStorageDomainValidator() {
doReturn(storageDomainValidator).when(command).getStorageDomainValidator(any());
}
private void mockDiskValidator() {
doReturn(diskValidator).when(command).getDiskValidator(any());
doReturn(diskVmElementValidator).when(command).getDiskVmElementValidator(any(), any());
}
private void mockValidators() {
mockStorageDomainValidator();
mockDiskValidator();
}
private void mockStoragePoolIsoMap() {
StoragePoolIsoMap spim = new StoragePoolIsoMap();
when(storagePoolIsoMapDao.get(any())).thenReturn(spim);
}
private DiskImage createDiskImage() {
DiskImage disk = new DiskImage();
disk.setId(diskId);
Collections.singletonList(storageId);
disk.setStorageIds(new ArrayList<>(Collections.singletonList(storageId)));
return disk;
}
}