Federico Simoncelli has uploaded a new change for review.

Change subject: [wip] backend: add glance storage domain support
......................................................................

[wip] backend: add glance storage domain support

Change-Id: I3271b3c49907900e37560b63c8ce54d52c463a1e
Signed-off-by: Federico Simoncelli <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageDomainCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M 
backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/businessentities/StorageTypeTest.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainType.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageType.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
M backend/manager/modules/utils/pom.xml
12 files changed, 119 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/97/15897/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
index 744ff66..b4a3076 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
@@ -12,8 +12,13 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
+import com.woorea.openstack.glance.Glance;
+import com.woorea.openstack.glance.model.Image;
+import com.woorea.openstack.glance.model.Images;
+import com.woorea.openstack.keystone.utils.KeystoneTokenProvider;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.businessentities.ImageFileType;
+import org.ovirt.engine.core.common.businessentities.Provider;
 import org.ovirt.engine.core.common.businessentities.RepoImage;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
@@ -34,6 +39,7 @@
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
 import org.ovirt.engine.core.dao.RepoFileMetaDataDAO;
 import org.ovirt.engine.core.dao.StorageDomainDAO;
+import org.ovirt.engine.core.dao.provider.ProviderDao;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
 import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
@@ -58,6 +64,7 @@
     private static final ConcurrentMap<Object, Lock> syncDomainForFileTypeMap 
= new ConcurrentHashMap<Object, Lock>();
     private int isoDomainRefreshRate;
     RepoFileMetaDataDAO repoStorageDom;
+    ProviderDao providerDao;
     public static final String TOOL_CLUSTER_LEVEL = "clusterLevel";
     public static final String TOOL_VERSION = "toolVersion";
     public static final String REGEX_TOOL_PATTERN =
@@ -81,6 +88,7 @@
     protected void init() {
         log.info("Start initializing " + getClass().getSimpleName());
         repoStorageDom = DbFacade.getInstance().getRepoFileMetaDataDao();
+        providerDao = DbFacade.getInstance().getProviderDao();
         isoDomainRefreshRate = Config.<Integer> 
GetValue(ConfigValues.AutoRepoDomainRefreshTime) * MIN_TO_MILLISECONDS;
         SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(this,
                 "fetchIsoDomains",
@@ -175,25 +183,89 @@
     }
 
     private boolean refreshRepos(Guid storageDomainId, ImageFileType 
imageType, boolean forceRefresh) {
-        boolean res = true;
+        boolean refreshResult = false;
         List<RepoImage> tempProblematicRepoFileList = new 
ArrayList<RepoImage>();
-        // If user choose to force refresh.
-        if (forceRefresh) {
-            // Add an audit log if refresh succeeded.
-            if (refreshIsoDomain(storageDomainId, tempProblematicRepoFileList, 
imageType)) {
-                // Print log Indicating the problematic pools (If was any).
-                handleErrorLog(tempProblematicRepoFileList);
+        StorageDomain storageDomain = 
DbFacade.getInstance().getStorageDomainDao().get(storageDomainId);
 
-                // If refresh succeeded print an audit log Indicating that.
-                StorageDomain storageDomain = 
DbFacade.getInstance().getStorageDomainDao().get(storageDomainId);
-                addToAuditLogSuccessMessage(storageDomain.getStorageName(), 
imageType.name());
-            } else {
-                // Print log Indicating the problematic pools.
-                handleErrorLog(tempProblematicRepoFileList);
-                res=false;
-            }
+        if (!forceRefresh) {
+            return true;
         }
-        return res;
+
+        if (storageDomain.getStorageDomainType() == StorageDomainType.ISO) {
+            refreshResult = refreshIsoDomain(storageDomainId, 
tempProblematicRepoFileList, imageType);
+        } else if (storageDomain.getStorageDomainType() == 
StorageDomainType.Image) {
+            refreshResult = refreshImageDomain(storageDomain, 
tempProblematicRepoFileList, imageType);
+        } else {
+            log.errorFormat("Unable to refresh the storage domain {0}, Storage 
Type {1} not supported",
+                    storageDomainId, storageDomain.getStorageDomainType());
+            return false;
+        }
+
+        handleErrorLog(tempProblematicRepoFileList);
+
+        // If refresh succeeded update the audit log
+        if (refreshResult) {
+            addToAuditLogSuccessMessage(storageDomain.getStorageName(), 
imageType.name());
+        }
+
+        return refreshResult;
+    }
+
+    private boolean refreshImageDomain(final StorageDomain storageDomain,
+            List<RepoImage> problematicRepoFileList, final ImageFileType 
imageType) {
+        final RepoFileMetaDataDAO repoFileMetaDataDao = repoStorageDom;
+
+        Provider glanceProvider = providerDao.get(new 
Guid(storageDomain.getStorage()));
+
+        Glance glanceClient = new Glance(glanceProvider.getUrl());
+
+        if (glanceProvider.isRequiringAuthentication()) {
+            String TENANT_NAME="ovirt"; // FIXME: add tenant to the providers
+            KeystoneTokenProvider tokenProvider = new KeystoneTokenProvider(
+                    Config.<String> GetValue(ConfigValues.KeystoneAuthUrl),
+                    glanceProvider.getUsername(), 
glanceProvider.getPassword());
+            
glanceClient.setTokenProvider(tokenProvider.getProviderByTenant(TENANT_NAME));
+        }
+
+        final Images images = glanceClient.images().list(false).execute();
+
+        Lock syncObject = getSyncObject(storageDomain.getId(), imageType);
+        try {
+            syncObject.lock();
+            return (Boolean) 
TransactionSupport.executeInScope(TransactionScopeOption.RequiresNew,
+                    new TransactionMethod<Object>() {
+                        @Override
+                        public Object runInTransaction() {
+                            long currentTime = System.currentTimeMillis();
+                            
repoFileMetaDataDao.removeRepoDomainFileList(storageDomain.getId(), imageType);
+                            RepoImage repo_md;
+                            for (Image image : images) {
+                                repo_md = new RepoImage();
+                                repo_md.setLastRefreshed(currentTime);
+                                repo_md.setSize(0);
+                                repo_md.setRepoDomainId(storageDomain.getId());
+                                repo_md.setDateCreated(null);
+                                repo_md.setRepoImageId(image.getId());
+                                repo_md.setRepoImageName(image.getName());
+                                if (image.getDiskFormat() == null) {
+                                    repo_md.setFileType(ImageFileType.Unknown);
+                                } else {
+                                    if (image.getDiskFormat().equals("raw") || 
image.getDiskFormat().equals("qcow2")) {
+                                        
repo_md.setFileType(ImageFileType.Disk);
+                                    } else if 
(image.getDiskFormat().equals("iso")) {
+                                        repo_md.setFileType(ImageFileType.ISO);
+                                    } else {
+                                        
repo_md.setFileType(ImageFileType.Unknown);
+                                    }
+                                }
+                                repoFileMetaDataDao.addRepoFileMap(repo_md);
+                            }
+                            return true;
+                        }
+                    });
+        } finally {
+            syncObject.unlock();
+        }
     }
 
     /**
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageDomainCommand.java
index 66f95f5..04fb64d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageDomainCommand.java
@@ -126,6 +126,11 @@
             return false;
         }
 
+        if (dom.getStorageType() == StorageType.GLANCE) {
+            
addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_MANAGE_STORAGE_DOMAIN);
+            return false;
+        }
+
         return true;
     }
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainType.java
index a81bbc6..8dd1c02 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainType.java
@@ -6,6 +6,7 @@
     Data,
     ISO,
     ImportExport,
+    Image,
     Unknown;
 
     public int getValue() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageType.java
index 2e87671..c9b6fbf 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageType.java
@@ -10,6 +10,7 @@
     LOCALFS(4, true),
     POSIXFS(6, true),
     GLUSTERFS(7, true),
+    GLANCE(8, true),
     // CIFS(5)
     ALL(-1, false);
 
@@ -44,7 +45,7 @@
     }
 
     public boolean isFileDomain() {
-        return this == NFS || this == POSIXFS || this == LOCALFS || this == 
GLUSTERFS;
+        return this == NFS || this == POSIXFS || this == LOCALFS || this == 
GLUSTERFS || this == GLANCE;
     }
 
     public boolean isBlockDomain() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 3933949..b08bfe7 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -449,6 +449,7 @@
     
ERROR_CANNOT_ADD_EXISTING_STORAGE_DOMAIN_CONNECTION_DATA_ILLEGAL(ErrorType.BAD_PARAMETERS),
     
ERROR_CANNOT_RECOVERY_STORAGE_POOL_STORAGE_TYPE_MISSMATCH(ErrorType.BAD_PARAMETERS),
     ERROR_CANNOT_REMOVE_STORAGE_DOMAIN_DO_FORMAT(ErrorType.BAD_PARAMETERS),
+    ERROR_CANNOT_MANAGE_STORAGE_DOMAIN(ErrorType.NOT_SUPPORTED),
     ERROR_CANNOT_FIND_ISO_IMAGE_PATH(ErrorType.BAD_PARAMETERS),
     ERROR_CANNOT_FIND_FLOPPY_IMAGE_PATH(ErrorType.BAD_PARAMETERS),
     VAR__TYPE__STORAGE__POOL,
diff --git 
a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/businessentities/StorageTypeTest.java
 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/businessentities/StorageTypeTest.java
index 7bea2fb..7ca27a2 100644
--- 
a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/businessentities/StorageTypeTest.java
+++ 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/businessentities/StorageTypeTest.java
@@ -14,6 +14,7 @@
         Assert.assertTrue(StorageType.LOCALFS.isFileDomain());
         Assert.assertTrue(StorageType.POSIXFS.isFileDomain());
         Assert.assertTrue(StorageType.GLUSTERFS.isFileDomain());
+        Assert.assertTrue(StorageType.GLANCE.isFileDomain());
     }
 
     @Test
@@ -24,10 +25,11 @@
         Assert.assertFalse(StorageType.LOCALFS.isBlockDomain());
         Assert.assertFalse(StorageType.POSIXFS.isBlockDomain());
         Assert.assertFalse(StorageType.GLUSTERFS.isBlockDomain());
+        Assert.assertFalse(StorageType.GLANCE.isBlockDomain());
     }
 
     @Test
     public void testNewStorageTypes() {
-        Assert.assertTrue("A storage type was added/removed. Update this test, 
and the isFileDomain/isBlockDomain method accordingly", 
StorageType.values().length == 8);
+        Assert.assertTrue("A storage type was added/removed. Update this test, 
and the isFileDomain/isBlockDomain method accordingly", 
StorageType.values().length == 9);
     }
 }
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index 054bce0..ce59c42 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -372,6 +372,7 @@
 ERROR_CANNOT_REMOVE_STORAGE_POOL_WITH_NONMASTER_DOMAINS=Cannot remove Data 
Center while there are more than one Storage Domain attached.
 ERROR_CANNOT_REMOVE_STORAGE_DOMAIN_DO_FORMAT=Cannot remove Storage Domain. 
Data storage must be formatted after remove.\n\
        -Please verify that Format option is enabled on the Data Domain.
+ERROR_CANNOT_MANAGE_STORAGE_DOMAIN=Cannot manage Storage Domain. The domain is 
defined externally (e.g. through a provider).
 ERROR_CANNOT_FORCE_REMOVE_STORAGE_POOL_WITH_VDS_NOT_IN_MAINTENANCE=Cannot 
${action} ${type} while there are Hosts that are not in Maintenance mode.
 ACTION_TYPE_FAILED_STORAGE_POOL_STATUS_ILLEGAL=Cannot ${action} ${type}. 
Unknown Data Center status.
 NETWORK_BOND_NAME_EXISTS=Bond name already exists.
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainType.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainType.java
index 2f31105..e10b33f 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainType.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainType.java
@@ -17,7 +17,7 @@
 package org.ovirt.engine.api.model;
 
 public enum StorageDomainType {
-    DATA, ISO, EXPORT;
+    DATA, ISO, EXPORT, IMAGE;
 
     public String value() {
         return name().toLowerCase();
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageType.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageType.java
index 95daeb9..05e1520 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageType.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageType.java
@@ -22,7 +22,8 @@
     NFS,
     LOCALFS,
     POSIXFS,
-    GLUSTERFS;
+    GLUSTERFS,
+    GLANCE;
 
     public String value() {
         return name().toLowerCase();
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
index d7f0ae9..982afa7 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java
@@ -38,7 +38,7 @@
         extends AbstractBackendCollectionResourceTest<StorageDomain, 
org.ovirt.engine.core.common.businessentities.StorageDomain, 
BackendStorageDomainsResource> {
 
     protected static final StorageDomainType[] TYPES = { 
StorageDomainType.DATA,
-            StorageDomainType.ISO, StorageDomainType.EXPORT };
+            StorageDomainType.ISO, StorageDomainType.EXPORT, 
StorageDomainType.IMAGE };
     protected static final StorageType[] STORAGE_TYPES = { StorageType.NFS, 
StorageType.NFS,
             StorageType.LOCALFS, StorageType.POSIXFS };
 
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
index 19927bd..b39523e 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
@@ -209,6 +209,8 @@
             return StorageDomainType.ISO.value();
         case ImportExport:
             return StorageDomainType.EXPORT.value();
+        case Image:
+            return StorageDomainType.IMAGE.value();
         case Unknown:
         default:
             return null;
diff --git a/backend/manager/modules/utils/pom.xml 
b/backend/manager/modules/utils/pom.xml
index 2318188..5edde91 100644
--- a/backend/manager/modules/utils/pom.xml
+++ b/backend/manager/modules/utils/pom.xml
@@ -143,6 +143,18 @@
       <artifactId>infinispan-core</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>com.woorea</groupId>
+      <artifactId>keystone-client</artifactId>
+      <version>${openstack-client.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.woorea</groupId>
+      <artifactId>glance-client</artifactId>
+      <version>${openstack-client.version}</version>
+    </dependency>
+
   </dependencies>
 
   <build>


-- 
To view, visit http://gerrit.ovirt.org/15897
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3271b3c49907900e37560b63c8ce54d52c463a1e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to