From cc5176bed8bb87fbe28f49eb7fe99f8a1fac01c0 Mon Sep 17 00:00:00 2001 From: "mark.j.leonard" Date: Wed, 13 Feb 2019 15:44:48 +0000 Subject: Add a JUnit test for the Data Dictionary Create sample configuration for debugging the DataDictionary.java code. Fix an issue in the Rule Driven Validator: re-enable invocation of the default rules when no indexed rules are found for an event. Change-Id: I85fb6c0797e1240c14997b6e8ba1f6c0304152db Issue-ID: AAI-2057 Signed-off-by: mark.j.leonard --- .../validation/ruledriven/RuleDrivenValidator.java | 42 +++++++------ .../ruledriven/validator/TestDataDictionary.java | 62 +++++++++++++++++++ .../rule-data-dictionary.properties | 24 ++++++++ .../data-dictionary/rule-indexing.properties | 20 +++++++ .../rules/poa-event/default-rules.groovy | 48 +++++++++++++++ .../data-dictionary/schemaIngest.properties | 48 +++++++++++++++ .../data-dictionary/test-data-dictionary-beans.xml | 69 ++++++++++++++++++++++ .../test_events/test-create-event.json | 39 ++++++++++++ .../validation-service-auth.properties | 18 ++++++ .../data-dictionary/validation-service.properties | 28 +++++++++ 10 files changed, 379 insertions(+), 19 deletions(-) create mode 100644 src/test/java/org/onap/aai/validation/ruledriven/validator/TestDataDictionary.java create mode 100644 src/test/resources/data-dictionary/rule-data-dictionary.properties create mode 100644 src/test/resources/data-dictionary/rule-indexing.properties create mode 100644 src/test/resources/data-dictionary/rules/poa-event/default-rules.groovy create mode 100644 src/test/resources/data-dictionary/schemaIngest.properties create mode 100644 src/test/resources/data-dictionary/test-data-dictionary-beans.xml create mode 100644 src/test/resources/data-dictionary/test_events/test-create-event.json create mode 100644 src/test/resources/data-dictionary/validation-service-auth.properties create mode 100644 src/test/resources/data-dictionary/validation-service.properties diff --git a/src/main/java/org/onap/aai/validation/ruledriven/RuleDrivenValidator.java b/src/main/java/org/onap/aai/validation/ruledriven/RuleDrivenValidator.java index cee29f7..57ace7d 100644 --- a/src/main/java/org/onap/aai/validation/ruledriven/RuleDrivenValidator.java +++ b/src/main/java/org/onap/aai/validation/ruledriven/RuleDrivenValidator.java @@ -1,20 +1,24 @@ -/* - * ============LICENSE_START=================================================== +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. * Copyright (c) 2018-2019 European Software Marketing Ltd. - * ============================================================================ + * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * ============LICENSE_END===================================================== + * ============LICENSE_END========================================================= */ + package org.onap.aai.validation.ruledriven; import java.io.File; @@ -55,7 +59,7 @@ import org.onap.aai.validation.ruledriven.rule.Rule; import org.onap.aai.validation.ruledriven.rule.RuleResult; /** - * Validator using explicit rules + * Validator using explicit rules. * */ public class RuleDrivenValidator implements Validator { @@ -71,16 +75,16 @@ public class RuleDrivenValidator implements Validator { // Map of event type name against RuleManager for that event type private Map ruleManagers; - /** - * Construct a Validator that is configured using rule files + * Construct a Validator that is configured using rule files. * * @param configurationPath - * path to the Groovy rules files + * path to the Groovy rules files * @param oxmReader - * required for validating entity types + * required for validating entity types * @param eventReader - * a reader for extracting entities from each event to be validated + * a reader for extracting entities from each event to be validated + * @param ruleIndexingConfig */ public RuleDrivenValidator(final Path configurationPath, final OxmReader oxmReader, final EventReader eventReader, final RuleIndexingConfig ruleIndexingConfig) { @@ -146,6 +150,7 @@ public class RuleDrivenValidator implements Validator { /* * (non-Javadoc) + * * @see org.onap.aai.validation.Validator#validate(java.lang.String) */ @Override @@ -224,8 +229,8 @@ public class RuleDrivenValidator implements Validator { if (!rulesDefined && ruleIndexingConfig.isPresent()) { final String defaultIndexKey = ruleIndexingConfig.get().getDefaultIndexKey(); - if (StringUtils.isEmpty(defaultIndexKey)) { - return ruleManager.getRulesForEntity(RuleManager.generateKey(new String[] { defaultIndexKey })); + if (!StringUtils.isEmpty(defaultIndexKey)) { + return ruleManager.getRulesForEntity(RuleManager.generateKey(new String[] {defaultIndexKey})); } else { applicationLogger.debug("Default index value not configured, unable to get rules"); applicationLogger.error(ApplicationMsgs.CANNOT_VALIDATE_ERROR, eventType); @@ -244,11 +249,10 @@ public class RuleDrivenValidator implements Validator { return ""; } try { - AttributeValues attributeValues = entity.getAttributeValues(ruleIndexingConfig.get().getIndexAttributes()); - applicationLogger - .debug("Generating index using attributes: " + attributeValues.generateReport().toString()); - Collection values = attributeValues.generateReport().values(); - return RuleManager.generateKey(values.stream().toArray(String[]::new)); + Map valuesMap = + entity.getAttributeValues(ruleIndexingConfig.get().getIndexAttributes()).generateReport(); + applicationLogger.debug("Generating index using attributes: " + valuesMap); + return RuleManager.generateKey(valuesMap.values().stream().toArray(String[]::new)); } catch (ValidationServiceException e) { applicationLogger.debug("Failed to retrieve index key attributes from event: " + e.getMessage()); applicationLogger.error(ApplicationMsgs.CANNOT_VALIDATE_ERROR, e, eventType); @@ -271,7 +275,7 @@ public class RuleDrivenValidator implements Validator { * Read the text content of the specified Path and append this to the specified String * * @param sb - * StringBuilder for the rule configuration text + * StringBuilder for the rule configuration text * @return a Consumer function that appends file content */ private Consumer appendFileContent(StringBuilder sb) { diff --git a/src/test/java/org/onap/aai/validation/ruledriven/validator/TestDataDictionary.java b/src/test/java/org/onap/aai/validation/ruledriven/validator/TestDataDictionary.java new file mode 100644 index 0000000..c3bad43 --- /dev/null +++ b/src/test/java/org/onap/aai/validation/ruledriven/validator/TestDataDictionary.java @@ -0,0 +1,62 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (c) 2018-2019 European Software Marketing Ltd. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aai.validation.ruledriven.validator; + +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.List; +import javax.inject.Inject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.onap.aai.validation.exception.ValidationServiceException; +import org.onap.aai.validation.result.ValidationResult; +import org.onap.aai.validation.ruledriven.RuleDrivenValidator; +import org.onap.aai.validation.test.util.TestUtil; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@TestPropertySource(locations = {"classpath:oxm-reader/schemaIngest.properties"}) +@ContextConfiguration(locations = {"classpath:data-dictionary/test-data-dictionary-beans.xml"}) +public class TestDataDictionary { + + static { + System.setProperty("APP_HOME", "."); + } + + @Inject + private RuleDrivenValidator validator; + + @Test + public void testValidateWithRuleIndexing() throws ValidationServiceException, URISyntaxException, IOException { + List results = + validator.validate(TestUtil.getFileAsString("data-dictionary/test_events/test-create-event.json")); + assertThat(results, is(not(empty()))); + assertThat(results.get(0).getViolations(), is(empty())); + } +} diff --git a/src/test/resources/data-dictionary/rule-data-dictionary.properties b/src/test/resources/data-dictionary/rule-data-dictionary.properties new file mode 100644 index 0000000..35403e4 --- /dev/null +++ b/src/test/resources/data-dictionary/rule-data-dictionary.properties @@ -0,0 +1,24 @@ +# ============LICENSE_START=================================================== +# Copyright (c) 2018-2019 European Software Marketing Ltd. +# ============================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END===================================================== + +rule.datadictionary.hostport=localhost:8080 +rule.datadictionary.connect.timeout=1000 +rule.datadictionary.read.timeout=1000 + +# basic authentication: base64 encoding of username:password +rule.datadictionary.credentials= + +rule.datadictionary.uri=/commonModelElements/instance~nfValuesCatalog~1.0/validateInstance diff --git a/src/test/resources/data-dictionary/rule-indexing.properties b/src/test/resources/data-dictionary/rule-indexing.properties new file mode 100644 index 0000000..0139a8b --- /dev/null +++ b/src/test/resources/data-dictionary/rule-indexing.properties @@ -0,0 +1,20 @@ +# ============LICENSE_START=================================================== +# Copyright (c) 2018-2019 European Software Marketing Ltd. +# ============================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END===================================================== + +rule.indexing.events=POA-EVENT +rule.indexing.exclude.oxm.validation=POA-EVENT +rule.indexing.key.attributes=$.poa-event.modelVersionId,$.poa-event.modelInvariantId +rule.indexing.default.key=default-rules diff --git a/src/test/resources/data-dictionary/rules/poa-event/default-rules.groovy b/src/test/resources/data-dictionary/rules/poa-event/default-rules.groovy new file mode 100644 index 0000000..574c3a2 --- /dev/null +++ b/src/test/resources/data-dictionary/rules/poa-event/default-rules.groovy @@ -0,0 +1,48 @@ +/* + * ============LICENSE_START=================================================== + * Copyright (c) 2018-2019 European Software Marketing Ltd. + * ============================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END===================================================== + */ + +entity { + name 'POA-EVENT' + indexing { indices 'default-rules' } + validation { + useRule { + name 'Data-Dictionary validate VF type' + attributes 'vnfList[*].vfModuleList[*].networkList[*].type' + } + } +} + +rule { + name 'Data-Dictionary validate VF type' + category 'INVALID_VALUE' + description 'Validate all VF type values against data-dictionary' + errorText 'VF type [{0}] failed data-dictionary validation: {1}' + severity 'ERROR' + attributes 'typeList' + validate ''' + List details = new ArrayList<>() + typeList.each { + def result = org.onap.aai.validation.ruledriven.rule.builtin.DataDictionary.validate("instance", "vfModuleNetworkType", "type", "$it") + if (!result.isEmpty()) { + details.add("$it") + details.add("$result") + } + } + return new Tuple2(details.isEmpty(), details) + ''' +} diff --git a/src/test/resources/data-dictionary/schemaIngest.properties b/src/test/resources/data-dictionary/schemaIngest.properties new file mode 100644 index 0000000..8df810a --- /dev/null +++ b/src/test/resources/data-dictionary/schemaIngest.properties @@ -0,0 +1,48 @@ +# ============LICENSE_START=================================================== +# Copyright (c) 2018-2019 European Software Marketing Ltd. +# ============================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END===================================================== + +# Properties for the org.onap.aai.setup.SchemaLocationsBean +# Schema related attributes for the oxm and edges +# Any additional schema related attributes should start with prefix schema +schema.configuration.location=N/A +schema.nodes.location=src/test/resources/oxm-reader/single/oxm +schema.edges.location=src/test/resources/oxm-reader/single/dbedgerules + +# Schema Version Related Attributes + +# Lists all of the versions in the schema +schema.version.list=v8,v9,v10 +# Specifies from which version should the depth parameter to default to zero +schema.version.depth.start=v9 +# Specifies from which version should the related link be displayed in response payload +schema.version.related.link.start=v10 +# Specifies from which version should the client see only the uri excluding host info +# Before this version server base will also be included +schema.version.app.root.start=v10 +# Specifies from which version should the namespace be changed +schema.version.namespace.change.start=v10 +# Specifies from which version should the client start seeing the edge label in payload +schema.version.edge.label.start=v10 +# Specifies the version that the application should default to +schema.version.api.default=v9 + +schema.service.base.url=https://localhost:8452/aai/schema-service/v1/ +schema.service.nodes.endpoint=nodes?version= +schema.service.edges.endpoint=edgerules?version= +schema.service.versions.endpoint=versions + +schema.service.ssl.key-store=src/integration-test/resources/authentication/aai-client-cert.p12 +schema.service.ssl.trust-store=src/integration-test/resources/authentication/tomcat_keystore diff --git a/src/test/resources/data-dictionary/test-data-dictionary-beans.xml b/src/test/resources/data-dictionary/test-data-dictionary-beans.xml new file mode 100644 index 0000000..78a92f1 --- /dev/null +++ b/src/test/resources/data-dictionary/test-data-dictionary-beans.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/data-dictionary/test_events/test-create-event.json b/src/test/resources/data-dictionary/test_events/test-create-event.json new file mode 100644 index 0000000..3693c99 --- /dev/null +++ b/src/test/resources/data-dictionary/test_events/test-create-event.json @@ -0,0 +1,39 @@ +{ + "cambria.partition": "AAI", + "event-header": { + "id": "test", + "timestamp": "20190213-16:27:37:353", + "domain": "test", + "event-type": "POA-EVENT", + "action": "CREATE", + "entity-type": "poa-entity", + "top-entity-type": "poa-entity", + "entity-link": "" + }, + "entity": { + "poa-event": { + "modelVersionId": "model-version-id", + "modelInvariantId": "model-invariant-id" + }, + "vnfList": [ + { + "vfModuleList": [ + { + "networkList": [ + { + "type": "test1" + } + ] + }, + { + "networkList": [ + { + "type": "test2" + } + ] + } + ] + } + ] + } +} diff --git a/src/test/resources/data-dictionary/validation-service-auth.properties b/src/test/resources/data-dictionary/validation-service-auth.properties new file mode 100644 index 0000000..e729536 --- /dev/null +++ b/src/test/resources/data-dictionary/validation-service-auth.properties @@ -0,0 +1,18 @@ +# ============LICENSE_START=================================================== +# Copyright (c) 2018-2019 European Software Marketing Ltd. +# ============================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END===================================================== + +auth.policy.file=auth/auth_policy.json +auth.authentication.disable=false \ No newline at end of file diff --git a/src/test/resources/data-dictionary/validation-service.properties b/src/test/resources/data-dictionary/validation-service.properties new file mode 100644 index 0000000..105953a --- /dev/null +++ b/src/test/resources/data-dictionary/validation-service.properties @@ -0,0 +1,28 @@ +# ============LICENSE_START=================================================== +# Copyright (c) 2018-2019 European Software Marketing Ltd. +# ============================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END===================================================== + +topic.publish.enable=true +topic.publish.retries=3 +topic.consume.enable=true +topic.consume.polling.interval.seconds=7 + +event.domain=onap +event.action.exclude=DELETE +event.type.rule=poa-event +event.type.model=NOT_APPLICABLE +event.type.end=END-EVENT + +model.cache.expirySeconds=3 -- cgit 1.2.3-korg