package org.ovirt.engine.core.vdsbroker.vdsbroker;
import java.net.ConnectException;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.errors.VdcBLLException;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
import org.ovirt.engine.core.compat.ApplicationException;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.vdsbroker.ResourceManager;
import org.ovirt.engine.core.vdsbroker.VdsManager;
import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException;
public abstract class VdsBrokerCommand<P extends VdsIdVDSCommandParametersBase> extends BrokerCommandBase<P> {
private final IVdsServer mVdsBroker;
private VDS mVds;
/**
* Construct the command using the parameters and the {@link VDS} which is loaded from the DB.
*
* @param parameters
* The parameters of the command.
*/
public VdsBrokerCommand(P parameters) {
this(parameters, DbFacade.getInstance().getVdsDAO().get(parameters.getVdsId()));
}
/**
* Construct the command using the parameters and the {@link VDS} which is passed.
*
* @param parameters
* The parameters of the command.
* @param vds
* The host to use in the command.
*/
protected VdsBrokerCommand(P parameters, VDS vds) {
super(parameters);
VdsManager vdsmanager = ResourceManager.getInstance().GetVdsManager(parameters.getVdsId());
if (vdsmanager == null) {
throw new VdcBLLException(VdcBllErrors.RESOURCE_MANAGER_VDS_NOT_FOUND,
String.format("Vds with id: %1$s was not found", parameters.getVdsId()));
}
mVdsBroker = vdsmanager.getVdsProxy();
mVds = vds;
}
protected IVdsServer getBroker() {
return mVdsBroker;
}
@Override
protected String getAdditionalInformation() {
if (getVds() != null) {
return String.format("Vds: %1$s", getVds().getvds_name());
} else {
return super.getAdditionalInformation();
}
}
protected VDS getVds() {
return mVds;
}
protected void setVds(VDS value) {
mVds = value;
}
@Override
protected void ExecuteVDSCommand() {
try {
ExecuteVdsBrokerCommand();
} catch (VDSExceptionBase ex) {
PrintReturnValue();
throw ex;
} catch (ApplicationException ex) {
log.errorFormat("Failed in {0} method", getCommandName());
log.error("Exception", ex);
PrintReturnValue();
throw new VDSProtocolException(ex);
} catch (XmlRpcRunTimeException ex) {
final String msgFormat = "XML RPC error in command {0} ( {2} ), the error was: {1} ";
if ((ExceptionUtils.getRootCause(ex) instanceof ConnectException)) {
log.debugFormat(msgFormat, getCommandName(), ex.getMessage(), getAdditionalInformation());
} else {
log.errorFormat(msgFormat, getCommandName(), ex.getMessage(), getAdditionalInformation());
}
PrintReturnValue();
throw new VDSNetworkException(ex);
}
// catch (WebException ex)
// {
// // log this exception in debug becaue it is being logged again later.
// log.infoFormat("Failed in {0} method", getCommandName());
// log.info("Exception", ex);
// throw new VDSNetworkException(ex);
// }
// catch (NullReferenceException ex)
// {
// PrintReturnValue();
// //This is a workaround a bug in the xml-rpc package
// throw new VDSNetworkException(ex);
// }
// TODO: look for invalid certificates error handling
catch (RuntimeException e) {
PrintReturnValue();
if (getVds() == null) {
log.errorFormat("Failed in {0} method, for vds id: {1}",
getCommandName(), getParameters().getVdsId());
} else {
log.errorFormat("Failed in {0} method, for vds: {1}; host: {2}",
getCommandName(), getVds().getvds_name(), getVds().gethost_name());
}
throw e;
}
}
protected abstract void ExecuteVdsBrokerCommand();
private static LogCompat log = LogFactoryCompat.getLog(VdsBrokerCommand.class);
}