package org.ovirt.engine.core.bll.storage.pool; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.ovirt.engine.core.bll.BaseCommandTest; import org.ovirt.engine.core.bll.ValidateTestUtils; import org.ovirt.engine.core.bll.validator.storage.StoragePoolValidator; import org.ovirt.engine.core.common.action.ReconstructMasterParameters; 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.StoragePoolIsoMap; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.StoragePoolIsoMapDao; public class ReconstructMasterDomainCommandTest extends BaseCommandTest { @Mock private StoragePoolIsoMapDao storagePoolIsoMapDao; private ReconstructMasterDomainCommand<ReconstructMasterParameters> cmd; private Guid storagePoolId = Guid.newGuid(); private Guid masterStorageDomainId = Guid.newGuid(); private Guid regularStorageDomainId = Guid.newGuid(); private StoragePool storagePool; private StorageDomain masterStorageDomain; private StoragePoolIsoMap masterDomainIsoMap; private StoragePoolIsoMap regularDomainIsoMap; private StoragePoolValidator storagePoolValidator; @Before public void setUp() { cmd = spy(new ReconstructMasterDomainCommand<>(new ReconstructMasterParameters(), null)); initializeStorageDomains(); initializeStoragePool(); initializeStoragePoolValidator(); doReturn(true).when(cmd).initializeVds(); } private void initializeStorageDomains() { masterDomainIsoMap = new StoragePoolIsoMap(masterStorageDomainId, storagePoolId, StorageDomainStatus.Active); regularDomainIsoMap = new StoragePoolIsoMap(regularStorageDomainId, storagePoolId, StorageDomainStatus.Active); masterStorageDomain = new StorageDomain(); masterStorageDomain.setStoragePoolIsoMapData(masterDomainIsoMap); doReturn(masterStorageDomain).when(cmd).getStorageDomain(); } private void initializeStoragePool() { storagePool = new StoragePool(); storagePool.setId(storagePoolId); doReturn(Arrays.asList(masterDomainIsoMap, regularDomainIsoMap)).when(storagePoolIsoMapDao).getAllForStoragePool(storagePoolId); doReturn(storagePool).when(cmd).getStoragePool(); } private void initializeStoragePoolValidator() { storagePoolValidator = spy(new StoragePoolValidator(storagePool)); doReturn(storagePoolIsoMapDao).when(storagePoolValidator).getStoragePoolIsoMapDao(); doReturn(storagePoolValidator).when(cmd).createStoragePoolValidator(); } private void validateDomainInProcess(StorageDomainStatus masterStatus, StorageDomainStatus regularStatus, StorageDomainStatus expectedStatus) { masterDomainIsoMap.setStatus(masterStatus); regularDomainIsoMap.setStatus(regularStatus); ValidateTestUtils.runAndAssertValidateFailure(cmd, EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2); List<String> messages = cmd.getReturnValue().getValidationMessages(); assertEquals(messages.get(0), EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2.toString()); assertEquals(messages.get(1), String.format("$status %1$s", expectedStatus)); } @Test public void testValidateMasterLocked() { validateDomainInProcess(StorageDomainStatus.Locked, StorageDomainStatus.Active, StorageDomainStatus.Locked); } @Test public void testValidateMasterPreparingForMaintenance() { validateDomainInProcess(StorageDomainStatus.PreparingForMaintenance, StorageDomainStatus.Active, StorageDomainStatus.PreparingForMaintenance); } @Test public void testValidateRegularLocked() { validateDomainInProcess(StorageDomainStatus.Active, StorageDomainStatus.Locked, StorageDomainStatus.Locked); } @Test public void testValidateRegularPreparingForMaintenance() { validateDomainInProcess(StorageDomainStatus.Active, StorageDomainStatus.PreparingForMaintenance, StorageDomainStatus.PreparingForMaintenance); } @Test public void testValidateSuccess() { ValidateTestUtils.runAndAssertValidateSuccess(cmd); } }