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

Reply via email to