package org.ovirt.engine.core.vdsbroker.vdsbroker;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.businessentities.VdsStatic;
import org.ovirt.engine.core.common.businessentities.pm.FenceActionType;
import org.ovirt.engine.core.common.businessentities.pm.FenceAgent;
import org.ovirt.engine.core.common.businessentities.pm.FenceOperationResult;
import org.ovirt.engine.core.common.businessentities.pm.FenceOperationResult.Status;
import org.ovirt.engine.core.common.businessentities.pm.PowerStatus;
import org.ovirt.engine.core.common.vdscommands.FenceVdsVDSCommandParameters;
import org.ovirt.engine.core.compat.Guid;
@RunWith(MockitoJUnitRunner.class)
public class FenceVdsVDSCommandTest {
private static Guid TARGET_HOST_ID = new Guid("11111111-1111-1111-1111-111111111111");
private static Guid PROXY_HOST_ID = new Guid("44444444-4444-4444-4444-444444444444");
private FenceVdsVDSCommand<FenceVdsVDSCommandParameters> command;
@Mock
private VdsStatic targetVdsStatic;
@Mock
private IVdsServer broker;
private void setupCommand(FenceVdsVDSCommandParameters params) {
command = new FenceVdsVDSCommand<FenceVdsVDSCommandParameters>(params) {
@Override
protected IVdsServer initializeVdsBroker(Guid vdsId) {
return broker;
}
@Override
protected VdsStatic getAndSetVdsStatic() {
return targetVdsStatic;
}
@Override
protected void alertActionSkippedAlreadyInStatus() {
}
};
}
private Map<String, Object> createBrokerResultMap(
int returnCode,
String message,
String powerStatus,
String operationStatus) {
Map<String, Object> statusMap = new HashMap<>();
statusMap.put("code", returnCode);
statusMap.put("message", message);
Map<String, Object> map = new HashMap<>();
map.put("status", statusMap);
map.put("power", powerStatus);
map.put("operationStatus", operationStatus);
return map;
}
private void setupBrokerResult(Map<String, Object> first) {
setupBrokerResult(first, null);
}
private void setupBrokerResult(Map<String, Object> first, Map<String, Object> second) {
when(broker.fenceNode(
anyString(),
anyString(),
anyString(),
anyString(),
anyString(),
anyString(),
anyString(),
anyString(),
any()))
.thenReturn(new FenceStatusReturn(first))
.thenReturn(second == null ? null : new FenceStatusReturn(second));
}
private FenceVdsVDSCommandParameters setupCommandParams(FenceActionType fenceAction) {
FenceAgent agent = new FenceAgent();
agent.setIp("1.2.3.4");
agent.setPort(1234);
agent.setType("ipmilan");
agent.setUser("admin");
agent.setPassword("admin");
agent.setOptions("");
return new FenceVdsVDSCommandParameters(
PROXY_HOST_ID,
TARGET_HOST_ID,
agent,
fenceAction,
null);
}
/**
* Tests result of successful get power status of host
*/
@Test
public void successfulGetStatus() {
String agentMessage = "Test succeeded: on";
setupCommand(setupCommandParams(FenceActionType.STATUS));
setupBrokerResult(createBrokerResultMap(0, agentMessage, "on", null));
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.SUCCESS, result.getStatus());
assertEquals(PowerStatus.ON, result.getPowerStatus());
assertEquals(agentMessage, result.getMessage());
}
/**
* Tests result of failed get power status of host
*/
@Test
public void failedGetStatus() {
String agentMessage = "Test failed, status unknown";
setupCommand(setupCommandParams(FenceActionType.STATUS));
setupBrokerResult(createBrokerResultMap(1, agentMessage, "unknown", null));
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.ERROR, result.getStatus());
assertEquals(PowerStatus.UNKNOWN, result.getPowerStatus());
assertEquals(agentMessage, result.getMessage());
}
/**
* Test execution of stop action when host is powered down
*/
@Test
public void stopHostWhichIsPoweredDown() {
setupCommand(setupCommandParams(FenceActionType.STOP));
setupBrokerResult(
createBrokerResultMap(0, "", "off", null)); // result of STATUS action executed prior to STOP action
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.SKIPPED_ALREADY_IN_STATUS, result.getStatus());
assertEquals(PowerStatus.UNKNOWN, result.getPowerStatus());
}
/**
* Test execution of stop action when host is powered up
*/
@Test
public void stopHostWhichIsPoweredUp() {
setupCommand(setupCommandParams(FenceActionType.STOP));
setupBrokerResult(
createBrokerResultMap(0, "", "on", null), // result of STATUS action executed prior to STOP action
createBrokerResultMap(0, "", "unknown", "initiated")); // result of actual STOP action
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.SUCCESS, result.getStatus());
assertEquals(PowerStatus.UNKNOWN, result.getPowerStatus());
}
/**
* Test execution of stop action when host power status cannot be determined
*/
@Test
public void stopHostWithUnknownPowerStatus() {
setupCommand(setupCommandParams(FenceActionType.STOP));
setupBrokerResult(
createBrokerResultMap(1, "", "unknown", null), // result of STATUS action executed prior to STOP action
createBrokerResultMap(0, "", "unknown", "initiated")); // result of actual STOP action
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.SUCCESS, result.getStatus());
assertEquals(PowerStatus.UNKNOWN, result.getPowerStatus());
}
/**
* Test execution of stop action when fencing policy forbids stopping host still connected to storage, so stopping
* the host is skipped
*/
@Test
public void stopHostSkippedDueToFencingPolicy() {
setupCommand(setupCommandParams(FenceActionType.STOP));
setupBrokerResult(
createBrokerResultMap(0, "", "on", null), // result of STATUS action executed prior to STOP action
createBrokerResultMap(0, "", "unknown", "skipped")); // result of actual STOP action
command.execute();
FenceOperationResult result = (FenceOperationResult) command.getVDSReturnValue().getReturnValue();
assertEquals(Status.SKIPPED_DUE_TO_POLICY, result.getStatus());
assertEquals(PowerStatus.UNKNOWN, result.getPowerStatus());
}
}