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
