package org.ovirt.engine.core.bll; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.junit.Rule; 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.network.cluster.DefaultManagementNetworkFinder; import org.ovirt.engine.core.bll.scheduling.SchedulingManager; import org.ovirt.engine.core.bll.validator.InClusterUpgradeValidator; import org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters; import org.ovirt.engine.core.common.businessentities.AdditionalFeature; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.scheduling.ClusterPolicy; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.ClusterDao; import org.ovirt.engine.core.dao.ClusterFeatureDao; import org.ovirt.engine.core.dao.StoragePoolDao; import org.ovirt.engine.core.dao.SupportedHostFeatureDao; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.VmNumaNodeDao; import org.ovirt.engine.core.dao.VmStaticDao; import org.ovirt.engine.core.dao.VmTemplateDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.utils.MockConfigRule; @RunWith(MockitoJUnitRunner.class) public class UpdateClusterCommandTest { 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 Guid DC_ID1 = Guid.newGuid(); private static final Guid DC_ID2 = Guid.newGuid(); private static final Guid DEFAULT_CLUSTER_ID = new Guid("99408929-82CF-4DC7-A532-9D998063FA95"); private static final Guid DEFAULT_FEATURE_ID = new Guid("99408929-82CF-4DC7-A532-9D998063FA96"); private static final Guid TEST_MANAGEMENT_NETWORK_ID = Guid.newGuid(); private static final Guid NOT_UPGRADE_POLICY_GUID = Guid.newGuid(); private static final Guid VM_ID1 = new Guid("77296e00-0cad-4e5a-9299-008a7b6f4355"); private static final Guid VM_ID2 = new Guid("87296e00-0cad-4e5a-9299-008a7b6f4355"); private static final Guid VM_ID3 = new Guid("67296e00-0cad-4e5a-9299-008a7b6f4355"); private static final Set<Version> versions = new HashSet<>(Arrays.asList(VERSION_1_0, VERSION_1_1, VERSION_1_2)); @Rule public MockConfigRule mcr = new MockConfigRule(mockConfig(ConfigValues.SupportedClusterLevels, versions)); @Mock DbFacade dbFacadeMock; @Mock private VmStaticDao vmStaticDao; @Mock private VmTemplateDao vmTemplateDao; @Mock private ClusterDao clusterDao; @Mock private VdsDao vdsDao; @Mock private StoragePoolDao storagePoolDao; @Mock private GlusterVolumeDao glusterVolumeDao; @Mock private VmDao vmDao; @Mock private NetworkDao networkDao; @Mock private ClusterFeatureDao clusterFeatureDao; @Mock private SupportedHostFeatureDao hostFeatureDao; @Mock private DefaultManagementNetworkFinder defaultManagementNetworkFinder; @Mock private CpuFlagsManagerHandler cpuFlagsManagerHandler; @Mock private SchedulingManager schedulingManager; @Mock private InClusterUpgradeValidator inClusterUpgradeValidator; @Mock private VmNumaNodeDao vmNumaNodeDao; @Mock private Network mockManagementNetwork = createManagementNetwork(); private Guid managementNetworkId; private Network createManagementNetwork() { final Network network = new Network(); network.setId(TEST_MANAGEMENT_NETWORK_ID); return network; } @Spy @InjectMocks private UpdateClusterCommand<ManagementNetworkOnClusterOperationParameters> cmd = new UpdateClusterCommand<>(new ManagementNetworkOnClusterOperationParameters(), null); @Test public void nameInUse() { createSimpleCommand(); createCommandWithDifferentName(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_DO_ACTION_NAME_IN_USE); } @Test public void invalidCluster() { createSimpleCommand(); when(clusterDao.get(any())).thenReturn(null); validateFailedWithReason(EngineMessage.VDS_CLUSTER_IS_NOT_VALID); } @Test public void legalArchitectureChange() { createCommandWithDefaultCluster(); cpuExists(); architectureIsUpdatable(); initAndAssertValidation(true); } private void initAndAssertValidation(boolean value) { cmd.init(); assertThat(cmd.validate(), is(value)); } @Test public void illegalArchitectureChange() { createCommandWithDefaultCluster(); clusterHasVMs(); cpuExists(); architectureIsNotUpdatable(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_ARCHITECTURE_ILLEGAL); } @Test public void illegalCpuUpdate() { createCommandWithDifferentCpuName(); cpuIsNotUpdatable(); cpuManufacturersMatch(); cpuExists(); clusterHasVMs(); clusterHasVds(); architectureIsUpdatable(); validateFailedWithReason(EngineMessage.CLUSTER_CPU_IS_NOT_UPDATABLE); } @Test public void legalCpuUpdate() { createCommandWithDifferentCpuName(); cpuExists(); architectureIsUpdatable(); initAndAssertValidation(true); } private void cpuIsNotUpdatable() { doReturn(false).when(cmd).isCpuUpdatable(any()); } @Test public void invalidCpuSelection() { createCommandWithDefaultCluster(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_CPU_NOT_FOUND); } @Test public void illegalCpuChange() { createCommandWithDefaultCluster(); cpuExists(); cpuManufacturersDontMatch(); clusterHasVds(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_ILLEGAL); } @Test public void invalidVersion() { createCommandWithInvalidVersion(); setupCpu(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_GIVEN_VERSION_NOT_SUPPORTED); } @Test public void versionDecreaseWithHost() { createCommandWithOlderVersion(); setupCpu(); vdsExist(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_CANNOT_DECREASE_CLUSTER_WITH_HOSTS_COMPATIBILITY_VERSION); } @Test public void versionDecreaseNoHostsOrNetwork() { createCommandWithOlderVersion(); setupCpu(); when(storagePoolDao.get(any())).thenReturn(createStoragePoolLocalFS()); initAndAssertValidation(true); } @Test public void versionDecreaseLowerVersionThanDC() { createCommandWithOlderVersion(); when(storagePoolDao.get(any())).thenReturn(createStoragePoolLocalFSOldVersion()); setupCpu(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_CANNOT_DECREASE_COMPATIBILITY_VERSION_UNDER_DC); } @Test public void updateWithLowerVersionThanHosts() { createCommandWithDefaultCluster(); setupCpu(); vdsExistWithHigherVersion(); architectureIsUpdatable(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_UPDATE_COMPATIBILITY_VERSION_WITH_LOWER_HOSTS); } @Test public void updateWithCpuLowerThanHost() { createCommandWithDefaultCluster(); setupCpu(); clusterHasVds(); cpuFlagsMissing(); architectureIsUpdatable(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_WITH_LOWER_HOSTS); } @Test public void updateStoragePool() { createCommandWithDifferentPool(); setupCpu(); clusterHasVds(); cpuFlagsNotMissing(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_CHANGE_STORAGE_POOL); } @Test public void clusterAlreadyInLocalFs() { newDefaultManagementNetworkFound(); createCommandWithDefaultCluster(); oldGroupIsDetachedDefault(); storagePoolIsLocalFS(); setupCpu(); storagePoolAlreadyHasCluster(); architectureIsUpdatable(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_ADD_MORE_THEN_ONE_HOST_TO_LOCAL_STORAGE); } @Test public void clusterMovesToDcWithNoDefaultManagementNetwork() { noNewDefaultManagementNetworkFound(); createCommandWithDefaultCluster(); oldGroupIsDetachedDefault(); setupCpu(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_DEFAULT_MANAGEMENT_NETWORK_NOT_FOUND); } @Test public void detachedClusterMovesToDcWithNonExistentManagementNetwork() { managementNetworkNotFoundById(); createCommandWithDefaultCluster(); oldGroupIsDetachedDefault(); setupCpu(); validateFailedWithReason(EngineMessage.NETWORK_NOT_EXISTS); } @Test public void detachedClusterMovesToDcWithExistingManagementNetwork() { newDefaultManagementNetworkFound(); mcr.mockConfigValue(ConfigValues.AutoRegistrationDefaultClusterID, Guid.Empty); createCommandWithDefaultCluster(); oldGroupIsDetachedDefault(); setupCpu(); storagePoolIsLocalFS(); initAndAssertValidation(true); } private void managementNetworkNotFoundById() { managementNetworkId = TEST_MANAGEMENT_NETWORK_ID; when(networkDao.get(TEST_MANAGEMENT_NETWORK_ID)).thenReturn(null); } private void setupCpu() { cpuExists(); cpuManufacturersMatch(); } @Test public void defaultClusterInLocalFs() { newDefaultManagementNetworkFound(); mcr.mockConfigValue(ConfigValues.AutoRegistrationDefaultClusterID, DEFAULT_CLUSTER_ID); createCommandWithDefaultCluster(); oldGroupIsDetachedDefault(); storagePoolIsLocalFS(); setupCpu(); architectureIsUpdatable(); validateFailedWithReason(EngineMessage.DEFAULT_CLUSTER_CANNOT_BE_ON_LOCALFS); } private void newDefaultManagementNetworkFound() { managementNetworkId = null; when(defaultManagementNetworkFinder.findDefaultManagementNetwork(DC_ID1)). thenReturn(mockManagementNetwork); } private void noNewDefaultManagementNetworkFound() { managementNetworkId = null; when(defaultManagementNetworkFinder.findDefaultManagementNetwork(DC_ID1)). thenReturn(null); } @Test public void clusterWithNoCpu() { createCommandWithNoCpuName(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); initAndAssertValidation(true); } @Test public void clusterWithNoServiceEnabled() { createCommandWithNoService(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); cpuExists(); validateFailedWithReason(EngineMessage.CLUSTER_AT_LEAST_ONE_SERVICE_MUST_BE_ENABLED); } @Test public void clusterWithVirtGlusterServicesNotAllowed() { createCommandWithVirtGlusterEnabled(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); mcr.mockConfigValue(ConfigValues.AllowClusterWithVirtGlusterEnabled, Boolean.FALSE); cpuExists(); validateFailedWithReason(EngineMessage.CLUSTER_ENABLING_BOTH_VIRT_AND_GLUSTER_SERVICES_NOT_ALLOWED); } @Test public void disableVirtWhenVmsExist() { createCommandWithGlusterEnabled(); when(clusterDao.get(any())).thenReturn(createDefaultCluster()); cpuExists(); cpuFlagsNotMissing(); clusterHasVds(); clusterHasVMs(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_DISABLE_VIRT_WHEN_CLUSTER_CONTAINS_VMS); } @Test public void disableGlusterWhenVolumesExist() { createCommandWithVirtEnabled(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); cpuExists(); cpuFlagsNotMissing(); clusterHasGlusterVolumes(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_DISABLE_GLUSTER_WHEN_CLUSTER_CONTAINS_VOLUMES); } @Test public void enableNewAddtionalFeatureWhenHostDoesnotSupport() { createCommandWithAddtionalFeature(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); cpuExists(); cpuFlagsNotMissing(); clusterHasVds(); validateFailedWithReason(EngineMessage.CLUSTER_CANNOT_UPDATE_SUPPORTED_FEATURES_WITH_LOWER_HOSTS); } @Test public void enableNewAddtionalFeatureWhenHostSupports() { createCommandWithAddtionalFeature(); when(clusterDao.get(any())).thenReturn(createClusterWithNoCpuName()); cpuExists(); cpuFlagsNotMissing(); clusterHasVds(); when(hostFeatureDao.getSupportedHostFeaturesByHostId(any())).thenReturn(Collections.singleton("TEST_FEATURE")); initAndAssertValidation(true); } @Test public void shouldCheckIfClusterCanBeUpgraded() { createCommandWithDefaultCluster(); cpuExists(); architectureIsUpdatable(); cmd.getCluster().setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID); initAndAssertValidation(true); verify(inClusterUpgradeValidator, times(1)).isUpgradePossible(anyList(), anyList()); verify(inClusterUpgradeValidator, times(0)).isUpgradeDone(anyList()); } @Test public void shouldCheckIfClusterUpgradeIsDone() { createCommandWithDefaultCluster(); Cluster oldCluster = oldGroupFromDb(); cpuExists(); architectureIsUpdatable(); oldCluster.setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID); cmd.getCluster().setClusterPolicyId(NOT_UPGRADE_POLICY_GUID); initAndAssertValidation(true); verify(inClusterUpgradeValidator, times(0)).isUpgradePossible(anyList(), anyList()); verify(inClusterUpgradeValidator, times(1)).isUpgradeDone(anyList()); } @Test public void shouldStayInUpgradeMode() { createCommandWithDefaultCluster(); Cluster oldCluster = oldGroupFromDb(); cpuExists(); architectureIsUpdatable(); oldCluster.setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID); cmd.getCluster().setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID); initAndAssertValidation(true); verify(inClusterUpgradeValidator, times(0)).isUpgradePossible(anyList(), anyList()); verify(inClusterUpgradeValidator, times(0)).isUpgradeDone(anyList()); } @Test public void vmsAreUpdatedByTheOrderOfTheirIds() { final Cluster newerCluster = createDefaultCluster(); newerCluster.setCompatibilityVersion(new Version(1, 2)); createCommand(newerCluster); cmd.init(); VmStatic vm1 = new VmStatic(); vm1.setId(VM_ID1); VmStatic vm2 = new VmStatic(); vm2.setId(VM_ID2); VmStatic vm3 = new VmStatic(); vm3.setId(VM_ID3); when(vmStaticDao.getAllByCluster(any())).thenReturn(Arrays.asList(vm1, vm2, vm3)); // the VMs ordered by Guids: v2, v3, v1 assertEquals(Arrays.asList(vm2, vm3, vm1), cmd.filterVmsInClusterNeedUpdate()); } @Test public void hwrngAdditionalRngDeviceUsed() { final Cluster cluster = createDefaultCluster(); cluster.setAdditionalRngSources(Collections.singleton(VmRngDevice.Source.HWRNG)); createCommand(cluster); cpuExists(); initAndAssertValidation(true); } @Test public void randomAdditionalRngDeviceUsed() { final Cluster cluster = createDefaultCluster(); cluster.setAdditionalRngSources(Collections.singleton(VmRngDevice.Source.RANDOM)); createCommand(cluster); cpuExists(); validateFailedWithReason(EngineMessage.ACTION_TYPE_FAILED_RANDOM_RNG_SOURCE_CANT_BE_ADDED_TO_CLUSTER_ADDITIONAL_RNG_SOURCES); } @Test public void memoryOptimizationWithoutKsmOrBallooning(){ final Cluster cluster = createDefaultCluster(); cluster.setMaxVdsMemoryOverCommit(150); cluster.setEnableKsm(false); cluster.setEnableBallooning(false); createCommand(cluster); cpuExists(); validateFailedWithReason(EngineMessage.CLUSTER_TO_ALLOW_MEMORY_OPTIMIZATION_YOU_MUST_ALLOW_KSM_OR_BALLOONING); } @Test public void memoryOptimizationLowerThenZeroWithoutKsmOrBallooning(){ final Cluster cluster = createDefaultCluster(); cluster.setMaxVdsMemoryOverCommit(-52); cluster.setEnableKsm(false); cluster.setEnableBallooning(false); createCommand(cluster); cpuExists(); initAndAssertValidation(true); } @Test public void memoryOptimizationWithoutBallooning(){ final Cluster cluster = createDefaultCluster(); cluster.setMaxVdsMemoryOverCommit(0); cluster.setEnableKsm(true); cluster.setEnableBallooning(false); createCommand(cluster); cpuExists(); initAndAssertValidation(true); } @Test public void memoryOptimizationWithoutKsm(){ final Cluster cluster = createDefaultCluster(); cluster.setMaxVdsMemoryOverCommit(200); cluster.setEnableKsm(false); cluster.setEnableBallooning(true); createCommand(cluster); cpuExists(); initAndAssertValidation(true); } @Test public void memoryOptimizationWithKsmAndBallooning(){ final Cluster cluster = createDefaultCluster(); cluster.setMaxVdsMemoryOverCommit(200); cluster.setEnableKsm(true); cluster.setEnableBallooning(true); createCommand(cluster); cpuExists(); initAndAssertValidation(true); } private void createSimpleCommand() { createCommand(createNewCluster()); } private void createCommandWithOlderVersion() { createCommand(createClusterWithOlderVersion()); } private void createCommandWithInvalidVersion() { createCommand(createClusterWithBadVersion()); } private void createCommandWithDifferentPool() { createCommand(createClusterWithDifferentPool()); } private void createCommandWithDefaultCluster() { createCommand(createDefaultCluster()); } private void createCommandWithDifferentCpuName() { createCommand(createDefaultClusterWithDifferentCpuName()); } private void createCommandWithNoCpuName() { createCommand(createClusterWithNoCpuName()); } private void createCommandWithNoService() { createCommand(createClusterWith(false, false)); } private void createCommandWithVirtEnabled() { createCommand(createClusterWith(true, false)); } private void createCommandWithAddtionalFeature() { createCommand(createClusterWithAddtionalFeature()); } private void createCommandWithGlusterEnabled() { createCommand(createClusterWith(false, true)); } private void createCommandWithVirtGlusterEnabled() { createCommand(createClusterWith(true, true)); } private void createCommand(final Cluster group) { cmd.getParameters().setManagementNetworkId(managementNetworkId); cmd.getParameters().setCluster(group); cmd.setClusterId(group.getId()); doReturn(dbFacadeMock).when(cmd).getDbFacade(); doReturn(clusterDao).when(dbFacadeMock).getClusterDao(); doReturn(storagePoolDao).when(dbFacadeMock).getStoragePoolDao(); doReturn(true).when(cmd).isSupportedEmulatedMachinesMatchClusterLevel(any()); // cluster upgrade doReturn(new ClusterPolicy()).when(schedulingManager).getClusterPolicy(any(Guid.class)); final ClusterPolicy clusterPolicy = new ClusterPolicy(); clusterPolicy.setId(ClusterPolicy.UPGRADE_POLICY_GUID); doReturn(clusterPolicy).when(schedulingManager).getClusterPolicy(eq(ClusterPolicy.UPGRADE_POLICY_GUID)); if (StringUtils.isEmpty(group.getCpuName())) { doReturn(ArchitectureType.undefined).when(cmd).getArchitecture(); } else { doReturn(ArchitectureType.x86_64).when(cmd).getArchitecture(); } when(clusterDao.get(any())).thenReturn(createDefaultCluster()); when(clusterDao.getByName(any())).thenReturn(createDefaultCluster()); List<Cluster> clusterList = new ArrayList<>(); clusterList.add(createDefaultCluster()); when(clusterDao.getByName(any(), anyBoolean())).thenReturn(clusterList); } private void createCommandWithDifferentName() { createCommand(createClusterWithDifferentName()); } private static Cluster createClusterWithDifferentName() { Cluster group = new Cluster(); group.setName("BadName"); group.setCompatibilityVersion(VERSION_1_1); group.setClusterPolicyId(Guid.newGuid()); return group; } private static Cluster createNewCluster() { Cluster group = new Cluster(); group.setCompatibilityVersion(VERSION_1_1); group.setName("Default"); group.setClusterPolicyId(Guid.newGuid()); return group; } private static Cluster createDefaultCluster() { Cluster group = new Cluster(); group.setName("Default"); group.setId(DEFAULT_CLUSTER_ID); group.setCpuName("Intel Conroe"); group.setCompatibilityVersion(VERSION_1_1); group.setStoragePoolId(DC_ID1); group.setArchitecture(ArchitectureType.x86_64); group.setClusterPolicyId(Guid.newGuid()); group.setMaxVdsMemoryOverCommit(100); return group; } private static Cluster createDefaultClusterWithDifferentCpuName() { Cluster group = createDefaultCluster(); group.setCpuName("Another CPU name"); return group; } private static Cluster createClusterWithNoCpuName() { Cluster group = new Cluster(); group.setName("Default"); group.setId(DEFAULT_CLUSTER_ID); group.setCompatibilityVersion(VERSION_1_1); group.setStoragePoolId(DC_ID1); group.setArchitecture(ArchitectureType.undefined); group.setClusterPolicyId(Guid.newGuid()); group.setMaxVdsMemoryOverCommit(100); return group; } private static Cluster createDetachedDefaultCluster() { Cluster group = createDefaultCluster(); group.setStoragePoolId(null); return group; } private static Cluster createClusterWithOlderVersion() { Cluster group = createNewCluster(); group.setCompatibilityVersion(VERSION_1_0); group.setStoragePoolId(DC_ID1); group.setVirtService(true); group.setGlusterService(false); group.setMaxVdsMemoryOverCommit(100); return group; } private static Cluster createClusterWithBadVersion() { Cluster group = createNewCluster(); group.setCompatibilityVersion(new Version(5, 0)); return group; } private static Cluster createClusterWithDifferentPool() { Cluster group = createNewCluster(); group.setStoragePoolId(DC_ID2); return group; } private static Cluster createClusterWith(boolean virtService, boolean glusterService) { Cluster group = createDefaultCluster(); group.setVirtService(virtService); group.setGlusterService(glusterService); group.setCompatibilityVersion(VERSION_1_1); return group; } private static Cluster createClusterWithAddtionalFeature() { Cluster group = createDefaultCluster(); group.setCompatibilityVersion(VERSION_1_1); Set<SupportedAdditionalClusterFeature> addtionalFeaturesSupported = new HashSet<>(); AdditionalFeature feature = new AdditionalFeature(DEFAULT_FEATURE_ID, "TEST_FEATURE", VERSION_1_1, "Test Feature", ApplicationMode.AllModes); addtionalFeaturesSupported.add(new SupportedAdditionalClusterFeature(group.getId(), true, feature)); group.setAddtionalFeaturesSupported(addtionalFeaturesSupported); return group; } private static StoragePool createStoragePoolLocalFSOldVersion() { StoragePool pool = new StoragePool(); pool.setIsLocal(true); pool.setCompatibilityVersion(VERSION_1_2); return pool; } private static StoragePool createStoragePoolLocalFS() { StoragePool pool = new StoragePool(); pool.setIsLocal(true); return pool; } private void storagePoolIsLocalFS() { when(storagePoolDao.get(DC_ID1)).thenReturn(createStoragePoolLocalFS()); } private void oldGroupIsDetachedDefault() { when(clusterDao.get(DEFAULT_CLUSTER_ID)).thenReturn(createDetachedDefaultCluster()); } private Cluster oldGroupFromDb() { final Cluster vdsGroup = createDefaultCluster(); when(clusterDao.get(DEFAULT_CLUSTER_ID)).thenReturn(vdsGroup); return vdsGroup; } private void storagePoolAlreadyHasCluster() { Cluster group = new Cluster(); List<Cluster> groupList = new ArrayList<>(); groupList.add(group); when(clusterDao.getAllForStoragePool(any())).thenReturn(groupList); } private void vdsExist() { VDS vds = new VDS(); vds.setStatus(VDSStatus.Up); List<VDS> vdsList = new ArrayList<>(); vdsList.add(vds); when(vdsDao.getAllForCluster(any())).thenReturn(vdsList); } private void vdsExistWithHigherVersion() { VDS vds = new VDS(); vds.setStatus(VDSStatus.Up); vds.setClusterCompatibilityVersion(VERSION_1_2); List<VDS> vdsList = new ArrayList<>(); vdsList.add(vds); when(vdsDao.getAllForCluster(any())).thenReturn(vdsList); } private void clusterHasVds() { VDS vds = new VDS(); vds.setStatus(VDSStatus.Up); vds.setSupportedClusterLevels(VERSION_1_1.toString()); List<VDS> vdsList = new ArrayList<>(); vdsList.add(vds); when(vdsDao.getAllForCluster(any())).thenReturn(vdsList); } private void clusterHasGlusterVolumes() { List<GlusterVolumeEntity> volumes = new ArrayList<>(); volumes.add(new GlusterVolumeEntity()); when(glusterVolumeDao.getByClusterId(any())).thenReturn(volumes); } private void clusterHasVMs() { VM vm = new VM(); vm.setClusterId(DEFAULT_CLUSTER_ID); List<VM> vmList = new ArrayList<>(); vmList.add(vm); when(vmDao.getAllForCluster(any())).thenReturn(vmList); } private void cpuFlagsMissing() { List<String> strings = new ArrayList<>(); strings.add("foo"); doReturn(strings).when(cmd).missingServerCpuFlags(any()); } private void cpuFlagsNotMissing() { doReturn(null).when(cmd).missingServerCpuFlags(any()); } private void cpuManufacturersDontMatch() { doReturn(false).when(cmd).checkIfCpusSameManufacture(any()); } private void cpuManufacturersMatch() { doReturn(true).when(cmd).checkIfCpusSameManufacture(any()); } private void cpuExists() { doReturn(true).when(cmd).checkIfCpusExist(); } private void architectureIsUpdatable() { doReturn(true).when(cmd).isArchitectureUpdatable(); } private void architectureIsNotUpdatable() { doReturn(false).when(cmd).isArchitectureUpdatable(); } private void validateFailedWithReason(final EngineMessage message) { initAndAssertValidation(false); ValidateTestUtils.assertValidationMessages("Wrong validation message", cmd, message); } }