Allon Mureinik has uploaded a new change for review.

Change subject: multi validator games
......................................................................

multi validator games

<core | restapi | tools | history | engine | userportal | webadmin>: short 
summary under 50 chars

Longer description using lines' length under 72 chars.

With multiple paragraphs if necessary.

Change-Id: If4f1e71251ddc20c0b1ef08f446e038ae34b2f79
Bug-Url: https://bugzilla.redhat.com/??????
Signed-off-by: Allon Mureinik <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java
2 files changed, 158 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/35/12135/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java
new file mode 100644
index 0000000..6444542
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java
@@ -0,0 +1,85 @@
+package org.ovirt.engine.core.bll.validator;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.StorageDomainDAO;
+
+/**
+ * A validator for multiple storage domains.
+ *
+ * This class offers several validations similar to those offered in
+ * {@link StorageDomainValidator} which can be performed on several domains.
+ *
+ * The guideline of this class is performance and short circuit logic, so any
+ * of these validations will fail on the first storage domain which fails
+ * validation, and the others will not be inspected.
+ */
+public class MultipleStorageDomainsValidator {
+
+    /** A map from the ids of each domain being validated to its validator */
+    private Map<Guid, StorageDomainValidator> domainValidators;
+
+    /**
+     * Constructor from Guids
+     * @param sdIds A {@link Collection} of storage domain IDs to be validated
+     */
+    public MultipleStorageDomainsValidator(Collection<Guid> sdIds) {
+        domainValidators = new HashMap<Guid, 
StorageDomainValidator>(sdIds.size());
+        for (Guid id : sdIds) {
+            domainValidators.put(id, null);
+        }
+    }
+
+    /**
+     * Validates that all the domains exist and are active.
+     * @return {@link ValidationResult#VALID} if all the domains are OK, or a 
{@link ValidationResult} with the first non-active domain encountered.
+     */
+    public ValidationResult allDomainsExistAndActive() {
+        return validOrFirstFailure(new ValidatorPredicate() {
+            @Override
+            public ValidationResult evaluate(StorageDomainValidator validator) 
{
+                return validator.isDomainExistAndActive();
+            }
+        });
+    }
+
+    /** @return The lazy-loaded validator for the given map entry */
+    private StorageDomainValidator getStorageDomainValidator(Map.Entry<Guid, 
StorageDomainValidator> entry) {
+        if (entry.getValue() == null) {
+            entry.setValue(new 
StorageDomainValidator(getStorageDomainDAO().get(entry.getKey())));
+        }
+
+        return entry.getValue();
+    }
+
+    /** @return The DAO object used to retrieve storage domains */
+    protected StorageDomainDAO getStorageDomainDAO() {
+        return DbFacade.getInstance().getStorageDomainDao();
+    }
+
+    /**
+     * Validates all the storage domains by a given predicate.
+     *
+     * @return {@link ValidationResult#VALID} if all the domains are OK, or the
+     * first validation error if they aren't.
+     */
+    private ValidationResult validOrFirstFailure(ValidatorPredicate predicate) 
{
+        for (Map.Entry<Guid, StorageDomainValidator> entry : 
domainValidators.entrySet()) {
+            ValidationResult currResult = 
predicate.evaluate(getStorageDomainValidator(entry));
+            if (!currResult.isValid()) {
+                return currResult;
+            }
+        }
+        return ValidationResult.VALID;
+    }
+
+    /** A predicate for evaluating storage domains */
+    private static interface ValidatorPredicate {
+        public ValidationResult evaluate(StorageDomainValidator validator);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java
new file mode 100644
index 0000000..350ad2e
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java
@@ -0,0 +1,73 @@
+package org.ovirt.engine.core.bll.validator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.VdcBllMessages;
+import org.ovirt.engine.core.dao.StorageDomainDAO;
+
+/** A test class for the {@link MultipleStorageDomainsValidator} class. */
+@RunWith(MockitoJUnitRunner.class)
+public class MultipleStorageDomainsValidatorTest {
+    @Mock
+    private StorageDomainDAO dao;
+
+    private Guid sdId1;
+    private Guid sdId2;
+
+    private StorageDomain domain1;
+    private StorageDomain domain2;
+
+    private MultipleStorageDomainsValidator validator;
+
+    @Before
+    public void setUp() {
+        sdId1 = Guid.NewGuid();
+        sdId2 = Guid.NewGuid();
+
+        domain1 = new StorageDomain();
+        domain1.setId(sdId1);
+
+        domain2 = new StorageDomain();
+        domain2.setId(sdId2);
+
+        when(dao.get(sdId1)).thenReturn(domain1);
+        when(dao.get(sdId2)).thenReturn(domain2);
+
+        validator = spy(new 
MultipleStorageDomainsValidator(Arrays.asList(sdId1, sdId2)));
+        doReturn(dao).when(validator).getStorageDomainDAO();
+    }
+
+    @Test
+    public void testAllDomainsExistAndActiveAllActive() {
+        domain1.setStatus(StorageDomainStatus.Active);
+        domain2.setStatus(StorageDomainStatus.Active);
+        assertTrue("Both domains should be active", 
validator.allDomainsExistAndActive().isValid());
+    }
+
+    @Test
+    public void testAllDomainsExistAndActiveOneInactive() {
+        domain1.setStatus(StorageDomainStatus.Active);
+        domain2.setStatus(StorageDomainStatus.InActive);
+        ValidationResult result = validator.allDomainsExistAndActive();
+        assertFalse("Both domains should be active", result.isValid());
+        assertEquals("Wrong validation error",
+                
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL,
+                result.getMessage());
+    }
+}


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

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

Reply via email to