package org.ovirt.engine.core.bll.storage; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.ovirt.engine.core.bll.utils.VersionSupport; import org.ovirt.engine.core.common.action.StoragePoolManagementParameter; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.storage_domain_static; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.StorageDomainStaticDAO; import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.VdsGroupDAO; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @PrepareForTest({DbFacade.class, Config.class}) @RunWith(PowerMockRunner.class) public class UpdateStoragePoolCommandTest { private static final Version VERSION_1_0 = new Version(1, 0); private static final Version VERSION_1_1 = new Version(1, 1); private static final Version VERSION_1_2 = new Version(1, 2); private static final Version VERSION_2_0 = new Version(2, 0); private UpdateStoragePoolCommand cmd; @Mock private DbFacade facade; @Mock private StoragePoolDAO spDao; @Mock private StorageDomainStaticDAO sdDao; @Mock private List<storage_domain_static> sdList; @Mock private VdsGroupDAO vdsDao; @Before public void setUp() { initMocks(this); mockStatic(DbFacade.class); mockStatic(Config.class); when(DbFacade.getInstance()).thenReturn(facade); when(facade.getStoragePoolDAO()).thenReturn(spDao); when(facade.getStorageDomainStaticDAO()).thenReturn(sdDao); when(facade.getVdsGroupDAO()).thenReturn(vdsDao); when(Config.GetValue(ConfigValues.StoragePoolNameSizeLimit)).thenReturn(10); when(Config.GetValue(ConfigValues.SupportedClusterLevels)).thenReturn(createVersionSet()); when(spDao.get(any(Guid.class))).thenReturn(createDefaultStoragePool()); when(sdDao.getAllForStoragePool(any(Guid.class))).thenReturn(sdList); when(vdsDao.getAllForStoragePool(any(Guid.class))).thenReturn(createClusterList()); cmd = new UpdateStoragePoolCommand<StoragePoolManagementParameter>( new StoragePoolManagementParameter(createNewStoragePool())); } @Test public void happyPath() { assertTrue(cmd.canDoAction()); } @Test public void nameExists() { newPoolNameIsAlreadyTaken(); canDoActionFailed(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NAME_ALREADY_EXIST.toString()); } @Test public void hasDomains() { domainListNotEmpty(); canDoActionFailed(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_POOL_TYPE_WITH_DOMAINS.toString()); } @Test public void unsupportedVersion() { storagePoolWithInvalidVersion(); canDoActionFailed(VersionSupport.getUnsupportedVersionMessage()); } @Test public void lowerVersion() { storagePoolWithLowerVersion(); canDoActionFailed(VdcBllMessages.ACTION_TYPE_FAILED_CANNOT_DECREASE_COMPATIBILITY_VERSION.toString()); } @Test public void versionHigherThanCluster() { storagePoolWithVersionHigherThanCluster(); canDoActionFailed( VdcBllMessages.ERROR_CANNOT_UPDATE_STORAGE_POOL_COMPATIBILITY_VERSION_BIGGER_THAN_CLUSTERS.toString()); } @Test public void poolHasDefaultCluster() { addDefaultClusterToPool(); storagePoolWithLocalFS(); canDoActionFailed( VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_WITH_DEFAULT_VDS_GROUP_CANNOT_BE_LOCALFS.toString()); } private void newPoolNameIsAlreadyTaken() { when(spDao.get(any(Guid.class))).thenReturn(new storage_pool("foo", Guid.Empty, "foo", StorageType.NFS.getValue(), StoragePoolStatus.Up.getValue())); when(spDao.getByName(anyString())).thenReturn(createDefaultStoragePool()); } private void storagePoolWithVersionHigherThanCluster() { cmd = new UpdateStoragePoolCommand<StoragePoolManagementParameter>( new StoragePoolManagementParameter(createHigherVersionStoragePool())); } private void storagePoolWithLowerVersion() { cmd = new UpdateStoragePoolCommand<StoragePoolManagementParameter>( new StoragePoolManagementParameter(createLowerVersionStoragePool())); } private void storagePoolWithInvalidVersion() { cmd = new UpdateStoragePoolCommand<StoragePoolManagementParameter>( new StoragePoolManagementParameter(createInvalidVersionStoragePool())); } private void storagePoolWithLocalFS() { cmd = new UpdateStoragePoolCommand<StoragePoolManagementParameter>( new StoragePoolManagementParameter(createDefaultStoragePool())); } private void domainListNotEmpty() { when(sdList.size()).thenReturn(1); } private Set<Version> createVersionSet() { Set<Version> versions = new HashSet<Version>(); versions.add(VERSION_1_0); versions.add(VERSION_1_1); versions.add(VERSION_1_2); return versions; } private storage_pool createNewStoragePool() { storage_pool pool = createBasicPool(); pool.setstorage_pool_type(StorageType.NFS); pool.setcompatibility_version(VERSION_1_1); return pool; } private storage_pool createDefaultStoragePool() { storage_pool pool = createBasicPool(); pool.setstorage_pool_type(StorageType.LOCALFS); pool.setcompatibility_version(VERSION_1_1); return pool; } private storage_pool createLowerVersionStoragePool() { storage_pool pool = createBasicPool(); pool.setstorage_pool_type(StorageType.LOCALFS); pool.setcompatibility_version(VERSION_1_0); return pool; } private storage_pool createBasicPool() { storage_pool pool = new storage_pool(); pool.setId(Guid.NewGuid()); pool.setname("Default"); return pool; } private storage_pool createHigherVersionStoragePool() { storage_pool pool = createBasicPool(); pool.setstorage_pool_type(StorageType.LOCALFS); pool.setcompatibility_version(VERSION_1_2); return pool; } private storage_pool createInvalidVersionStoragePool() { storage_pool pool = createBasicPool(); pool.setstorage_pool_type(StorageType.LOCALFS); pool.setcompatibility_version(VERSION_2_0); return pool; } private List<VDSGroup> createClusterList() { List<VDSGroup> clusters = new ArrayList<VDSGroup>(); VDSGroup cluster = new VDSGroup(); cluster.setcompatibility_version(VERSION_1_0); clusters.add(cluster); return clusters; } private void addDefaultClusterToPool() { VDSGroup defaultCluster = new VDSGroup(); defaultCluster.setcompatibility_version(VERSION_1_1); defaultCluster.setID(VDSGroup.DEFAULT_VDS_GROUP_ID); List<VDSGroup> clusters = new ArrayList<VDSGroup>(); clusters.add(defaultCluster); when(vdsDao.getAllForStoragePool(any(Guid.class))).thenReturn(clusters); } private void canDoActionFailed(final String reason) { assertFalse(cmd.canDoAction()); assertTrue(cmd.getReturnValue().getCanDoActionMessages().contains(reason)); } }