package org.ovirt.engine.core.vdsbroker.vdsbroker;
import org.ovirt.engine.core.common.businessentities.SpmStatus;
import org.ovirt.engine.core.common.businessentities.SpmStatusResult;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.utils.EnumUtils;
import org.ovirt.engine.core.common.vdscommands.SpmStatusVDSCommandParameters;
import org.ovirt.engine.core.utils.log.Logged;
import org.ovirt.engine.core.utils.log.Logged.LogLevel;
import org.ovirt.engine.core.vdsbroker.irsbroker.IRSNonOperationalException;
@Logged(executionLevel = LogLevel.DEBUG)
public class SpmStatusVDSCommand<P extends SpmStatusVDSCommandParameters> extends VdsBrokerCommand<P> {
private SpmStatusReturn _result;
public SpmStatusVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void executeVdsBrokerCommand() {
_result = getBroker().spmStatus(getParameters().getStoragePoolId().toString());
proceedProxyReturnValue();
setReturnValue(parseSpmStatusResult());
if (((SpmStatusResult) getReturnValue()).getSpmStatus() == SpmStatus.SPM_ERROR) {
log.error("SPM '{}' status returned SPM_ERROR on VDS '{}'", getParameters().getStoragePoolId(),
getParameters().getVdsId());
throw new IRSNonOperationalException("SPM status returned SPM_ERROR");
}
}
@Override
protected void proceedProxyReturnValue() {
EngineError returnStatus = getReturnValueFromStatus(getReturnStatus());
switch (returnStatus) {
case StoragePoolUnknown:
// ignore this, the parser can handle the empty result.
break;
default:
super.proceedProxyReturnValue();
initializeVdsError(returnStatus);
break;
}
}
private SpmStatusResult parseSpmStatusResult() {
try {
SpmStatusResult statusResult = new SpmStatusResult();
statusResult
.setSpmStatus((_result.spmStatus != null && _result.spmStatus.containsKey("spmStatus")) ? EnumUtils
.valueOf(SpmStatus.class, _result.spmStatus.get("spmStatus").toString(), true)
: SpmStatus.Unknown_Pool);
// if no lver and id put -5 hardcoded because of VDSM inconsistency
statusResult
.setSpmLVER((_result.spmStatus != null && _result.spmStatus.containsKey("spmLver")) ? _result.spmStatus
.get("spmLver").toString()
: "-5");
statusResult.setSpmId((_result.spmStatus != null && _result.spmStatus.containsKey("spmId")) ? Integer
.parseInt(_result.spmStatus.get("spmId").toString()) : -5);
return statusResult;
} catch (RuntimeException exp) {
log.error("Could not parse SPM Status: '{}'", _result.spmStatus);
throw exp;
}
}
@Override
protected Status getReturnStatus() {
return _result.getStatus();
}
@Override
protected Object getReturnValueFromBroker() {
return _result;
}
@Override
protected boolean getIsPrintReturnValue() {
return false;
}
}