Daniel Erez has uploaded a new change for review. Change subject: core: OpenStackVolumeProviderProxy and CINDERStorageHelper ......................................................................
core: OpenStackVolumeProviderProxy and CINDERStorageHelper Introducing: * OpenStackVolumeProviderProxy - a proxy for handling Cinder provider actions. * CINDERStorageHelper - an helper for executing commands in Cinder SDK. Change-Id: Ie94f2f8581174cf820d908ba3b51de7564d8a0d4 Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Daniel Erez <de...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/storage/OpenStackVolumeProviderProxy.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CINDERStorageHelper.java 2 files changed, 196 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/38911/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/storage/OpenStackVolumeProviderProxy.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/storage/OpenStackVolumeProviderProxy.java new file mode 100644 index 0000000..13cd9a8 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/storage/OpenStackVolumeProviderProxy.java @@ -0,0 +1,83 @@ +package org.ovirt.engine.core.bll.provider.storage; + +import com.woorea.openstack.cinder.Cinder; +import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; +import org.ovirt.engine.core.bll.storage.CINDERStorageHelper; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; +import org.ovirt.engine.core.common.businessentities.storage.OpenStackVolumeProviderProperties; +import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainType; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; +import org.ovirt.engine.core.compat.Guid; + +import java.security.cert.Certificate; +import java.util.List; + +public class OpenStackVolumeProviderProxy extends AbstractOpenStackStorageProviderProxy<Cinder, OpenStackVolumeProviderProperties, CinderProviderValidator> { + + private static final String API_VERSION = "/v2/"; + public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + + public OpenStackVolumeProviderProxy(Provider<OpenStackVolumeProviderProperties> provider) { + this.provider = provider; + } + + @Override + public List<? extends Certificate> getCertificateChain() { + return null; + } + + @Override + public void onAddition() { + Guid storageDomainId = addStorageDomain(StorageType.CINDER, StorageDomainType.Volume); + Guid storagePoolId = provider.getAdditionalProperties().getStoragePoolId(); + if (!storagePoolId.equals(Guid.Empty)) { + attachStorageDomainToDataCenter(storageDomainId, storagePoolId); + } + } + + protected void attachStorageDomainToDataCenter(Guid storageDomainId, Guid storagePoolId) { + CINDERStorageHelper CINDERStorageHelper = new CINDERStorageHelper(false); + CINDERStorageHelper.attachCinderDomainToPool(storageDomainId, storagePoolId); + CINDERStorageHelper.activateCinderDomain(storageDomainId, storagePoolId); + } + + protected Cinder getClient() { + return getClient(""); + } + + protected Cinder getClient(String tenantId) { + if (client == null) { + client = new Cinder(getProvider().getUrl().concat(API_VERSION).concat(tenantId)); + client.setTokenProvider(getTokenProvider()); + } + return client; + } + + @Override + public void onRemoval() { + List<StorageDomain> storageDomains = getDbFacade().getStorageDomainDao().getAllByConnectionId(provider.getId()); + // removing the static and dynamic storage domain entries + for (StorageDomain storageDomainEntry : storageDomains) { + getDbFacade().getStorageDomainDao().remove(storageDomainEntry.getId()); + } + } + + public static OpenStackVolumeProviderProxy getFromStorageDomainId(Guid storageDomainId) { + StorageDomainStatic storageDomainStatic = getDbFacade().getStorageDomainStaticDao().get(storageDomainId); + if (storageDomainStatic != null) { + Provider provider = getDbFacade().getProviderDao().get(new Guid(storageDomainStatic.getStorage())); + return ProviderProxyFactory.getInstance().create(provider); + } + return null; + } + + @Override + public CinderProviderValidator getProviderValidator() { + if (providerValidator == null) { + providerValidator = new CinderProviderValidator(provider); + } + return providerValidator; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CINDERStorageHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CINDERStorageHelper.java new file mode 100644 index 0000000..2dbc963 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CINDERStorageHelper.java @@ -0,0 +1,113 @@ +package org.ovirt.engine.core.bll.storage; + +import org.ovirt.engine.core.bll.provider.storage.OpenStackVolumeProviderProxy; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; +import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; +import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcFault; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; +import org.ovirt.engine.core.dao.StoragePoolIsoMapDAO; +import org.ovirt.engine.core.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.Callable; + +public class CINDERStorageHelper extends StorageHelperBase { + + private Logger log = LoggerFactory.getLogger(CINDERStorageHelper.class); + + private boolean runInNewTransaction; + + public CINDERStorageHelper() { + this(true); + } + + public CINDERStorageHelper(boolean runInNewTransaction) { + this.runInNewTransaction = runInNewTransaction; + } + + @Override + protected Pair<Boolean, VdcFault> runConnectionStorageToDomain(StorageDomain storageDomain, Guid vdsId, int type) { + return new Pair<>(true, null); + } + + private <T> void execute(final Callable<T> callable) { + if (runInNewTransaction) { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { + @Override + public Object runInTransaction() { + invokeCallable(callable); + return null; + } + }); + } else { + invokeCallable(callable); + } + } + + private <T> void invokeCallable(Callable<T> callable) { + try { + callable.call(); + } catch (Exception e) { + log.error("Error in CinderStorageHelper.", e); + } + } + + public void attachCinderDomainToPool(final Guid storageDomainId, final Guid storagePoolId) { + execute(new Callable<Object>() { + @Override + public Object call() { + StoragePoolIsoMap storagePoolIsoMap = + new StoragePoolIsoMap(storageDomainId, storagePoolId, StorageDomainStatus.Maintenance); + getStoragePoolIsoMapDAO().save(storagePoolIsoMap); + return null; + } + }); + } + + public void activateCinderDomain(Guid storageDomainId, Guid storagePoolId) { + OpenStackVolumeProviderProxy proxy = OpenStackVolumeProviderProxy.getFromStorageDomainId(storageDomainId); + try { + proxy.testConnection(); + updateCinderDomainStatus(storageDomainId, storagePoolId, StorageDomainStatus.Active); + } catch (VdcBLLException e) { + AuditLogableBase loggable = new AuditLogableBase(); + loggable.addCustomValue("CinderException", e.getCause().getCause() != null ? + e.getCause().getCause().getMessage() : e.getCause().getMessage()); + new AuditLogDirector().log(loggable, AuditLogType.CINDER_PROVIDER_ERROR); + throw e; + } + } + + private void updateCinderDomainStatus(final Guid storageDomainId, + final Guid storagePoolId, + final StorageDomainStatus storageDomainStatus) { + execute(new Callable<Object>() { + @Override + public Object call() { + StoragePoolIsoMap map = + getStoragePoolIsoMapDAO().get(new StoragePoolIsoMapId(storageDomainId, storagePoolId)); + map.setStatus(storageDomainStatus); + getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getStatus()); + return null; + } + }); + } + + private StoragePoolIsoMapDAO getStoragePoolIsoMapDAO() { + return DbFacade.getInstance().getStoragePoolIsoMapDao(); + } + + private static DbFacade getDbFacade() { + return DbFacade.getInstance(); + } +} -- To view, visit https://gerrit.ovirt.org/38911 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie94f2f8581174cf820d908ba3b51de7564d8a0d4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches