package org.ovirt.engine.core.bll.storage.disk;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.ovirt.engine.core.bll.BaseCommandTest;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.common.action.RemoveDiskParameters;
import org.ovirt.engine.core.common.businessentities.OriginType;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmDeviceId;
import org.ovirt.engine.core.common.businessentities.VmEntityType;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskContentType;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
import org.ovirt.engine.core.common.businessentities.storage.LunDisk;
import org.ovirt.engine.core.common.constants.StorageConstants;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.DiskImageDao;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.VmDeviceDao;
/** A test case for {@link RemoveDiskCommandTest} */
public class RemoveDiskCommandTest extends BaseCommandTest {
@Mock
private VmDao vmDao;
@Mock
private VmDeviceDao vmDeviceDao;
@Mock
private DiskImageDao diskImageDao;
private Guid diskId = Guid.newGuid();
private Disk disk;
private VM vm;
@Spy
@InjectMocks
private RemoveDiskCommand<RemoveDiskParameters> cmd =
new RemoveDiskCommand<>(new RemoveDiskParameters(diskId), null);
@Before
public void setUp() {
disk = new DiskImage();
setupDisk();
Guid vmId = Guid.newGuid();
vm = new VM();
vm.setId(vmId);
VmDeviceId vmDeviceId = new VmDeviceId(diskId, vmId);
VmDevice vmDevice = new VmDevice();
vmDevice.setId(vmDeviceId);
vmDevice.setPlugged(true);
when(vmDao.getVmsListForDisk(diskId, Boolean.TRUE)).thenReturn(Collections.singletonList(vm));
when(vmDeviceDao.get(vmDeviceId)).thenReturn(vmDevice);
doReturn(disk).when(cmd).getDisk();
}
protected void setupDisk() {
disk.setId(diskId);
disk.setVmEntityType(VmEntityType.VM);
}
/* Tests for validate() flow */
@Test
public void testValidateFlowImageDoesNotExist() {
doReturn(null).when(cmd).getDisk();
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST);
}
@Test
public void testValidateVmUp() {
vm.setStatus(VMStatus.Up);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN);
}
@Test
public void testValidateTemplateEntity() {
disk.setVmEntityType(VmEntityType.TEMPLATE);
StorageDomain domain = new StorageDomain();
domain.setId(Guid.newGuid());
domain.setStatus(StorageDomainStatus.Active);
cmd.getParameters().setStorageDomainId(domain.getId());
ArrayList<Guid> storageIds = new ArrayList<>();
storageIds.add(domain.getId());
storageIds.add(Guid.newGuid());
((DiskImage)disk).setStorageIds(storageIds);
doReturn(domain).when(cmd).getStorageDomain();
doReturn(new VmTemplate()).when(cmd).getVmTemplate();
doReturn(true).when(cmd).checkDerivedDisksFromDiskNotExist(any(DiskImage.class));
doReturn(disk).when(diskImageDao).get(any(Guid.class));
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
@Test
public void testValidateTemplateWithNoDomain() {
disk.setVmEntityType(VmEntityType.TEMPLATE);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_CANT_DELETE_TEMPLATE_DISK_WITHOUT_SPECIFYING_DOMAIN);
}
@Test
public void testValidateOvfDiskNotIllegal() {
((DiskImage)disk).setImageStatus(ImageStatus.OK);
disk.setContentType(DiskContentType.OVF_STORE);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_OVF_DISK_NOT_IN_APPLICABLE_STATUS);
}
@Test
public void testPreImportedHostedEngineLunDiskRemove() {
disk = new LunDisk();
setupDisk();
disk.setDiskAlias(StorageConstants.HOSTED_ENGINE_LUN_DISK_ALIAS);
doReturn(disk).when(cmd).getDisk();
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
@Test
public void testImportedHostedEngineLunDiskRemove() {
vm.setOrigin(OriginType.MANAGED_HOSTED_ENGINE);
vm.setStatus(VMStatus.Up);
disk = new LunDisk();
setupDisk();
disk.setDiskAlias(StorageConstants.HOSTED_ENGINE_LUN_DISK_ALIAS);
doReturn(disk).when(cmd).getDisk();
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
@Test
public void testImportedHostedEngineImageDiskRemove() {
vm.setOrigin(OriginType.MANAGED_HOSTED_ENGINE);
vm.setStatus(VMStatus.Up);
doReturn(disk).when(cmd).getDisk();
ValidateTestUtils.runAndAssertValidateFailure(
cmd,
EngineMessage.ACTION_TYPE_FAILED_HOSTED_ENGINE_DISK);
}
}