package org.ovirt.engine.core.common.businessentities.pm;
import java.io.Serializable;
import org.ovirt.engine.core.common.utils.ToStringBuilder;
/**
* Result of action performed on single fence agent
*/
public class FenceOperationResult implements Serializable {
/**
* Operation result
*/
private Status status;
/**
* Power status
*/
private PowerStatus powerStatus;
/**
* Message received from fence agent
*/
private String message;
/**
* Creates instance with status {@code Status.ERROR}, power status {@code PowerStatus.UNKNOWN}
*/
public FenceOperationResult() {
this(Status.ERROR, PowerStatus.UNKNOWN);
}
/**
* Creates instance with specified status, power status {@code PowerStatus.UNKNOWN} and {@code null}
* error message
*/
public FenceOperationResult(Status status) {
this(status, PowerStatus.UNKNOWN);
}
/**
* Creates instance with specified status, powerStatus
*/
public FenceOperationResult(Status status, PowerStatus powerStatus) {
this(status, powerStatus, "");
}
/**
* Creates instance with specified status, powerStatus and message
*/
public FenceOperationResult(Status status, PowerStatus powerStatus, String message) {
this.status = status;
this.powerStatus = powerStatus;
this.message = message;
}
/**
* Creates instance using requested action and result of RPC call
*/
public FenceOperationResult(
FenceActionType action,
int code,
String message,
String power,
String operationStatus) {
Status st = code == 0 ? Status.SUCCESS : Status.ERROR;
powerStatus = PowerStatus.forValue(power);
this.message = message;
if (action == FenceActionType.STATUS && powerStatus == PowerStatus.UNKNOWN) {
st = Status.ERROR;
}
if (action != FenceActionType.STATUS && "skipped".equalsIgnoreCase(operationStatus)) {
/*
* TODO:
* This needs to be fixed when we move the check "is host already in desired state"
* for on/off action from engine to VDSM
*/
st = Status.SKIPPED_DUE_TO_POLICY;
}
status = st;
}
public Status getStatus() {
return status;
}
public PowerStatus getPowerStatus() {
return powerStatus;
}
public String getMessage() {
// VSDM returns 'Done' by default for fencing operations. This is not useful and appending
// it to log messages results in a confusing message. So if the message is 'Done', it's
// better to ignore it (return empty string). If it's anything different - return it as is.
// (See: https://bugzilla.redhat.com/1203741.)
if (message.equals("Done")) {
return "";
} else {
return message;
}
}
public enum Status {
/**
* Operation finished successfully
*/
SUCCESS,
/**
* Operation finished with error
*/
ERROR,
/**
* Operation was skipped, because host is already in required power status
*/
SKIPPED_ALREADY_IN_STATUS,
/**
* Operation was skipped due to fencing policy
*/
SKIPPED_DUE_TO_POLICY
}
@Override
public String toString() {
return ToStringBuilder.forInstance(this)
.append("status", getStatus())
.append("powerStatus", getPowerStatus())
.append("message", getMessage())
.build();
}
}