package org.ovirt.engine.core.bll.provider.vms; import javax.inject.Inject; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.provider.ProviderProxy; import org.ovirt.engine.core.bll.provider.ProviderValidator; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VmProviderProperties; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineException; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.queries.GetVmsFromExternalProviderQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.StoragePoolDao; import org.ovirt.engine.core.dao.VdsDao; public abstract class AbstractVmProviderProxy<P extends VmProviderProperties> implements ProviderProxy { protected Provider<P> provider; @Inject private StoragePoolDao storagePoolDao; protected AbstractVmProviderProxy(Provider<P> provider) { this.provider = provider; } @Override public void testConnection() { chooseDcForCheckingIfGetNamesFromExternalProviderSupported(); VdcQueryReturnValue retVal = Backend.getInstance().runInternalQuery( VdcQueryType.GetVmsFromExternalProvider, buildGetVmsFromExternalProviderQueryParameters()); if (!retVal.getSucceeded()) { throw new EngineException(EngineError.PROVIDER_FAILURE, retVal.getExceptionString()); } } protected abstract GetVmsFromExternalProviderQueryParameters buildGetVmsFromExternalProviderQueryParameters(); public ProviderValidator getProviderValidator() { return new ProviderValidator<P>(provider) { @Override public ValidationResult validateAddProvider() { P properties = provider.getAdditionalProperties(); Guid proxyHostId = properties.getProxyHostId(); if (proxyHostId != null) { VDS proxyHost = getVdsDao().get(proxyHostId); if (proxyHost == null) { return new ValidationResult(EngineMessage.VDS_DOES_NOT_EXIST); } if (!proxyHost.getStoragePoolId().equals(properties.getStoragePoolId())) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_VDS_NOT_IN_DEST_STORAGE_POOL); } } return ValidationResult.VALID; } private VdsDao getVdsDao() { return DbFacade.getInstance().getVdsDao(); } }; } private void chooseDcForCheckingIfGetNamesFromExternalProviderSupported() { Version chosenDataCenterVersion = null; Guid chosenDataCenterId = provider.getAdditionalProperties().getStoragePoolId(); if (chosenDataCenterId == null) { // find data center with highest version for (StoragePool sp : storagePoolDao.getAllByStatus(StoragePoolStatus.Up)) { if (chosenDataCenterVersion == null || chosenDataCenterVersion.less(sp.getCompatibilityVersion())) { chosenDataCenterVersion = sp.getCompatibilityVersion(); chosenDataCenterId = sp.getId(); } } provider.getAdditionalProperties().setStoragePoolId(chosenDataCenterId); } } }