package org.ovirt.engine.core.bll.numa.vm;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
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.bll.utils.NumaTestUtils.createVmNumaNodeWithId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Function;
import org.junit.Test;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.common.action.VmNumaNodeOperationParameters;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
public class UpdateVmNumaNodesCommandTest
extends AbstractVmNumaNodeCommandTestBase<UpdateVmNumaNodesCommand<VmNumaNodeOperationParameters>> {
@Override
protected Function<VmNumaNodeOperationParameters, UpdateVmNumaNodesCommand<VmNumaNodeOperationParameters>>
commandCreator() {
return p -> new UpdateVmNumaNodesCommand<>(p, null);
}
protected void initNumaNodes() {
vdsNumaNodes = new ArrayList<>(Arrays.asList(createVdsNumaNode(1), createVdsNumaNode(2), createVdsNumaNode(3)));
existingNumaNodes = new ArrayList<>(Arrays.asList(createVmNumaNodeWithId(0, NODE_ID_0),
createVmNumaNodeWithId(1, NODE_ID_1), createVmNumaNode(2)));
paramNumaNodes.addAll(Arrays.asList(createVmNumaNodeWithId(0, NODE_ID_0),
createVmNumaNodeWithId(1, NODE_ID_1)));
}
private static final Guid NODE_ID_0 = Guid.newGuid();
private static final Guid NODE_ID_1 = Guid.newGuid();
@Test
public void canUpdateNumaConfigurationWithVmFromParams() {
vm.setvNumaNodeList(existingNumaNodes);
mockCommandWithVmFromParams();
command.executeCommand();
verify(vmNumaNodeDao).massUpdateNumaNode(eq(paramNumaNodes));
}
@Test
public void canUpdateNumaConfigurationWithVmFromDb() {
mockCommandWithVmFromDb();
command.executeCommand();
verify(vmNumaNodeDao).massUpdateNumaNode(eq(paramNumaNodes));
}
@Test
public void canUpdateNumaPinning() {
paramNumaNodes.clear();
paramNumaNodes.add(createVmNumaNode(1, vdsNumaNodes));
mockCommandWithVmFromParams();
command.executeCommand();
verify(vmNumaNodeDao).massUpdateNumaNode(eq(paramNumaNodes));
}
@Test
public void canDetectMissingRequiredHostNumaNodes() {
paramNumaNodes.clear();
paramNumaNodes.add(createVmNumaNodeWithId(0, vdsNumaNodes, NODE_ID_0));
vm.setvNumaNodeList(existingNumaNodes);
vdsNumaNodes.remove(0);
mockCommandWithVmFromParams();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.VM_NUMA_NODE_HOST_NODE_INVALID_INDEX);
}
@Test
public void canDetectDuplicateNumaNodes() {
paramNumaNodes.clear();
paramNumaNodes.addAll(Arrays.asList(createVmNumaNode(10), createVmNumaNode(10)));
mockCommandWithVmFromParams();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.VM_NUMA_NODE_INDEX_DUPLICATE);
}
@Test
public void canUpdateNumaNodesWithArbitraryIndex() {
paramNumaNodes.clear();
paramNumaNodes.addAll(Arrays.asList(createVmNumaNode(0), createVmNumaNode(2)));
mockCommandWithVmFromParams();
ValidateTestUtils.runAndAssertValidateSuccess(command);
}
@Test
public void canDetectMissingVM() {
when(vmDao.get(eq(vm.getId()))).thenReturn(null);
mockCommandWithVmFromDb();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_VM_NOT_FOUND);
}
@Test
public void shouldRunValidation() {
vdsNumaNodes.clear();
mockCommandWithVmFromDb();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.VM_NUMA_PINNED_VDS_NODE_EMPTY);
}
}