package org.ovirt.engine.core.vdsbroker.vdsbroker;
import javax.inject.Inject;
import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
import org.ovirt.engine.core.common.businessentities.SpmStatusResult;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.vdscommands.HSMTaskGuidBaseVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.SpmStartVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.SpmStatusVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.utils.ThreadUtils;
import org.ovirt.engine.core.vdsbroker.ResourceManager;
import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturn;
public class SpmStartVDSCommand<P extends SpmStartVDSCommandParameters> extends VdsBrokerCommand<P> {
@Inject
private ResourceManager resourceManager;
public SpmStartVDSCommand(P parameters) {
super(parameters);
vdsId = parameters.getVdsId();
}
private OneUuidReturn result;
private Guid vdsId;
@Override
protected void executeVdsBrokerCommand() {
result = getBroker().spmStart(getParameters().getStoragePoolId().toString(),
getParameters().getPrevId(), getParameters().getPrevLVER(),
getParameters().getRecoveryMode().getValue(),
String.valueOf(getParameters().getSCSIFencing()).toLowerCase(),
Config.getValue(ConfigValues.MaxNumberOfHostsInStoragePool), getParameters().getStoragePoolFormatType().getValue());
proceedProxyReturnValue();
Guid taskId = new Guid(result.uuid);
AsyncTaskStatus taskStatus;
log.info("spmStart polling started: taskId '{}'", taskId);
do {
// TODO: make configurable
ThreadUtils.sleep(1000L);
taskStatus = (AsyncTaskStatus) resourceManager.runVdsCommand(VDSCommandType.HSMGetTaskStatus,
new HSMTaskGuidBaseVDSCommandParameters(vdsId, taskId)).getReturnValue();
log.debug("spmStart polling - task status: '{}'", taskStatus.getStatus());
} while (taskStatus.getStatus() != AsyncTaskStatusEnum.finished
&& taskStatus.getStatus() != AsyncTaskStatusEnum.unknown);
log.info("spmStart polling ended: taskId '{}' task status '{}'", taskId, taskStatus.getStatus());
if (!taskStatus.getTaskEndedSuccessfully()) {
log.error("Start SPM Task failed - result: '{}', message: {}", taskStatus.getResult(),
taskStatus.getMessage());
}
SpmStatusResult spmStatus = (SpmStatusResult) resourceManager.runVdsCommand(VDSCommandType.SpmStatus,
new SpmStatusVDSCommandParameters(vdsId, getParameters().getStoragePoolId()))
.getReturnValue();
if (spmStatus != null) {
log.info("spmStart polling ended, spm status: {}", spmStatus.getSpmStatus());
} else {
log.error("spmStart polling ended, failed to get the spm status");
}
try {
resourceManager.runVdsCommand(VDSCommandType.HSMClearTask,
new HSMTaskGuidBaseVDSCommandParameters(vdsId, taskId));
} catch (Exception e) {
log.error("Could not clear spmStart task '{}', continuing with SPM selection: {}", taskId, e.getMessage());
log.debug("Exception", e);
}
setReturnValue(spmStatus);
}
@Override
protected Status getReturnStatus() {
return result.getStatus();
}
@Override
protected Object getReturnValueFromBroker() {
return result;
}
}