package org.ovirt.engine.core.bll;
import java.util.HashMap;
import java.util.Map;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.IVdsAsyncCommand;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.common.interfaces.FutureVDSCall;
import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
import org.ovirt.engine.core.common.vdscommands.FutureVDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSParametersBase;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.common.vdscommands.VdsAndVmIDVDSParametersBase;
import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.vdsbroker.ResourceManager;
@Singleton
public class VDSBrokerFrontendImpl implements VDSBrokerFrontend {
@Inject
private Instance<ResourceManager> resourceManager;
private Map<Guid, IVdsAsyncCommand> _asyncRunningCommands = new HashMap<>();
@Override
public VDSReturnValue runVdsCommand(VDSCommandType commandType, VDSParametersBase parameters) {
return VdsHandler.handleVdsResult(getResourceManager().runVdsCommand(commandType, parameters));
}
@Override
public VDSReturnValue runAsyncVdsCommand(VDSCommandType commandType, VdsAndVmIDVDSParametersBase parameters,
IVdsAsyncCommand command) {
VDSReturnValue result = runVdsCommand(commandType, parameters);
if (result.getSucceeded()) {
// Add async command to cached commands
IVdsAsyncCommand prevCommand = _asyncRunningCommands.put(parameters.getVmId(), command);
if (prevCommand != null && !prevCommand.equals(command)) {
prevCommand.reportCompleted();
}
} else {
throw new EngineException(result.getVdsError().getCode(), result.getExceptionString());
}
return result;
}
@Override
public IVdsAsyncCommand getAsyncCommandForVm(Guid vmId) {
IVdsAsyncCommand result = null;
result = _asyncRunningCommands.get(vmId);
return result;
}
@Override
public IVdsAsyncCommand removeAsyncRunningCommand(Guid vmId) {
return _asyncRunningCommands.remove(vmId);
}
@Override
public FutureVDSCall<VDSReturnValue> runFutureVdsCommand(FutureVDSCommandType commandType,
VdsIdVDSCommandParametersBase parameters) {
return getResourceManager().runFutureVdsCommand(commandType, parameters);
}
private ResourceManager getResourceManager() {
return resourceManager.get();
}
}