From 0bb8985bd30b40b05aa18286ce77f55f10f0f8fa Mon Sep 17 00:00:00 2001 From: Tomas Cechvala Date: Thu, 19 Nov 2015 12:53:33 +0100 Subject: [PATCH] Simplifying validators Complicated validation code made simpler. Added methods for registering classif instance validator. Change-Id: I428f5d13b07bd1d0d40dff02c29334e329e7fb04 Signed-off-by: Tomas Cechvala --- .../resolver/ActionInstanceValidator.java | 17 -- .../resolver/PolicyResolver.java | 108 ++++++++-- .../resolver/validator/AbstractValidator.java | 120 ----------- .../resolver/validator/PolicyValidator.java | 75 ------- .../resolver/validator/SimpleResult.java | 115 ---------- .../resolver/validator/ValidationResult.java | 146 +------------ .../validator/ValidationResultBuilder.java | 72 +++++++ .../resolver/validator/Validator.java | 15 +- .../validators/ActionInstanceValidator.java | 38 ---- .../SubjectFeatureInstancesValidator.java | 38 ---- .../validator/validators/TenantValidator.java | 36 ---- .../validator/PolicyValidatorTest.java | 75 ------- .../resolver/validator/SimpleResultTest.java | 45 ---- .../validator/ValidationResultTest.java | 53 +++++ .../validator/ValidatorResultTest.java | 198 ------------------ .../ActionInstanceValidatorTest.java | 74 ------- .../SubjectFeatureInstancesValidatorTest.java | 52 ----- .../validators/TenantValidatorTest.java | 45 ---- .../renderer/ofoverlay/PolicyManager.java | 2 +- .../renderer/ofoverlay/sf/Action.java | 5 +- .../renderer/ofoverlay/sf/AllowAction.java | 6 +- .../renderer/ofoverlay/sf/ChainAction.java | 23 +- .../renderer/ofoverlay/PolicyManagerTest.java | 6 +- .../ofoverlay/sf/ChainActionTest.java | 4 +- 24 files changed, 249 insertions(+), 1119 deletions(-) delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java create mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java delete mode 100644 groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java create mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java delete mode 100644 groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java deleted file mode 100644 index 155d67759..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ActionInstanceValidator.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver; - -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; - - -public interface ActionInstanceValidator { - - boolean isValid(ActionInstance actionInstance); -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java index 723645fc2..0123fba6e 100755 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java @@ -24,17 +24,22 @@ import javax.annotation.concurrent.Immutable; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.ReadTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult; +import org.opendaylight.groupbasedpolicy.resolver.validator.Validator; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPoliciesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ClassifierInstance; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -43,6 +48,9 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.base.Predicate; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import com.google.common.collect.Table; import com.google.common.collect.Table.Cell; @@ -50,8 +58,6 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import org.opendaylight.groupbasedpolicy.resolver.validator.PolicyValidator; -import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult; import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; /** @@ -97,7 +103,8 @@ public class PolicyResolver implements AutoCloseable { * Store validators for ActionDefinitions from Renderers * */ - protected ConcurrentMap registeredActions = new ConcurrentHashMap<>(); + protected SetMultimap> actionInstanceValidatorsByDefinition = Multimaps.synchronizedSetMultimap(HashMultimap.>create()); + protected SetMultimap> classifierInstanceValidatorsByDefinition = Multimaps.synchronizedSetMultimap(HashMultimap.>create()); public PolicyResolver(DataBroker dataProvider, ScheduledExecutorService executor) { @@ -148,8 +155,24 @@ public class PolicyResolver implements AutoCloseable { return tc.tenant.get(); } - public void registerActionDefinitions(ActionDefinitionId actionDefinitionId, ActionInstanceValidator validator) { - registeredActions.putIfAbsent(actionDefinitionId, validator); + public void registerActionInstanceValidators(ActionDefinitionId actionDefinitionId, + Validator validator) { + actionInstanceValidatorsByDefinition.put(actionDefinitionId, validator); + } + + public void unregisterActionInstanceValidators(ActionDefinitionId actionDefinitionId, + Validator validator) { + actionInstanceValidatorsByDefinition.remove(actionDefinitionId, validator); + } + + public void registerClassifierInstanceValidators(ClassifierDefinitionId classifierDefinitionId, + Validator validator) { + classifierInstanceValidatorsByDefinition.put(classifierDefinitionId, validator); + } + + public void unregisterClassifierInstanceValidators(ClassifierDefinitionId classifierDefinitionId, + Validator validator) { + classifierInstanceValidatorsByDefinition.remove(classifierDefinitionId, validator); } /** @@ -310,7 +333,11 @@ public class PolicyResolver implements AutoCloseable { } Tenant t = InheritanceUtils.resolveTenant(result.get()); - if (isValidTenant(t)) { + SubjectFeatureInstances subjectFeatureInstances = t.getSubjectFeatureInstances(); + if (subjectFeatureInstances != null) { + // TODO log and remove invalid action instances + if (actionInstancesAreValid(subjectFeatureInstances.getActionInstance()) + && classifierInstancesAreValid(subjectFeatureInstances.getClassifierInstance())) { IndexedTenant it = new IndexedTenant(t); if (!tenantRef.compareAndSet(ot, it)) { // concurrent update of tenant policy. Retry @@ -324,6 +351,7 @@ public class PolicyResolver implements AutoCloseable { } } } + } @Override public void onFailure(Throwable t) { @@ -399,6 +427,56 @@ public class PolicyResolver implements AutoCloseable { return result; } + /** + * Validation of action instances. + * + * @param actionInstances list of instances to validate + * @return true if instances are valid or if actionInstances + * is null, Otherwise returns false. + * + */ + private boolean actionInstancesAreValid(List actionInstances) { + if (actionInstances == null) { + return true; + } + for (ActionInstance actionInstance : actionInstances) { + Set> actionInstanceValidators = actionInstanceValidatorsByDefinition.get(actionInstance.getActionDefinitionId()); + for (Validator actionInstanceValidator : actionInstanceValidators) { + ValidationResult validationResult = actionInstanceValidator.validate(actionInstance); + if (!validationResult.isValid()) { + LOG.error("ActionInstance {} is not valid!", actionInstance.getName()); + return false; + } + } + } + return true; + } + + /** + * Validation of classifier instances. + * + * @param classifierInstances list of instances to validate + * @return true if instances are valid or if classifierInstances + * is null, Otherwise returns false. + * + */ + private boolean classifierInstancesAreValid(List classifierInstances) { + if (classifierInstances == null) { + return true; + } + for (ClassifierInstance classifierInstance : classifierInstances) { + Set> classifierInstanceValidators = classifierInstanceValidatorsByDefinition.get(classifierInstance.getClassifierDefinitionId()); + for (Validator classifierInstanceValidator : classifierInstanceValidators) { + ValidationResult validationResult = classifierInstanceValidator.validate(classifierInstance); + if (!validationResult.isValid()) { + LOG.error("ClassifierInstance {} is not valid!", classifierInstance.getName()); + return false; + } + } + } + return true; + } + protected static class TenantContext { ListenerRegistration registration; @@ -428,20 +506,4 @@ public class PolicyResolver implements AutoCloseable { } - private boolean isValidTenant(Tenant t) { - ValidationResult validationResult = PolicyValidator.validate(t, this); - if (validationResult == null) { - return true; - } - return validationResult.getResult().getValue(); - } - - public ActionInstanceValidator getActionInstanceValidator(ActionDefinitionId actionDefinitionId) { - if (registeredActions == null) { - return null; - } - return registeredActions.get(actionDefinitionId); - - } - } diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java deleted file mode 100644 index 79f77caca..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/AbstractValidator.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator; - -import java.util.Collections; -import java.util.List; - -import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; -import org.opendaylight.yangtools.yang.binding.ChildOf; -import org.opendaylight.yangtools.yang.binding.DataContainer; - -/** - * Abstract class for all Validators, that will be used to validate concrete - * Policy objects. Contains basic functions needed for validation. - * - * @param - */ -public abstract class AbstractValidator implements Validator { - - /** - * Instance of {@link PolicyResolver} that contains additional data required - * for individual validation process - */ - private PolicyResolver policyResolver; - - /** - * - * @return Instance of {@link PolicyResolver} - */ - protected final PolicyResolver getPolicyResolver() { - return policyResolver; - } - - /** - * {@link PolicyResolver} contains additional data required for individual - * validation process - * - * @param policyResolver Istance of {@link PolicyResolver} - */ - public final void setPolicyResolver(PolicyResolver policyResolver) { - this.policyResolver = policyResolver; - } - - @Override - public ValidationResult validate(U objectToValidate) { - ValidationResult result = new ValidationResult(this.getClass()); - - SimpleResult selfValidationResult = validateSelf(objectToValidate); - - if (selfValidationResult.isFailure()) { - result.setResult(ValidationResult.Result.FAIL_BASE); - } - - result.setDescription(selfValidationResult.getDescription()); - - List childObjects = getChildObjects(objectToValidate); - this.validateChildren(childObjects, result); - - return result; - } - - /** - * This function is supposed to do base validation of given object (e.g. - * metadata check). - * - * Individual validators can override this method, to provide their own - * validation function. - * - * @param objectToValidate Object to validate by validator - * @return {@link SimpleResult} object - */ - protected SimpleResult validateSelf(U objectToValidate) { - - return new SimpleResult(true, "Default validation"); - } - - /** - * Function to validate all children in list. Result of all validations is - * saved to its parent {@link ValidationResult}. - * - * @param childObjects List of objects to validate - * @param parentResult Result of base validation. - */ - private void validateChildren(List childObjects, ValidationResult parentResult) { - if (childObjects == null) { - return; - } - - for (DataContainer child : childObjects) { - Validator validator = PolicyValidator.createValidator(child, getPolicyResolver()); - if (validator != null) { - parentResult.addChildResult(validator.validate(child)); - } - } - } - - /** - * Return list of all children objects of given object, that should be - * validated. - * - * Individual validators must override this method, if they want to execute - * validation on their children. - * - * @param objectToValidate Object that is validated by this validator - * @return List of child objects associated to {@code objectToValidate}. If - * there is not any child, return empty list or {@code null}. - */ - protected > List getChildObjects(U objectToValidate) { - return Collections.emptyList(); - } - - @Override - public abstract Class getType(); -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java deleted file mode 100644 index c0abbf04c..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidator.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator; - -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Nullable; -import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; -import org.opendaylight.groupbasedpolicy.resolver.validator.validators.ActionInstanceValidator; -import org.opendaylight.groupbasedpolicy.resolver.validator.validators.SubjectFeatureInstancesValidator; -import org.opendaylight.groupbasedpolicy.resolver.validator.validators.TenantValidator; -import org.opendaylight.yangtools.yang.binding.DataContainer; - -/** - * - * Factory to create concrete {@link Validator} class for object to validate. - * - */ -public class PolicyValidator { - - /** - * Map of Objects and their corresponding validators. - */ - private static final Map, AbstractValidator> VALIDATORS; - - static { - VALIDATORS = new HashMap<>(); - TenantValidator tenantValidator = new TenantValidator(); - VALIDATORS.put(tenantValidator.getType(), tenantValidator); - SubjectFeatureInstancesValidator subjectFeatureInstancesValidator = new SubjectFeatureInstancesValidator(); - VALIDATORS.put(subjectFeatureInstancesValidator.getType(), subjectFeatureInstancesValidator); - ActionInstanceValidator actionInstanceValidator = new ActionInstanceValidator(); - VALIDATORS.put(actionInstanceValidator.getType(), actionInstanceValidator); - } - - /** - * Validator Returns {@link Validator} for given object. - * - * @param - * @param object Object, for which validator should be created. - * @param policyResolver Instance of {@link PolicyResolver} that contains - * additional data required for individual validation process - * @return Concrete {@link Validator} for given object - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - static Validator createValidator(T object, PolicyResolver policyResolver) { - AbstractValidator validator = VALIDATORS.get(object.getImplementedInterface()); - if (validator == null) { - return null; - } - validator.setPolicyResolver(policyResolver); - return (Validator) validator; - } - - /** - * @param - * @param object Object to validate - * @param policyResolver Instance of {@link PolicyResolver} that contains - * additional data required for individual validation process - * @return {@code null} if validator for the object does not exist; - * {@link ValidationResult} otherwise - */ - public static @Nullable - ValidationResult validate(T object, PolicyResolver policyResolver) { - Validator validator = createValidator(object, policyResolver); - return validator.validate(object); - } - -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java deleted file mode 100644 index 27e4f63b0..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResult.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.groupbasedpolicy.resolver.validator; - -/** - * Class that represents simple result (e.g. SUCCESS/FAILURE and description of - * that result). Provide option to save custom result (state/code), which can be - * evaluated by other processes. - * - * @see SimpleResult#code - * - */ -public class SimpleResult { - - /** - * Code of result. - */ - private final int code; - /** - * Description of result. - */ - private final String description; - - /** - * Construct new {@link SimpleResult}. - * - * @param result State of result ({@code true} on success and {@code false} - * on failure). - * @param description Description of result. - */ - public SimpleResult(boolean result, String description) { - this.code = result ? 0 : 1; - this.description = description; - } - - /** - * Construct new {@link SimpleResult} with empty description. - * - * @param result State of result ({@code true} on SUCCESS and {@code false} - * on FAILURE). - */ - public SimpleResult(boolean result) { - this(result, null); - } - - /** - * Construct new {@link SimpleResult}. - * - * @param code Code of result, where 0 is expected as SUCCESS and everything - * else as FAILURE. - * @param description Description of result. - */ - public SimpleResult(int code, String description) { - this.code = code; - this.description = description; - } - - /** - * Construct new {@link SimpleResult} with empty description. - * - * @param code Code of result, where 0 is expected as SUCCESS and everything - * else as FAILURE. - */ - public SimpleResult(int code) { - this(code, null); - } - - /** - * Returns code of result. - * - * @return Code of result - */ - public int getCode() { - return code; - } - - /** - * Returns {@code true} if code of result IS {@code 0}, otherwise returns - * {@code false}. - * - * @return {@code true} or {@code false} based on value of {@code code} - */ - public boolean isSuccess() { - return getCode() == 0; - } - - /** - * Returns {@code true} if code of result IS NOT {@code 0}, otherwise - * returns {@code false}. - * - * @return {@code true} or {@code false} based on value of {@code code} - */ - public boolean isFailure() { - return !isSuccess(); - } - - /** - * Returns saved description of result or empty string. - * - * @return Description of result. - */ - public String getDescription() { - if (description == null) { - return ""; - } else { - return description; - } - } - -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResult.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResult.java index dd533883e..9e0ec63d2 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResult.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResult.java @@ -8,149 +8,19 @@ package org.opendaylight.groupbasedpolicy.resolver.validator; -import java.util.ArrayList; -import java.util.List; - -/** - * Class to hold validation results of object and his children. - * - */ -public class ValidationResult { - - /** - * Enumeration of possible results. - */ - public enum Result { - - /** - * Everything is OK - */ - SUCCESS(true), - /** - * Base validation failed - */ - FAIL_BASE(false), - /** - * Validation of (any) child failed - */ - FAIL_CHILD(false), - /** - * Base validation and validation of (any) child failed - */ - FAIL_BASE_AND_CHILD(false); - - private boolean value; - - Result(boolean value) { - this.value = value; - } - - public boolean getValue() { - return this.value; - } - } - - /** - * Variable to store result of validation. The final result is based on base - * status and status of all children. - */ - private Result result = Result.SUCCESS; - - /** - * Class of {@link Validator}, which returns result. - */ - private final Class validatorClass; - - /** - * List of all children validations. - */ - private List childResults = new ArrayList<>(); - - /** - * Human-readable description of current status. - */ - private String description; - - /** - * Create new {@link ValidationResult} to store result of validation. - * - * @param validatorClass Creator of {@link ValidationResult} - */ - public ValidationResult(Class validatorClass) { - this.validatorClass = validatorClass; - } +public interface ValidationResult { /** + * Returns whether or not validation was successful. * - * @return Current result + * @return true if validation was successful, false otherwise. */ - public Result getResult() { - return result; - } + public boolean isValid(); /** + * Returns saved description of result or empty string. * - * @param result Result to set + * @return Result message. */ - public void setResult(Result result) { - this.result = result; - } - - /** - * - * @return List of result child objects - */ - public List getChildResults() { - return childResults; - } - - /** - * Add new child result. Result of his parent is based on status of base and - * all children. - * - * @param childResult - */ - public void addChildResult(ValidationResult childResult) { - if (!childResult.getResult().getValue()) { - - //if validation already failed for base or child - if (this.getResult().equals(ValidationResult.Result.FAIL_BASE) - || this.getResult().equals(ValidationResult.Result.FAIL_BASE_AND_CHILD)) { - this.setResult(ValidationResult.Result.FAIL_BASE_AND_CHILD); - - //if validation failed only for child - } else { - this.setResult(ValidationResult.Result.FAIL_CHILD); - } - } - - this.childResults.add(childResult); - } - - /** - * Returns {@link Validator} class in which the result arises. - * - * @return {@link Validator} class - */ - public Class getValidatorClass() { - return validatorClass; - } - - /** - * - * @return Current result description - */ - public String getDescription() { - return description; - } - - /** - * Set human-readable description of result. - * - * @param description Result description to set - */ - public void setDescription(String description) { - this.description = description; - } - -} + public String getMessage(); +} \ No newline at end of file diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java new file mode 100644 index 000000000..aad69a01f --- /dev/null +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultBuilder.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.groupbasedpolicy.resolver.validator; + + +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.concepts.Builder; + +public final class ValidationResultBuilder implements Builder { + + private static final class ValidationResultImpl implements ValidationResult { + + private final boolean success; + private final String message; + + private ValidationResultImpl(final boolean success, final String message) { + this.success = success; + this.message = message; + } + + @Override + public boolean isValid() { + return success; + } + + @Override + public String getMessage() { + return message; + } + } + + private boolean success; + private String message = ""; + + public ValidationResultBuilder success() { + this.success = true; + return this; + } + + /** + * Returns a builder for a failed result. + */ + public ValidationResultBuilder failed() { + this.success = false; + return this; + } + + /** + * Returns a builder for a failed result. + * + * @param message brief explanation + * @throws IllegalArgumentException when message is null + */ + public ValidationResultBuilder setMessage(@Nonnull String message) { + if (message == null) { + throw new IllegalArgumentException("Result message cannot be set to NULL!"); + } + this.message = message; + return this; + } + + @Override + public ValidationResult build() { + return new ValidationResultImpl(success, message); + } + +} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/Validator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/Validator.java index 98d581f8c..d860aaf72 100644 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/Validator.java +++ b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/Validator.java @@ -8,15 +8,10 @@ package org.opendaylight.groupbasedpolicy.resolver.validator; -/** - * Interface for Validators used to validate Policy objects - * - * @param - */ public interface Validator { /** - * Validate given object and his children. The result of all validations is + * Validate given object. The result of all validations is * stored in {@link ValidationResult} object. * * @param objectToValidate Object that should be validated by @@ -24,12 +19,4 @@ public interface Validator { * @return Result of performed validation */ ValidationResult validate(T objectToValidate); - - /** - * Returns the Policy object type for which it is intended validator. - * - * @return Class of Policy object; - */ - Class getType(); - } diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java deleted file mode 100644 index 0e0ebf00c..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidator.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator; -import org.opendaylight.groupbasedpolicy.resolver.validator.SimpleResult; - -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; - -/** - * Validator for {@link ActionInstance} - */ -public class ActionInstanceValidator extends AbstractValidator { - - @Override - protected SimpleResult validateSelf(ActionInstance objectToValidate) { - org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator action = getPolicyResolver().getActionInstanceValidator(objectToValidate.getActionDefinitionId()); - if (action == null) { - return new SimpleResult(false, "Action not registered in PolicyResolver."); - } - - boolean isValid = action.isValid(objectToValidate); - - return new SimpleResult(isValid, "Validation result of " + action.getClass().getName() + " class."); - } - - @Override - public Class getType() { - return ActionInstance.class; - } - -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java deleted file mode 100644 index 13ab55eec..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidator.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import java.util.ArrayList; -import java.util.List; -import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator; - -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances; -import org.opendaylight.yangtools.yang.binding.ChildOf; - -/** - * Validator for {@link SubjectFeatureInstances} - */ -public class SubjectFeatureInstancesValidator extends AbstractValidator { - - @Override - protected List> getChildObjects(SubjectFeatureInstances objectToValidate) { - List> childObjects = new ArrayList<>(); - - childObjects.addAll(objectToValidate.getActionInstance()); - childObjects.addAll(objectToValidate.getClassifierInstance()); - - return childObjects; - } - - @Override - public Class getType() { - return SubjectFeatureInstances.class; - } - -} diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java deleted file mode 100644 index bae3e7432..000000000 --- a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidator.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import java.util.ArrayList; -import java.util.List; -import org.opendaylight.groupbasedpolicy.resolver.validator.AbstractValidator; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; -import org.opendaylight.yangtools.yang.binding.ChildOf; - -/** - * Validator for {@link Tenant} - */ -public class TenantValidator extends AbstractValidator { - - @Override - protected List> getChildObjects(Tenant objectToValidate) { - List> childObjects = new ArrayList<>(); - - childObjects.add(objectToValidate.getSubjectFeatureInstances()); - - return childObjects; - } - - @Override - public Class getType() { - return Tenant.class; - } - -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java deleted file mode 100644 index 818281e6c..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/PolicyValidatorTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; -import org.opendaylight.yangtools.yang.binding.DataContainer; - -public class PolicyValidatorTest { - - DataContainer dataContainer; - PolicyResolver policyResolver; - - @Before - public void initialise() { - dataContainer = mock(DataContainer.class); - policyResolver = mock(PolicyResolver.class); - - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Test - public void createValidatorTest() { - Validator validator; - validator = PolicyValidator.createValidator(dataContainer, policyResolver); - Assert.assertNull(validator); - - when(dataContainer.getImplementedInterface()).thenReturn((Class) Tenant.class); - validator = PolicyValidator.createValidator(dataContainer, policyResolver); - Assert.assertNotNull(validator); - Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver()); - - when(dataContainer.getImplementedInterface()).thenReturn((Class) SubjectFeatureInstances.class); - validator = PolicyValidator.createValidator(dataContainer, policyResolver); - Assert.assertNotNull(validator); - Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver()); - - when(dataContainer.getImplementedInterface()).thenReturn((Class) ActionInstance.class); - validator = PolicyValidator.createValidator(dataContainer, policyResolver); - Assert.assertNotNull(validator); - Assert.assertEquals(policyResolver, ((AbstractValidator) validator).getPolicyResolver()); - } - - @SuppressWarnings({"unchecked", "rawtypes"}) - @Test - public void validateTest() { - Tenant tenant = mock(Tenant.class); - when(tenant.getImplementedInterface()).thenReturn((Class) Tenant.class); - SubjectFeatureInstances subjectFeatureInstances = mock(SubjectFeatureInstances.class); - when(tenant.getSubjectFeatureInstances()).thenReturn(subjectFeatureInstances); - PolicyValidator.validate(tenant, policyResolver); - - when(subjectFeatureInstances.getImplementedInterface()).thenReturn((Class) SubjectFeatureInstances.class); - PolicyValidator.validate(subjectFeatureInstances, policyResolver); - - ActionInstance actionInstance = mock(ActionInstance.class); - when(actionInstance.getImplementedInterface()).thenReturn((Class) ActionInstance.class); - PolicyValidator.validate(actionInstance, policyResolver); - } - -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java deleted file mode 100644 index 1374bdfa7..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/SimpleResultTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator; - -import org.junit.Assert; -import org.junit.Test; - -public class SimpleResultTest { - - private SimpleResult simpleResult; - - @Test - public void constructorTest() { - simpleResult = new SimpleResult(true); - Assert.assertEquals(0, simpleResult.getCode()); - Assert.assertTrue(simpleResult.getDescription().isEmpty()); - Assert.assertTrue(simpleResult.isSuccess()); - Assert.assertFalse(simpleResult.isFailure()); - - simpleResult = new SimpleResult(false); - Assert.assertEquals(1, simpleResult.getCode()); - Assert.assertTrue(simpleResult.getDescription().isEmpty()); - Assert.assertFalse(simpleResult.isSuccess()); - Assert.assertTrue(simpleResult.isFailure()); - - simpleResult = new SimpleResult(2); - Assert.assertEquals(2, simpleResult.getCode()); - Assert.assertTrue(simpleResult.getDescription().isEmpty()); - Assert.assertFalse(simpleResult.isSuccess()); - Assert.assertTrue(simpleResult.isFailure()); - - simpleResult = new SimpleResult(2, "description"); - Assert.assertEquals(2, simpleResult.getCode()); - Assert.assertEquals("description", simpleResult.getDescription()); - Assert.assertFalse(simpleResult.isSuccess()); - Assert.assertTrue(simpleResult.isFailure()); - } - -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java new file mode 100644 index 000000000..0539eba0d --- /dev/null +++ b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidationResultTest.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.groupbasedpolicy.resolver.validator; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class ValidationResultTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + ValidationResultBuilder resultBuilder; + ValidationResult result; + + @Before + public void initialisation() { + resultBuilder = new ValidationResultBuilder(); + } + + @Test + public void successValidationTest() { + result = resultBuilder.success().build(); + Assert.assertTrue(result.isValid()); + Assert.assertTrue(result.getMessage().equals("")); + } + + @Test + public void unsuccessValidationTest() { + result = resultBuilder.failed().build(); + Assert.assertFalse(result.isValid()); + Assert.assertTrue(result.getMessage().equals("")); + } + + @Test + public void messageTest() { + result = resultBuilder.setMessage("Validated.").build(); + Assert.assertTrue(result.getMessage().equals("Validated.")); + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Result message cannot be set to NULL!"); + resultBuilder.setMessage(null); + } + +} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java deleted file mode 100644 index 2d09b8694..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/ValidatorResultTest.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult.Result; - -public class ValidatorResultTest { - - private ValidationResult validationResult; - private ValidationResult childResult; - - @Before - public void initialise() { - validationResult = new ValidationResult(Validator.class); - childResult = new ValidationResult(Validator.class); - } - - @Test - public void constructorTest() { - Assert.assertEquals(Validator.class, validationResult.getValidatorClass()); - } - - @Test - public void descriptionTest() { - String description = "description"; - validationResult.setDescription(description); - Assert.assertEquals(description, validationResult.getDescription()); - } - - @Test - public void resultTest() { - validationResult.setResult(Result.SUCCESS); - Assert.assertEquals(Result.SUCCESS, validationResult.getResult()); - Assert.assertTrue(validationResult.getResult().getValue()); - validationResult.setResult(Result.FAIL_BASE); - Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult()); - Assert.assertFalse(validationResult.getResult().getValue()); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertEquals(Result.FAIL_CHILD, validationResult.getResult()); - Assert.assertFalse(validationResult.getResult().getValue()); - validationResult.setResult(Result.FAIL_BASE_AND_CHILD); - Assert.assertEquals(Result.FAIL_BASE_AND_CHILD, validationResult.getResult()); - Assert.assertFalse(validationResult.getResult().getValue()); - } - - @Test - public void childResultTestSuccessSuccess() { - validationResult.setResult(Result.SUCCESS); - childResult.setResult(Result.SUCCESS); - validationResult.addChildResult(childResult); - Assert.assertEquals(Result.SUCCESS, validationResult.getResult()); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestSuccessFailBase() { - validationResult.setResult(Result.SUCCESS); - childResult.setResult(Result.FAIL_BASE); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestSuccessFailChild() { - validationResult.setResult(Result.SUCCESS); - childResult.setResult(Result.FAIL_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestSuccessFailBaseAndChild() { - validationResult.setResult(Result.SUCCESS); - childResult.setResult(Result.FAIL_BASE_AND_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseSuccess() { - validationResult.setResult(Result.FAIL_BASE); - childResult.setResult(Result.SUCCESS); - validationResult.addChildResult(childResult); - Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult()); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseFailBase() { - validationResult.setResult(Result.FAIL_BASE); - childResult.setResult(Result.FAIL_BASE); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseFailChild() { - validationResult.setResult(Result.FAIL_BASE); - childResult.setResult(Result.FAIL_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseFailBaseAndChild() { - validationResult.setResult(Result.FAIL_BASE); - childResult.setResult(Result.FAIL_BASE_AND_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailChildSuccess() { - validationResult.setResult(Result.FAIL_CHILD); - childResult.setResult(Result.SUCCESS); - validationResult.addChildResult(childResult); - Assert.assertEquals(Result.FAIL_CHILD, validationResult.getResult()); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailChildFailBase() { - validationResult.setResult(Result.FAIL_CHILD); - childResult.setResult(Result.FAIL_BASE); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailChildFailChild() { - validationResult.setResult(Result.FAIL_CHILD); - childResult.setResult(Result.FAIL_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailChildFailBaseAndChild() { - validationResult.setResult(Result.FAIL_CHILD); - childResult.setResult(Result.FAIL_BASE_AND_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseAndChildSuccess() { - validationResult.setResult(Result.FAIL_BASE); - childResult.setResult(Result.SUCCESS); - validationResult.addChildResult(childResult); - Assert.assertEquals(Result.FAIL_BASE, validationResult.getResult()); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseAndChildFailBase() { - validationResult.setResult(Result.FAIL_BASE_AND_CHILD); - childResult.setResult(Result.FAIL_BASE); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseAndChildFailChild() { - validationResult.setResult(Result.FAIL_BASE_AND_CHILD); - childResult.setResult(Result.FAIL_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } - - @Test - public void childResultTestFailBaseAndChildFailBaseAndChild() { - validationResult.setResult(Result.FAIL_BASE_AND_CHILD); - childResult.setResult(Result.FAIL_BASE_AND_CHILD); - validationResult.addChildResult(childResult); - validationResult.setResult(Result.FAIL_CHILD); - Assert.assertTrue(validationResult.getChildResults().contains(childResult)); - } -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java deleted file mode 100644 index 003b9d708..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/ActionInstanceValidatorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - *s - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; -import org.opendaylight.groupbasedpolicy.resolver.validator.SimpleResult; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; - -public class ActionInstanceValidatorTest { - - private ActionInstanceValidator validator; - private PolicyResolver policyResolver; - private org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator action; - - @Before - public void initialise() { - validator = new ActionInstanceValidator(); - policyResolver = mock(PolicyResolver.class); - action = mock(org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator.class); - when(policyResolver.getActionInstanceValidator(any(ActionDefinitionId.class))).thenReturn(action); - validator.setPolicyResolver(policyResolver); - } - - @Test - public void validateSelfTestValidFalse() { - ActionInstance objectToValidate = mock(ActionInstance.class); - when(action.isValid(objectToValidate)).thenReturn(false); - - SimpleResult simpleResult = validator.validateSelf(objectToValidate); - Assert.assertNotNull(simpleResult); - Assert.assertTrue(simpleResult.isFailure()); - Assert.assertTrue(simpleResult.getDescription().contains("ActionInstance")); - } - - @Test - public void validateSelfTestValidTrue() { - ActionInstance objectToValidate = mock(ActionInstance.class); - when(action.isValid(objectToValidate)).thenReturn(true); - - SimpleResult simpleResult = validator.validateSelf(objectToValidate); - Assert.assertNotNull(simpleResult); - Assert.assertTrue(simpleResult.isSuccess()); - Assert.assertTrue(simpleResult.getDescription().contains("ActionInstance")); - } - - @Test - public void validateSelfTestValidActionNull() { - ActionInstance objectToValidate = mock(ActionInstance.class); - when(policyResolver.getActionInstanceValidator(any(ActionDefinitionId.class))).thenReturn(null); - - SimpleResult simpleResult = validator.validateSelf(objectToValidate); - Assert.assertNotNull(simpleResult); - Assert.assertTrue(simpleResult.isFailure()); - } - - @Test - public void getTypeTest() { - Assert.assertEquals(ActionInstance.class, validator.getType()); - } -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java deleted file mode 100644 index 6ef233b11..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/SubjectFeatureInstancesValidatorTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.List; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ClassifierInstance; -import org.opendaylight.yangtools.yang.binding.ChildOf; - -public class SubjectFeatureInstancesValidatorTest { - - private SubjectFeatureInstancesValidator validator; - - @Before - public void initialise() { - validator = new SubjectFeatureInstancesValidator(); - } - - @Test - public void getChildObjectsTest() { - SubjectFeatureInstances objectToValidate = mock(SubjectFeatureInstances.class); - ActionInstance actionInstance = mock(ActionInstance.class); - when(objectToValidate.getActionInstance()).thenReturn(Arrays.asList(actionInstance)); - ClassifierInstance classifierInstance = mock(ClassifierInstance.class); - when(objectToValidate.getClassifierInstance()).thenReturn(Arrays.asList(classifierInstance)); - - List> childObjects = validator.getChildObjects(objectToValidate); - Assert.assertTrue(childObjects.contains(actionInstance)); - Assert.assertTrue(childObjects.contains(classifierInstance)); - } - - @Test - public void getTypeTest() { - Assert.assertEquals(SubjectFeatureInstances.class, validator.getType()); - } - -} diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java deleted file mode 100644 index e210b8eff..000000000 --- a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/validator/validators/TenantValidatorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.resolver.validator.validators; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstances; -import org.opendaylight.yangtools.yang.binding.ChildOf; - -public class TenantValidatorTest { - - private TenantValidator validator; - - @Before - public void initialise() { - validator = new TenantValidator(); - } - - @Test - public void getChildObjectsTest() { - Tenant objectToValidate = mock(Tenant.class); - SubjectFeatureInstances subjectFeatureInstances = mock(SubjectFeatureInstances.class); - when(objectToValidate.getSubjectFeatureInstances()).thenReturn(subjectFeatureInstances); - List> childObjects = validator.getChildObjects(objectToValidate); - Assert.assertTrue(childObjects.contains(subjectFeatureInstances)); - } - - @Test - public void getTypeTest() { - Assert.assertEquals(Tenant.class, validator.getType()); - } -} diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java index 2b8169b99..901210372 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java @@ -121,7 +121,7 @@ public class PolicyManager } for(Entry entry : SubjectFeatures.getActions().entrySet()) { - policyResolver.registerActionDefinitions(entry.getKey(), entry.getValue()); + policyResolver.registerActionInstanceValidators(entry.getKey(), entry.getValue()); } ofCtx = new OfContext(dataBroker, rpcRegistry, diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Action.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Action.java index c78f5c36f..5d49751d3 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Action.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Action.java @@ -15,19 +15,20 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.NetworkElements; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair; -import org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator; +import org.opendaylight.groupbasedpolicy.resolver.validator.Validator; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinition; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.action.definition.SupportedParameterValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.subject.feature.instances.ActionInstance; /** * Represent an action definition, and provide tools for generating * flow instructions based on the action * @author tbachman */ -public abstract class Action implements ActionInstanceValidator{ +public abstract class Action implements Validator { /** * Get the action definition for this action * @return the {@link ActionDefinition} for this action diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/AllowAction.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/AllowAction.java index 4d3196f4b..deaa5dabd 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/AllowAction.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/AllowAction.java @@ -19,6 +19,8 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.NetworkElements; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair; +import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult; +import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResultBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction; @@ -66,8 +68,8 @@ public class AllowAction extends Action { } @Override - public boolean isValid(ActionInstance actionInstance) { - return true; + public ValidationResult validate(ActionInstance actionInstance) { + return new ValidationResultBuilder().success().build(); } @Override diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java index 8e423638e..3b249562b 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainAction.java @@ -26,6 +26,13 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeade import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader.SfcNshHeaderBuilder; import org.opendaylight.groupbasedpolicy.sf.actions.ChainActionDefinition; import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.PolicyEnforcer.PolicyPair; +import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcIidFactory; +import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader; +import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sfcutils.SfcNshHeader.SfcNshHeaderBuilder; +import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResult; +import org.opendaylight.groupbasedpolicy.resolver.validator.ValidationResultBuilder; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; import org.opendaylight.sfc.provider.api.SfcProviderRenderedPathAPI; import org.opendaylight.sfc.provider.api.SfcProviderServiceChainAPI; import org.opendaylight.sfc.provider.api.SfcProviderServicePathAPI; @@ -87,7 +94,6 @@ public class ChainAction extends Action { if (params != null) { LOG.debug("updateAction: Searching for named chain"); for (String name : params.keySet()) { - if (name instanceof String) { if (name.equals(ChainActionDefinition.SFC_CHAIN_NAME)) { chainName = (String) params.get(name); if (chainName == null) { @@ -95,7 +101,6 @@ public class ChainAction extends Action { return null; } } - } } } else { LOG.error("updateAction: Parameters null for chain action"); @@ -249,19 +254,25 @@ public class ChainAction extends Action { } @Override - public boolean isValid(ActionInstance actionInstance) { + public ValidationResult validate(ActionInstance actionInstance) { return isValidGbpChain(actionInstance.getParameterValue()); } - private boolean isValidGbpChain(List paramValue) { + private ValidationResult isValidGbpChain(List paramValue) { ParameterValue pv = getChainNameParameter(paramValue); if (pv == null) { - return false; + return new ValidationResultBuilder().failed().setMessage( + "Chain parameter {" + paramValue + "} not found!").build(); } SfcName sfcName = new SfcName(pv.getStringValue()); LOG.trace("isValidGbpChain: Invoking RPC for chain {}", pv.getStringValue()); ServiceFunctionChain chain = SfcProviderServiceChainAPI.readServiceFunctionChain(sfcName); - return (chain != null); + if (chain != null){ + return new ValidationResultBuilder().success().build(); + } else { + return new ValidationResultBuilder().failed().setMessage( + "Chain named {" + pv.getStringValue() + "} not found in config DS.").build(); + } } public ServiceFunctionPath getSfcPath(SfcName chainName) { diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManagerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManagerTest.java index 0d8758750..ec9534e6f 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManagerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManagerTest.java @@ -35,10 +35,10 @@ import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.groupbasedpolicy.endpoint.EpKey; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager; import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager; -import org.opendaylight.groupbasedpolicy.resolver.ActionInstanceValidator; import org.opendaylight.groupbasedpolicy.resolver.EgKey; import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver; import org.opendaylight.groupbasedpolicy.resolver.PolicyScope; +import org.opendaylight.groupbasedpolicy.resolver.validator.Validator; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -119,8 +119,8 @@ public class PolicyManagerTest { PolicyResolver ctorPolicyResolver = mock(PolicyResolver.class); PolicyManager ctorPolicyManager = new PolicyManager(dataBroker, ctorPolicyResolver, switchManager, endpointManager, rpcRegistry, executor, tableOffset); - verify(ctorPolicyResolver, atLeastOnce()).registerActionDefinitions(any(ActionDefinitionId.class), - any(ActionInstanceValidator.class)); + verify(ctorPolicyResolver, atLeastOnce()).registerActionInstanceValidators(any(ActionDefinitionId.class), + any(Validator.class)); } @SuppressWarnings("unchecked") diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainActionTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainActionTest.java index 7d316647e..8d98c285f 100755 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainActionTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/ChainActionTest.java @@ -181,7 +181,7 @@ public class ChainActionTest { @Test public void isValidTestParameterValueNull() { - ActionInstance actionInstance = mock(ActionInstance.class); - Assert.assertFalse(chainAction.isValid(actionInstance)); + ActionInstance actionInstance = mock(ActionInstance.class); + Assert.assertFalse(chainAction.validate(actionInstance).isValid()); } } -- 2.36.6