package org.ovirt.engine.core.bll.storage.domain;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import java.util.Collections;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.ovirt.engine.core.bll.BaseCommandTest;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
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.StoragePoolDao;
import org.ovirt.engine.core.dao.VdsDao;
public class ActivateStorageDomainCommandTest extends BaseCommandTest {
@Mock
private StorageDomainDao storageDomainDao;
@Mock
private StoragePoolDao storagePoolDao;
@Mock
private VdsDao vdsDao;
@InjectMocks
private ActivateStorageDomainCommand<StorageDomainPoolParametersBase> cmd =
new ActivateStorageDomainCommand<>(new StorageDomainPoolParametersBase(Guid.newGuid(), Guid.newGuid()), null);
@Test
public void internalLockedAllowed() {
internalActionAllowed(StorageDomainStatus.Locked);
}
@Test
public void nonInternalLockedDisallowed() {
testExecution(StorageDomainStatus.Locked);
ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED);
}
@Test
public void internalInactiveAllowed() {
internalActionAllowed(StorageDomainStatus.Inactive);
}
@Test
public void nonInternalInactiveAllowed() {
nonInternalActionAllowed(StorageDomainStatus.Inactive);
}
@Test
public void nonInternalActiveDisallowed() {
testExecution(StorageDomainStatus.Active);
testActionDisallowed();
}
@Test
public void internalActiveDisallowed() {
testInternalExecution(StorageDomainStatus.Active);
testActionDisallowed();
}
@Test
public void internalUnknownAllowed() {
internalActionAllowed(StorageDomainStatus.Unknown);
}
@Test
public void nonInternalUnknownAllowed() {
nonInternalActionAllowed(StorageDomainStatus.Unknown);
}
@Test
public void internalMaintenanceAllowed() {
internalActionAllowed(StorageDomainStatus.Maintenance);
}
@Test
public void nonInternalMaintenanceAllowed() {
nonInternalActionAllowed(StorageDomainStatus.Maintenance);
}
@Test
public void internalPreparingForMaintenanceAllowed() {
internalActionAllowed(StorageDomainStatus.PreparingForMaintenance);
}
@Test
public void nonInternalPreparingForMaintenanceAllowed() {
nonInternalActionAllowed(StorageDomainStatus.PreparingForMaintenance);
}
@Test
public void nonActiveVdsDisallowed() {
testNonActiveVdsExecution(StorageDomainStatus.Maintenance);
ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.ACTION_TYPE_FAILED_NO_VDS_IN_POOL);
}
private void testActionAllowed() {
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
private void testActionDisallowed() {
ValidateTestUtils.runAndAssertValidateFailure
(cmd, EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2);
}
public void internalActionAllowed(StorageDomainStatus status) {
testInternalExecution(status);
testActionAllowed();
}
public void nonInternalActionAllowed(StorageDomainStatus status) {
testExecution(status);
testActionAllowed();
}
private void testNonActiveVdsExecution(StorageDomainStatus status) {
createStorageDomain(status);
createUpStoragePool();
createCommand();
}
private void testInternalExecution(StorageDomainStatus status) {
testExecution(status);
setIsInternal();
}
private void testExecution(StorageDomainStatus status) {
createStorageDomain(status);
createUpStoragePool();
createUpVds();
createCommand();
}
private void createStorageDomain(StorageDomainStatus status) {
StorageDomain domain = new StorageDomain();
domain.setStatus(status);
domain.setId(Guid.newGuid());
when(storageDomainDao.get(any(Guid.class))).thenReturn(domain);
when(storageDomainDao.getForStoragePool(any(Guid.class), any(Guid.class))).thenReturn(domain);
}
private void createUpStoragePool() {
StoragePool pool = new StoragePool();
pool.setId(Guid.newGuid());
pool.setStatus(StoragePoolStatus.Up);
when(storagePoolDao.get(any(Guid.class))).thenReturn(pool);
}
private void createUpVds() {
when(vdsDao.getAllForStoragePoolAndStatus(any(Guid.class), eq(VDSStatus.Up)))
.thenReturn(Collections.singletonList(new VDS()));
}
private void createCommand() {
cmd.init();
}
private void setIsInternal() {
cmd.setInternalExecution(true);
}
}