package org.ovirt.engine.core.vdsbroker.vdsbroker; 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.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.utils.ThreadUtils; import org.ovirt.engine.core.vdsbroker.ResourceManager; import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc; public class SpmStartVDSCommand<P extends SpmStartVDSCommandParameters> extends VdsBrokerCommand<P> { public SpmStartVDSCommand(P parameters) { super(parameters); } private OneUuidReturnForXmlRpc _result; @Override protected void ExecuteVdsBrokerCommand() { if (!Config.<Boolean> GetValue(ConfigValues.SupportStorageFormat, getVds().getvds_group_compatibility_version() .toString())) { _result = getBroker().spmStart(getParameters().getStoragePoolId().toString(), getParameters().getPrevId(), getParameters().getPrevLVER(), getParameters().getRecoveryMode().getValue(), (new Boolean(getParameters().getSCSIFencing())).toString().toLowerCase(), Config.<Integer> GetValue(ConfigValues.MaxNumberOfHostsInStoragePool)); } else { _result = getBroker().spmStart(getParameters().getStoragePoolId().toString(), getParameters().getPrevId(), getParameters().getPrevLVER(), getParameters().getRecoveryMode().getValue(), (new Boolean(getParameters().getSCSIFencing())).toString().toLowerCase(), Config.<Integer> GetValue(ConfigValues.MaxNumberOfHostsInStoragePool), getParameters().getStoragePoolFormatType().getValue()); } ProceedProxyReturnValue(); Guid taskId = new Guid(_result.mUuid); AsyncTaskStatus taskStatus; log.infoFormat("spmStart polling started: taskId = {0}", taskId); do { // TODO: make configurable ThreadUtils.sleep(1000); taskStatus = (AsyncTaskStatus) ResourceManager .getInstance() .runVdsCommand(VDSCommandType.HSMGetTaskStatus, new HSMTaskGuidBaseVDSCommandParameters(getVds().getvds_id(), taskId)).getReturnValue(); log.debugFormat("spmStart polling - task status: {0}", taskStatus.getStatus().toString()); } while (taskStatus.getStatus() != AsyncTaskStatusEnum.finished && taskStatus.getStatus() != AsyncTaskStatusEnum.unknown); log.infoFormat("spmStart polling ended: taskId = {0} task status = {1}", taskId, taskStatus.getStatus()); if (!taskStatus.getTaskEndedSuccessfully()) { log.errorFormat("Start SPM Task failed - result: {0}, message: {1}", taskStatus.getResult().toString(), taskStatus.getMessage()); } SpmStatusResult spmStatus = (SpmStatusResult) ResourceManager .getInstance() .runVdsCommand(VDSCommandType.SpmStatus, new SpmStatusVDSCommandParameters(getVds().getvds_id(), getParameters().getStoragePoolId())) .getReturnValue(); log.infoFormat("spmStart polling ended. spm status: {0}", spmStatus.getSpmStatus().toString()); try { ResourceManager.getInstance().runVdsCommand(VDSCommandType.HSMClearTask, new HSMTaskGuidBaseVDSCommandParameters(getVds().getvds_id(), taskId)); } catch (java.lang.Exception e) { log.errorFormat("Could not clear spmStart task (id - {0}), continuing with SPM selection.", taskId); } setReturnValue(spmStatus); } @Override protected StatusForXmlRpc getReturnStatus() { return _result.mStatus; } @Override protected Object getReturnValueFromBroker() { return _result; } private static LogCompat log = LogFactoryCompat.getLog(SpmStartVDSCommand.class); }