Idan Shaby has uploaded a new change for review.

Change subject: core: redesign MemoryStorageHandler to use filters
......................................................................

core: redesign MemoryStorageHandler to use filters

This patch doesn't change the behavior of MemoryStorageHandler.
Instead, it changes the way we select storage domains for memory
volumes to use filters. Each filter verifies that every domain meets a
specific condition, and removes those who don't from the list of
candidates.
This way, one can simply add a new filter to the list and add new logic
to the domain selection.

Change-Id: Iff7094a2351ab0755ff21ba3ccfc4b8bc5cfff6c
Bug-Url: https://bugzilla.redhat.com/1186230
Signed-off-by: Idan Shaby <ish...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilter.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilter.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilter.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilter.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java
11 files changed, 386 insertions(+), 113 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/37/40437/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java
index 20d3912..7904374 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java
@@ -1,12 +1,15 @@
 package org.ovirt.engine.core.bll.memory;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
+import 
org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainFilter;
+import 
org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainSpaceRequirementsFilter;
+import 
org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainStatusFilter;
+import 
org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainTypeFilter;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
-import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
 import org.ovirt.engine.core.common.businessentities.storage.StorageType;
 import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
@@ -38,27 +41,14 @@
     public StorageDomain findStorageDomainForMemory(Guid storagePoolId, 
List<DiskImage> disksList) {
         List<StorageDomain> domainsInPool =
                 
DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(storagePoolId);
-        return findStorageDomainForMemory(domainsInPool, disksList);
-    }
-
-    protected StorageDomain findStorageDomainForMemory(List<StorageDomain> 
domainsInPool, List<DiskImage> disksList) {
-        for (StorageDomain currDomain : domainsInPool) {
-
-            updateDisksStorage(currDomain, disksList);
-            if (currDomain.getStorageDomainType().isDataDomain()
-                    && currDomain.getStatus() == StorageDomainStatus.Active
-                    && validateSpaceRequirements(currDomain, disksList)) {
-                return currDomain;
-            }
+        StorageDomain storageDomainForMemory = 
findStorageDomainForMemory(domainsInPool, disksList);
+        if (storageDomainForMemory != null) {
+            updateDisksStorage(storageDomainForMemory, disksList);
         }
-        return null;
+        return storageDomainForMemory;
     }
 
-    protected StorageDomainValidator getStorageDomainValidator(StorageDomain 
storageDomain) {
-        return new StorageDomainValidator(storageDomain);
-    }
-
-    protected void updateDisksStorage(StorageDomain storageDomain, 
List<DiskImage> disksList) {
+    public void updateDisksStorage(StorageDomain storageDomain, 
List<DiskImage> disksList) {
         for (DiskImage disk : disksList) {
             disk.setStorageIds(new 
ArrayList<Guid>(Collections.singletonList(storageDomain.getId())));
         }
@@ -69,14 +59,26 @@
         updateDiskVolumeType(storageDomain.getStorageType(), disksList.get(0));
     }
 
+    protected StorageDomain findStorageDomainForMemory(List<StorageDomain> 
domainsInPool, List<DiskImage> disksList) {
+        domainsInPool = filterStorageDomains(domainsInPool, disksList);
+        return domainsInPool.isEmpty() ? null : domainsInPool.get(0);
+    }
+
+    protected List<? extends StorageDomainFilter> getStorageDomainFilters() {
+        return Arrays.asList(new StorageDomainStatusFilter(),
+                new StorageDomainTypeFilter(),
+                new StorageDomainSpaceRequirementsFilter());
+    }
+
+    protected List<StorageDomain> filterStorageDomains(List<StorageDomain> 
domainsInPool, List<DiskImage> disksList) {
+        for (StorageDomainFilter storageDomainFilter : 
getStorageDomainFilters()) {
+            domainsInPool = 
storageDomainFilter.filterStorageDomains(domainsInPool, disksList);
+        }
+        return domainsInPool;
+    }
+
     private void updateDiskVolumeType(StorageType storageType, DiskImage disk) 
{
         VolumeType volumeType = storageType.isFileDomain() ? VolumeType.Sparse 
: VolumeType.Preallocated;
         disk.setVolumeType(volumeType);
-    }
-
-    private boolean validateSpaceRequirements(StorageDomain storageDomain, 
List<DiskImage> disksList) {
-        StorageDomainValidator storageDomainValidator = 
getStorageDomainValidator(storageDomain);
-        return (storageDomainValidator.isDomainWithinThresholds().isValid() &&
-                
storageDomainValidator.hasSpaceForClonedDisks(disksList).isValid());
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilter.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilter.java
new file mode 100644
index 0000000..3be28cc
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilter.java
@@ -0,0 +1,25 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public abstract class StorageDomainFilter {
+
+    public List<StorageDomain> filterStorageDomains(List<StorageDomain> 
domainsInPool, List<DiskImage> disksList) {
+        domainsInPool = new LinkedList<>(domainsInPool);
+        Iterator<StorageDomain> iterator = domainsInPool.iterator();
+        while (iterator.hasNext()) {
+            if (!getPredicate(disksList).eval(iterator.next())) {
+                iterator.remove();
+            }
+        }
+        return domainsInPool;
+    }
+
+    protected abstract Predicate<StorageDomain> getPredicate(final 
List<DiskImage> disksList);
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilter.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilter.java
new file mode 100644
index 0000000..3b7835a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilter.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.memory.MemoryStorageHandler;
+import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public class StorageDomainSpaceRequirementsFilter extends StorageDomainFilter {
+
+    @Override
+    protected Predicate<StorageDomain> getPredicate(final List<DiskImage> 
disksList) {
+        return new Predicate<StorageDomain>() {
+            @Override
+            public boolean eval(StorageDomain storageDomain) {
+                updateDisksStorage(storageDomain, disksList);
+                StorageDomainValidator storageDomainValidator = 
getStorageDomainValidator(storageDomain);
+                return 
storageDomainValidator.isDomainWithinThresholds().isValid() &&
+                        
storageDomainValidator.hasSpaceForClonedDisks(disksList).isValid();
+            }
+        };
+    }
+
+    protected void updateDisksStorage(StorageDomain storageDomain, 
List<DiskImage> disksList) {
+        MemoryStorageHandler.getInstance().updateDisksStorage(storageDomain, 
disksList);
+    }
+
+    protected StorageDomainValidator getStorageDomainValidator(StorageDomain 
storageDomain) {
+        return new StorageDomainValidator(storageDomain);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilter.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilter.java
new file mode 100644
index 0000000..9d6df7a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilter.java
@@ -0,0 +1,21 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public class StorageDomainStatusFilter extends StorageDomainFilter {
+
+    @Override
+    protected Predicate<StorageDomain> getPredicate(final List<DiskImage> 
disksList) {
+        return new Predicate<StorageDomain>() {
+            @Override
+            public boolean eval(StorageDomain storageDomain) {
+                return storageDomain.getStatus() == StorageDomainStatus.Active;
+            }
+        };
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilter.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilter.java
new file mode 100644
index 0000000..9d8331c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilter.java
@@ -0,0 +1,20 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public class StorageDomainTypeFilter extends StorageDomainFilter {
+
+    @Override
+    protected Predicate<StorageDomain> getPredicate(List<DiskImage> disksList) 
{
+        return new Predicate<StorageDomain>() {
+            @Override
+            public boolean eval(StorageDomain storageDomain) {
+                return storageDomain.getStorageDomainType().isDataDomain();
+            }
+        };
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java
index 14c3af4..7a8cda2 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java
@@ -1,14 +1,7 @@
 package org.ovirt.engine.core.bll.memory;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyCollectionOf;
-import static org.mockito.Matchers.anyListOf;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
 import java.util.LinkedList;
@@ -17,17 +10,13 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.Spy;
 import org.mockito.runners.MockitoJUnitRunner;
-import org.ovirt.engine.core.bll.ValidationResult;
-import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
+import 
org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainFilter;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
-import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
-import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
-import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.linq.Predicate;
 
 @RunWith(MockitoJUnitRunner.class)
 public class MemoryStorageHandlerTest {
@@ -35,13 +24,11 @@
     private StorageDomain validStorageDomain;
     private StorageDomain invalidStorageDomain1;
     private StorageDomain invalidStorageDomain2;
+    private StorageDomain invalidStorageDomain3;
+    private StorageDomainFilter filter1;
+    private StorageDomainFilter filter2;
+    private StorageDomainFilter filter3;
     private List<DiskImage> disksList;
-
-    @Mock
-    private StorageDomainValidator validStorageDomainValidator;
-
-    @Mock
-    private StorageDomainValidator invalidStorageDomainValidator;
 
     @Spy
     private MemoryStorageHandler memoryStorageHandler = 
MemoryStorageHandler.getInstance();
@@ -50,106 +37,84 @@
     public void setUp() {
         disksList = new LinkedList<>();
         initStorageDomains();
-        initStorageDomainValidators();
-        initMemoryStorageHandler();
+        initFilters();
     }
 
     @Test
-    public void verifyFirstDomainForMemory() {
-        verifyDomainForMemory(Arrays.asList(validStorageDomain, 
invalidStorageDomain1, invalidStorageDomain2));
+    public void filterAllDomainsExceptForTheFirstOne() {
+        filterAllStorageDomainsExceptOne(Arrays.asList(
+                validStorageDomain, invalidStorageDomain1, 
invalidStorageDomain2), validStorageDomain);
     }
 
     @Test
-    public void verifyMiddleDomainForMemory() {
-        verifyDomainForMemory(Arrays.asList(invalidStorageDomain1, 
validStorageDomain, invalidStorageDomain2));
+    public void filterAllDomainsExceptForTheSecondOne() {
+        filterAllStorageDomainsExceptOne(Arrays.asList(
+                invalidStorageDomain1, validStorageDomain, 
invalidStorageDomain2), validStorageDomain);
     }
 
     @Test
-    public void verifyLastDomainForMemory() {
-        verifyDomainForMemory(Arrays.asList(invalidStorageDomain1, 
invalidStorageDomain2, validStorageDomain));
+    public void filterAllDomainsExceptForTheThirdOne() {
+        filterAllStorageDomainsExceptOne(Arrays.asList(
+                invalidStorageDomain1, invalidStorageDomain2, 
validStorageDomain), validStorageDomain);
     }
 
     @Test
-    public void verifyNoDomainForMemoryWhenDomainIsNotDataDomain() {
-        for (StorageDomainType storageDomainType : StorageDomainType.values()) 
{
-            if (!storageDomainType.isDataDomain()) {
-                validStorageDomain.setStorageDomainType(storageDomainType);
-                verifyNoDomainForMemory(Arrays.asList(validStorageDomain));
-            }
-        }
-    }
-
-    @Test
-    public void verifyNoDomainForMemoryWhenDomainIsNotActive() {
-        for (StorageDomainStatus storageDomainStatus : 
StorageDomainStatus.values()) {
-            if (storageDomainStatus != StorageDomainStatus.Active) {
-                validStorageDomain.setStatus(storageDomainStatus);
-                verifyNoDomainForMemory(Arrays.asList(validStorageDomain));
-            }
-        }
-    }
-
-    @Test
-    public void verifyNoDomainForMemoryWhenDomainHasLowSpace() {
-        when(validStorageDomainValidator.isDomainWithinThresholds())
-                .thenReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN));
-        verifyNoDomainForMemory(Arrays.asList(validStorageDomain));
-    }
-
-    @Test
-    public void verifyNoDomainForMemoryWhenDomainHasNoSpaceForClonedDisks() {
-        
when(validStorageDomainValidator.hasSpaceForClonedDisks(anyCollectionOf(DiskImage.class)))
-                .thenReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN));
-        verifyNoDomainForMemory(Arrays.asList(validStorageDomain));
+    public void filterAllDomains() {
+        verifyDomainForMemory(Arrays.asList(invalidStorageDomain1, 
invalidStorageDomain2, invalidStorageDomain3), null);
     }
 
     private void initStorageDomains() {
         validStorageDomain = initStorageDomain();
         invalidStorageDomain1 = initStorageDomain();
         invalidStorageDomain2 = initStorageDomain();
+        invalidStorageDomain3 = initStorageDomain();
+    }
+
+    private void initFilters() {
+        filter1 = new StorageDomainRejectingFilter(invalidStorageDomain1);
+        filter2 = new StorageDomainRejectingFilter(invalidStorageDomain2);
+        filter3 = new StorageDomainRejectingFilter(invalidStorageDomain3);
+
+        List<StorageDomainFilter> storageDomainFilters =
+                Arrays.asList(filter1, filter2, filter3);
+        
doReturn(storageDomainFilters).when(memoryStorageHandler).getStorageDomainFilters();
     }
 
     private StorageDomain initStorageDomain() {
         StorageDomain storageDomain = new StorageDomain();
         storageDomain.setId(Guid.newGuid());
-        storageDomain.setStorageDomainType(StorageDomainType.Data);
-        storageDomain.setStatus(StorageDomainStatus.Active);
         return storageDomain;
     }
 
-    private void initStorageDomainValidators() {
-        initStorageDomainValidator(validStorageDomainValidator, 
ValidationResult.VALID);
-        initStorageDomainValidator(invalidStorageDomainValidator,
-                new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN));
+    private void filterAllStorageDomainsExceptOne(List<StorageDomain> 
storageDomains,
+            StorageDomain expectedStorageDomain) {
+        List<StorageDomain> filteredStorageDomains =
+                memoryStorageHandler.filterStorageDomains(storageDomains, 
disksList);
+        assertEquals(filteredStorageDomains, 
Arrays.asList(expectedStorageDomain));
     }
 
-    private void initStorageDomainValidator(StorageDomainValidator 
storageDomainValidator,
-            ValidationResult validationResult) {
-        
when(storageDomainValidator.isDomainWithinThresholds()).thenReturn(validationResult);
-        when(storageDomainValidator.hasSpaceForClonedDisks(disksList))
-                .thenReturn(validationResult);
+    private void verifyDomainForMemory(List<StorageDomain> storageDomains, 
StorageDomain expectedStorageDomain) {
+        StorageDomain storageDomain =
+                
memoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList);
+        assertEquals(expectedStorageDomain, storageDomain);
     }
 
-    private void initMemoryStorageHandler() {
-        
doNothing().when(memoryStorageHandler).updateDisksStorage(any(StorageDomain.class),
 anyListOf(DiskImage.class));
+    private static class StorageDomainRejectingFilter extends 
StorageDomainFilter {
 
-        doReturn(validStorageDomainValidator)
-                
.when(memoryStorageHandler).getStorageDomainValidator(validStorageDomain);
+        private final StorageDomain sdToReject;
 
-        doReturn(invalidStorageDomainValidator)
-                
.when(memoryStorageHandler).getStorageDomainValidator(invalidStorageDomain1);
-        doReturn(invalidStorageDomainValidator)
-                
.when(memoryStorageHandler).getStorageDomainValidator(invalidStorageDomain2);
-    }
+        private StorageDomainRejectingFilter(StorageDomain 
storageDomainToReject) {
+            this.sdToReject = storageDomainToReject;
+        }
 
-    private void verifyDomainForMemory(List<StorageDomain> storageDomains) {
-        StorageDomain storageDomain = 
memoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList);
-        assertNotNull(storageDomain);
-        assertEquals(storageDomain, validStorageDomain);
-    }
-
-    private void verifyNoDomainForMemory(List<StorageDomain> storageDomains) {
-        StorageDomain storageDomain = 
memoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList);
-        assertNull(storageDomain);
+        @Override
+        protected Predicate<StorageDomain> getPredicate(List<DiskImage> 
disksList) {
+            return new Predicate<StorageDomain>() {
+                @Override
+                public boolean eval(StorageDomain storageDomain) {
+                    return !sdToReject.equals(storageDomain);
+                }
+            };
+        }
     }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java
new file mode 100644
index 0000000..d7c0972
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java
@@ -0,0 +1,22 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Before;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+
+public class StorageDomainFilterAbstractTest {
+
+    protected StorageDomain storageDomain;
+    protected List<DiskImage> disksList;
+
+    @Before
+    public void setUp() {
+        storageDomain = new StorageDomain();
+        storageDomain.setId(Guid.newGuid());
+        disksList = new LinkedList<>();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java
new file mode 100644
index 0000000..0c04aa9
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java
@@ -0,0 +1,51 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+@RunWith(MockitoJUnitRunner.class)
+public class StorageDomainFilterTest extends StorageDomainFilterAbstractTest {
+
+    private StorageDomainFilter filter;
+
+    @Mock
+    private Predicate<StorageDomain> predicate;
+
+    @Test
+    public void testThatFilterRemovesStorageDomainFromList() {
+        List<StorageDomain> filteredDomains = filterStorageDomain(true);
+        assertTrue(filteredDomains.isEmpty());
+    }
+
+    @Test
+    public void testThatFilterDoesntRemoveStorageDomainFromList() {
+        List<StorageDomain> filteredDomains = filterStorageDomain(false);
+        assertEquals(filteredDomains, Arrays.asList(storageDomain));
+    }
+
+    private List<StorageDomain> filterStorageDomain(boolean 
removeStorageDomainFromList) {
+        filter = new StorageDomainFilter() {
+            @Override
+            protected Predicate<StorageDomain> getPredicate(List<DiskImage> 
disksList) {
+                return predicate;
+            }
+        };
+
+        
when(predicate.eval(storageDomain)).thenReturn(!removeStorageDomainFromList);
+
+        List<StorageDomain> storageDomains = Arrays.asList(storageDomain);
+        return filter.filterStorageDomains(storageDomains, disksList);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java
new file mode 100644
index 0000000..c954753
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java
@@ -0,0 +1,69 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+
+@RunWith(MockitoJUnitRunner.class)
+public class StorageDomainSpaceRequirementsFilterTest extends 
StorageDomainFilterAbstractTest {
+
+    @Spy
+    private StorageDomainSpaceRequirementsFilter filter = new 
StorageDomainSpaceRequirementsFilter();
+
+    @Mock
+    private StorageDomainValidator storageDomainValidator;
+
+    @Before
+    @Override
+    public void setUp() {
+        super.setUp();
+        initFilter();
+        initStorageDomainValidator();
+    }
+
+    @Test
+    public void testStorageDomainForMemoryIsValid() {
+        assertTrue(filter.getPredicate(disksList).eval(storageDomain));
+    }
+
+    @Test
+    public void testStorageDomainForMemoryIsNotValidWhenItHasLowSpace() {
+        when(storageDomainValidator.isDomainWithinThresholds())
+                .thenReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN));
+        assertFalse(filter.getPredicate(disksList).eval(storageDomain));
+    }
+
+    @Test
+    public void 
testStorageDomainForMemoryIsNotValidWhenItHasNoSpaceForClonedDisks() {
+        when(storageDomainValidator.hasSpaceForClonedDisks(disksList))
+                .thenReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN));
+        assertFalse(filter.getPredicate(disksList).eval(storageDomain));
+    }
+
+    private void initFilter() {
+        doNothing().when(filter).updateDisksStorage(any(StorageDomain.class), 
anyListOf(DiskImage.class));
+        
doReturn(storageDomainValidator).when(filter).getStorageDomainValidator(storageDomain);
+    }
+
+    private void initStorageDomainValidator() {
+        
when(storageDomainValidator.isDomainWithinThresholds()).thenReturn(ValidationResult.VALID);
+        when(storageDomainValidator.hasSpaceForClonedDisks(disksList))
+                .thenReturn(ValidationResult.VALID);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java
new file mode 100644
index 0000000..6039834
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.experimental.theories.DataPoints;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+
+@RunWith(Theories.class)
+public class StorageDomainStatusFilterTest extends 
StorageDomainFilterAbstractTest {
+
+    private StorageDomainStatusFilter filter;
+
+    @Before
+    @Override
+    public void setUp() {
+        super.setUp();
+        filter = new StorageDomainStatusFilter();
+    }
+
+    @DataPoints
+    public static StorageDomainStatus[] storageDomainStatuses = 
StorageDomainStatus.values();
+
+    @Theory
+    public void 
testStorageDomainForMemoryIsValidOnlyForActiveStatus(StorageDomainStatus 
storageDomainStatus) {
+        storageDomain.setStatus(storageDomainStatus);
+        assertEquals(filter.getPredicate(disksList).eval(storageDomain),
+                storageDomainStatus == StorageDomainStatus.Active);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java
new file mode 100644
index 0000000..f000dc2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java
@@ -0,0 +1,32 @@
+package org.ovirt.engine.core.bll.memory.storageDomainFilters;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.experimental.theories.DataPoints;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+import org.ovirt.engine.core.common.businessentities.StorageDomainType;
+
+@RunWith(Theories.class)
+public class StorageDomainTypeFilterTest extends 
StorageDomainFilterAbstractTest {
+
+    private StorageDomainTypeFilter filter;
+
+    @Before
+    @Override
+    public void setUp() {
+        super.setUp();
+        filter = new StorageDomainTypeFilter();
+    }
+
+    @DataPoints
+    public static StorageDomainType[] storageDomainTypes = 
StorageDomainType.values();
+
+    @Theory
+    public void 
testStorageDomainForMemoryIsValidOnlyForDataTypes(StorageDomainType 
storageDomainType) {
+        storageDomain.setStorageDomainType(storageDomainType);
+        assertEquals(filter.getPredicate(disksList).eval(storageDomain), 
storageDomainType.isDataDomain());
+    }
+}


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

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

Reply via email to