package org.ovirt.engine.core.bll;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.EngineContext;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.FeatureSupported;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.queries.GetVmsFromExternalProviderQueryParameters;
import org.ovirt.engine.core.common.vdscommands.GetVmsFromExternalProviderParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogable;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableImpl;
import org.ovirt.engine.core.dao.StoragePoolDao;
import org.ovirt.engine.core.dao.VdsDao;
public class GetVmsFromExternalProviderQuery<T extends GetVmsFromExternalProviderQueryParameters>
extends QueriesCommandBase<T> {
@Inject
private StoragePoolDao storagePoolDao;
@Inject
private VdsDao vdsDao;
public GetVmsFromExternalProviderQuery(T parameters) {
this(parameters, null);
}
public GetVmsFromExternalProviderQuery(T parameters, EngineContext engineContext) {
super(parameters, engineContext);
}
@Override
protected void executeQueryCommand() {
setReturnValue(getVmsFromExternalProvider());
}
private Object getVmsFromExternalProvider() {
try {
if (isGetNamesOfVmsFromExternalProviderSupported() && getParameters().getNamesOfVms() == null) {
return runVdsCommand(VDSCommandType.GetVmsNamesFromExternalProvider,
buildGetRemoteVmsInfoParameters()).getReturnValue();
} else {
return runVdsCommand(VDSCommandType.GetVmsFullInfoFromExternalProvider,
buildGetRemoteVmsInfoParameters()).getReturnValue();
}
} catch (RuntimeException e) {
if (!(e instanceof IllegalArgumentException)) {
logFailureToGetVms();
}
throw e;
}
}
private void logFailureToGetVms() {
AuditLogable logable = new AuditLogableImpl();
logable.addCustomValue("URL", getParameters().getUrl());
auditLogDirector.log(logable, AuditLogType.IMPORTEXPORT_GET_EXTERNAL_VMS_INFO_FAILED);
}
private GetVmsFromExternalProviderParameters buildGetRemoteVmsInfoParameters() {
return new GetVmsFromExternalProviderParameters(
getProxyHostId(),
getParameters().getUrl(),
getParameters().getUsername(),
getParameters().getPassword(),
getParameters().getOriginType(),
getParameters().getNamesOfVms());
}
private Guid getProxyHostId() {
return getParameters().getProxyHostId() != null ?
getProxyHostIdFromParameters() : pickProxyHostFromDataCenter();
}
private Guid getProxyHostIdFromParameters() {
VDS vds = vdsDao.get(getParameters().getProxyHostId());
if (vds == null) {
throw new IllegalArgumentException(
String.format("No VDS with the given ID '%s' exists", getParameters().getProxyHostId()));
}
if (vds.getStatus() != VDSStatus.Up) {
logHostCannotBeProxy(vds);
throw new IllegalArgumentException();
}
return vds.getId();
}
private Guid pickProxyHostFromDataCenter() {
Guid dataCenterId = getParameters().getDataCenterId();
List<VDS> vdss = vdsDao.getAllForStoragePoolAndStatus(dataCenterId, VDSStatus.Up);
if (vdss.isEmpty()) {
logNoProxyAvailable(dataCenterId);
throw new IllegalArgumentException();
}
return vdss.get(0).getId();
}
private void logHostCannotBeProxy(VDS host) {
AuditLogable logable = new AuditLogableImpl();
logable.setVdsName(host.getName());
logable.setVdsId(host.getId());
logable.setUserName(String.format("%s@%s", getUser().getLoginName(), getUser().getDomain()));
auditLogDirector.log(logable, AuditLogType.IMPORTEXPORT_HOST_CANNOT_SERVE_AS_PROXY);
}
private void logNoProxyAvailable(Guid dataCenterId) {
AuditLogable logable = new AuditLogableImpl();
StoragePool dataCenter = storagePoolDao.get(dataCenterId);
logable.setStoragePoolId(dataCenter.getId());
logable.setStoragePoolName(dataCenter.getName());
logable.setUserName(String.format("%s@%s", getUser().getLoginName(), getUser().getDomain()));
auditLogDirector.log(logable, AuditLogType.IMPORTEXPORT_NO_PROXY_HOST_AVAILABLE_IN_DC);
}
private boolean isGetNamesOfVmsFromExternalProviderSupported() {
return FeatureSupported.isGetNamesOfVmsFromExternalProviderSupported(storagePoolDao
.get(getParameters().getDataCenterId())
.getCompatibilityVersion());
}
}