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.VdcBllErrors; import org.ovirt.engine.core.common.utils.EnumUtils; import org.ovirt.engine.core.common.vdscommands.SpmStatusVDSCommandParameters; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; 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; import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct; @Logged(executionLevel = LogLevel.DEBUG) public class SpmStatusVDSCommand<P extends SpmStatusVDSCommandParameters> extends VdsBrokerCommand<P> { private SpmStatusReturnForXmlRpc _result; public SpmStatusVDSCommand(P parameters) { super(parameters, null); } @Override protected void ExecuteVdsBrokerCommand() { _result = getBroker().spmStatus(getParameters().getStoragePoolId().toString()); ProceedProxyReturnValue(); setReturnValue(ParseSpmStatusResult(_result.spmStatus)); if (((SpmStatusResult) getReturnValue()).getSpmStatus() == SpmStatus.SPM_ERROR) { log.errorFormat("SPM {0} status returned SPM_ERROR on VDS {1}", getParameters().getStoragePoolId(), getParameters().getVdsId()); throw new IRSNonOperationalException("SPM status returned SPM_ERROR"); } } @Override protected void ProceedProxyReturnValue() { VdcBllErrors 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(XmlRpcStruct spmStatusResult) { try { // The parser handle an empty structure because of Mr. Frank // inability create a protocol that makes sense. SpmStatusResult statusResult = new SpmStatusResult(); statusResult .setSpmStatus((_result.spmStatus != null && _result.spmStatus.contains("spmStatus")) ? EnumUtils .valueOf(SpmStatus.class, _result.spmStatus.getItem("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.contains("spmLver")) ? _result.spmStatus .getItem("spmLver").toString() : "-5"); statusResult.setSpmId((_result.spmStatus != null && _result.spmStatus.contains("spmId")) ? Integer .parseInt(_result.spmStatus.getItem("spmId").toString()) : -5); return statusResult; } catch (RuntimeException exp) { log.errorFormat("Could not parse SPM Status: {0}", _result.spmStatus.toString()); throw exp; } } @Override protected StatusForXmlRpc getReturnStatus() { return _result.mStatus; } @Override protected Object getReturnValueFromBroker() { return _result; } @Override protected boolean getIsPrintReturnValue() { return false; } private static LogCompat log = LogFactoryCompat.getLog(SpmStatusVDSCommand.class); }