package org.ovirt.engine.core.bll.validator;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.utils.NumaTestUtils.createVdsNumaNode;
import static org.ovirt.engine.core.bll.utils.NumaTestUtils.createVmNumaNode;
import static org.ovirt.engine.core.common.businessentities.MigrationSupport.PINNED_TO_HOST;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.hostdev.HostDeviceManager;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
@RunWith(MockitoJUnitRunner.class)
public class InClusterUpgradeValidatorTest {
@Mock
HostDeviceManager hostDeviceManager;
VM invalidVM;
VM validVM;
VDS oldHost;
VDS newHost1;
VDS newHost2;
@InjectMocks
InClusterUpgradeValidator validator = new InClusterUpgradeValidator();
@Before
public void setUp() throws Exception {
invalidVM = newVM();
validVM = newVM();
oldHost = newHost("RHEV Hypervisor - 6.1 - 1.el6");
newHost1 = newHost("RHEL - 7.2 - 1.el7");
newHost2 = newHost("RHEL - 7.2 - 1.el7"); }
@Test
public void shouldDetectUpgradeInProgress() {
assertThat(validator.isUpgradeDone(Arrays.asList(oldHost, newHost1))).isNotEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectInvalidHostOsOnNewlyAddedHost() {
newHost1.setHostOs("which OS am I?");
assertThat(validator.isUpgradeDone(Arrays.asList(newHost1, newHost2))).isNotEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectUpgradeDone() {
assertThat(validator.isUpgradeDone(Arrays.asList(newHost1, newHost2))).isEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectUpgradePossible() {
assertThat(validator.isUpgradePossible(Arrays.asList(newHost1, newHost2), Collections.singletonList(validVM)))
.isEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectInvalidHostOsIdentifier() {
newHost1.setHostOs("which OS am I?");
assertThat(validator.isUpgradePossible(Arrays.asList(newHost1, newHost2), Collections.singletonList(validVM)))
.isNotEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectInvalidVMOnClusterUpgradeCheck() {
invalidVM.setCpuPinning("i am pinned");
assertThat(validator.isUpgradePossible(Arrays.asList(newHost1, newHost2), Arrays.asList(validVM, invalidVM)))
.isNotEqualTo(ValidationResult.VALID);
}
@Test
public void shouldDetectNonMigratableVMs() {
invalidVM.setMigrationSupport(PINNED_TO_HOST);
assertThat(validator.checkVmReadyForUpgrade(invalidVM)).contains(
EngineMessage.CLUSTER_UPGRADE_DETAIL_VM_NOT_MIGRATABLE.name());
}
@Test
public void shouldDetectCpuPinning() {
invalidVM.setCpuPinning("i am pinned");
assertThat(validator.checkVmReadyForUpgrade(invalidVM)).contains(
EngineMessage.CLUSTER_UPGRADE_DETAIL_VM_CPUS_PINNED.name());
}
@Test
public void shouldDetectNumaPinning() {
invalidVM.setvNumaNodeList(Collections.singletonList(createVmNumaNode(1, Collections.singletonList(createVdsNumaNode(1)))));
assertThat(validator.checkVmReadyForUpgrade(invalidVM)).contains(
EngineMessage.CLUSTER_UPGRADE_DETAIL_VM_NUMA_PINNED.name());
}
@Test
public void shouldAllowUnpinnedNumaNodes() {
validVM.setvNumaNodeList(Collections.singletonList(createVmNumaNode(1)));
assertThat(validator.checkVmReadyForUpgrade(validVM)).isEmpty();
}
@Test
public void shouldDetectSuspendedVM() {
invalidVM.setStatus(VMStatus.Suspended);
assertThat(validator.checkVmReadyForUpgrade(invalidVM)).contains(
EngineMessage.CLUSTER_UPGRADE_DETAIL_VM_SUSPENDED.name());
}
@Test
public void shouldDetectPassThroughDeviceOnVM() {
when(hostDeviceManager.checkVmNeedsDirectPassthrough(any(VM.class))).thenReturn(true);
assertThat(validator.checkVmReadyForUpgrade(invalidVM)).contains(
EngineMessage.CLUSTER_UPGRADE_DETAIL_VM_NEEDS_PASSTHROUGH.name());
}
@Test
public void shouldCreateNiceValidationResult() throws IOException {
invalidVM.setCpuPinning("i am pinned");
invalidVM.setDedicatedVmForVdsList(Guid.newGuid());
invalidVM.setMigrationSupport(PINNED_TO_HOST);
invalidVM.setId(Guid.Empty);
newHost1.setHostOs("invalid os");
ValidationResult validationResult = validator.isUpgradePossible(Collections.singletonList(newHost1),
Collections.singletonList(invalidVM));
assertThat(validationResult.getVariableReplacements()).contains(
"CLUSTER_UPGRADE_DETAIL_HOST_INVALID_OS",
"CLUSTER_UPGRADE_DETAIL_VM_CPUS_PINNED",
"CLUSTER_UPGRADE_DETAIL_VM_NOT_MIGRATABLE");
}
@Test
public void shouldAllowUpgradeForVM() {
assertThat(validator.checkVmReadyForUpgrade(validVM)).isEmpty();
}
private VM newVM() {
final VM vm = new VM();
vm.setId(Guid.newGuid());
return vm;
}
private VDS newHost(String os) {
final VDS host = new VDS();
host.setId(Guid.newGuid());
host.setHostOs(os);
return host;
}
}