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
