Martin Mucha has uploaded a new change for review.

Change subject: core: altered IsoDomainListSyncronizer to refresh and return 
really *all* files if asked for it
......................................................................

core: altered IsoDomainListSyncronizer to refresh and return really *all* files 
if asked for it

• formerly when asked to refresh resp. get files using
org.ovirt.engine.core.common.businessentities.storage.ImageFileType#All
type, only 'ISO' and 'Floppy' were refreshed resp. obtained. After
this change all files are listed by vdsm and stored in db upon such
request.

• having no way here to identify type of files,
IsoDomainListSyncronizer will store them into db with type 'Unknown'
assigned.

Change-Id: I85f93246f903c16e8fdf9054ab54b9d9a3184eed
Signed-off-by: Martin Mucha <mmu...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/IsoDomainListSyncronizer.java
1 file changed, 94 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/41276/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 2e14ca7..5aac44a 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
@@ -1,7 +1,9 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -81,8 +83,11 @@
                     getGuestToolsSetupIsoPrefix(),
                     TOOL_CLUSTER_LEVEL,
                     TOOL_VERSION);
-    public static final String ISO_FILE_PATTERN = "*.iso";
-    public static final String FLOPPY_FILE_PATTERN = "*.vfd";
+    public static final String ISO_VDSM_FILE_PATTERN = "*.iso";
+    public static final String ISO_FILE_PATTERN_REGEX = "^.*\\.iso$";
+    public static final String FLOPPY_VDSM_FILE_PATTERN = "*.vfd";
+    public static final String FLOPPY_FILE_PATTERN_REGEX = "^.*\\.vfd$";
+    public static final String ALL_FILES_PATTERN = "*";
 
     // Not kept as static member to enable reloading the config value
     public static String getGuestToolsSetupIsoPrefix() {
@@ -276,29 +281,33 @@
     private boolean refreshIsoDomainFileForStoragePool(Guid storageDomainId,
             Guid storagePoolId,
             ImageFileType imageType) {
-        boolean refreshSucceeded = false;
+
         // Setting the indication to the indication whether the storage pool 
is valid.
-        boolean updateFromVDSMSucceeded = true;
-
-        // If the SPM and the storage pool are valid, try to refresh the Iso 
list by fetching it from the SPM.
-        if (imageType == ImageFileType.ISO || imageType == ImageFileType.All) {
-            updateFromVDSMSucceeded = updateIsoListFromVDSM(storagePoolId, 
storageDomainId);
-        }
-
-        if (imageType == ImageFileType.Floppy || imageType == 
ImageFileType.All) {
-            updateFromVDSMSucceeded =
-                    updateFloppyListFromVDSM(storagePoolId, storageDomainId) 
&& updateFromVDSMSucceeded;
-        }
+        boolean updateFromVDSMSucceeded = updateFileList(storageDomainId, 
storagePoolId, imageType);
 
         // Log if the refresh succeeded or add the storage domain to the 
problematic list.
         if (updateFromVDSMSucceeded) {
-            refreshSucceeded = true;
             log.debug("Refresh succeeded for file type '{}' at storage domain 
id '{}' in storage pool id '{}'.",
                     imageType.name(),
                     storageDomainId,
                     storagePoolId);
         }
-        return refreshSucceeded;
+
+        return updateFromVDSMSucceeded;
+    }
+
+    private boolean updateFileList(Guid storageDomainId, Guid storagePoolId, 
ImageFileType imageType) {
+        switch (imageType) {
+        case All:
+            return updateAllFileListFromVDSM(storagePoolId, storageDomainId);
+        case ISO:
+            return updateIsoListFromVDSM(storagePoolId, storageDomainId);
+        case Floppy:
+            return updateFloppyListFromVDSM(storagePoolId, storageDomainId);
+        default:
+            log.warn("Refreshing Iso domain using unsupported imageType: {}", 
imageType);
+            return false;
+        }
     }
 
     /**
@@ -648,6 +657,45 @@
         return ((System.currentTimeMillis() - lastRefreshed) > 
isoDomainRefreshRate);
     }
 
+    private boolean updateAllFileListFromVDSM(Guid repoStoragePoolId, Guid 
repoStorageDomainId) {
+        VDSReturnValue fileStatsVDSReturnValue = 
getFileStats(repoStoragePoolId,
+                repoStorageDomainId,
+                ALL_FILES_PATTERN,
+                null);
+
+        Map<String, Map<String, Object>> fileStats = 
fileStatsFromVDSReturnValue(fileStatsVDSReturnValue);
+        updateIsoListFromVDSM(repoStoragePoolId,
+                repoStorageDomainId,
+                removeFileStatsForComplyingFileNames(fileStats, 
ISO_FILE_PATTERN_REGEX));
+
+        updateFloppyListFromVDSM(repoStoragePoolId,
+                repoStorageDomainId,
+                removeFileStatsForComplyingFileNames(fileStats, 
FLOPPY_FILE_PATTERN_REGEX));
+
+        //all remaining fileStats are uncategorized, of ImageFileType.Unknown 
type
+        return refreshVdsmFileList(repoStoragePoolId,
+                repoStorageDomainId,
+                ImageFileType.Unknown,
+                fileStats,
+                null);
+    }
+
+    private Map<String, Map<String, Object>> 
removeFileStatsForComplyingFileNames(Map<String, Map<String, Object>> fileStats,
+            String isoFilePatternRegex) {
+
+        Map<String, Map<String, Object>> result = new HashMap<>();
+        for (Iterator<Map.Entry<String, Map<String, Object>>> it = 
fileStats.entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry<String, Map<String, Object>> entry = it.next();
+            String fileName = entry.getKey();
+            if (fileName.matches(isoFilePatternRegex)) {
+                result.put(fileName, entry.getValue());
+                it.remove();
+            }
+        }
+
+        return result;
+    }
+
     /**
      * Gets the Iso file list from VDSM, and if the fetch is valid refresh the 
Iso list in the DB.
      *
@@ -656,14 +704,18 @@
      *
      * @return True, if the fetch from VDSM has succeeded. False otherwise.
      */
-    private boolean updateIsoListFromVDSM(Guid repoStoragePoolId,
-            Guid repoStorageDomainId) {
 
+    private boolean updateIsoListFromVDSM(Guid repoStoragePoolId, Guid 
repoStorageDomainId) {
         VDSReturnValue fileStats = getFileStats(repoStoragePoolId,
                 repoStorageDomainId,
-                ISO_FILE_PATTERN,
+                ISO_VDSM_FILE_PATTERN,
                 VDSCommandType.GetIsoList);
 
+        return updateIsoListFromVDSM(repoStoragePoolId, repoStorageDomainId, 
fileStatsFromVDSReturnValue(fileStats));
+    }
+
+    private boolean updateIsoListFromVDSM(Guid repoStoragePoolId,
+            Guid repoStorageDomainId, Map<String, Map<String, Object>> 
fileStats) {
         FileListRefreshed fileListRefreshed = new FileListRefreshed() {
             @Override
             public void onFileListRefreshed(Guid poolId, Set<String> isoList) {
@@ -673,15 +725,14 @@
 
         return refreshVdsmFileList(repoStoragePoolId,
                 repoStorageDomainId,
-                fileListRefreshed,
-                ImageFileType.ISO,
-                fileStatsFromVDSReturnValue(fileStats));
+                ImageFileType.ISO, fileStats, fileListRefreshed);
     }
 
     private boolean refreshVdsmFileList(Guid repoStoragePoolId,
             Guid repoStorageDomainId,
-            FileListRefreshed fileListRefreshed,
-            ImageFileType imageFileType, Map<String, Map<String, Object>> 
fileStats) {
+            ImageFileType imageFileType,
+            Map<String, Map<String, Object>> fileStats,
+            FileListRefreshed fileListRefreshed) {
 
         if (repoStorageDomainId == null) {
             return false;
@@ -741,14 +792,18 @@
 
         VDSReturnValue fileStats = getFileStats(repoStoragePoolId,
                 repoStorageDomainId,
-                FLOPPY_FILE_PATTERN,
+                FLOPPY_VDSM_FILE_PATTERN,
                 VDSCommandType.GetFloppyList);
 
+        return updateFloppyListFromVDSM(repoStoragePoolId, 
repoStorageDomainId, fileStatsFromVDSReturnValue(fileStats));
+    }
+
+    private boolean updateFloppyListFromVDSM(Guid repoStoragePoolId,
+            Guid repoStorageDomainId, Map<String, Map<String, Object>> 
fileStats) {
         return refreshVdsmFileList(repoStoragePoolId,
                 repoStorageDomainId,
-                null,
-                ImageFileType.Floppy,
-                fileStatsFromVDSReturnValue(fileStats));
+                ImageFileType.Floppy, fileStats, null
+        );
     }
 
     private String succeededOrFailed(boolean status) {
@@ -762,15 +817,23 @@
         StoragePool dc = getStoragePoolDAO().get(repoStoragePoolId);
         VDSBrokerFrontend resourceManager = 
Backend.getInstance().getResourceManager();
 
-        if (FeatureSupported.getFileStats(dc.getCompatibilityVersion())) {
+        boolean vdsmFileStatsSupported = 
FeatureSupported.getFileStats(dc.getCompatibilityVersion());
+        if (vdsmFileStatsSupported) {
             GetFileStatsParameters parameters = new 
GetFileStatsParameters(repoStoragePoolId,
                     repoStorageDomainId,
                     filePattern,
                     false);
             return resourceManager.RunVdsCommand(VDSCommandType.GetFileStats, 
parameters);
         } else {
-            return resourceManager.RunVdsCommand(alternateGetFileStatsCommand,
-                    new IrsBaseVDSCommandParameters(repoStoragePoolId));
+            if (alternateGetFileStatsCommand == null) {
+                //TODO MM: can I assume, that this need not to be 'forward' 
compatible and remove this?
+                VDSReturnValue vdsReturnValue = new VDSReturnValue();
+                vdsReturnValue.setSucceeded(false);
+                return vdsReturnValue;
+            } else {
+                return 
resourceManager.RunVdsCommand(alternateGetFileStatsCommand,
+                        new IrsBaseVDSCommandParameters(repoStoragePoolId));
+            }
         }
     }
 


-- 
To view, visit https://gerrit.ovirt.org/41276
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I85f93246f903c16e8fdf9054ab54b9d9a3184eed
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Martin Mucha <mmu...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to