From baa4e928207f5930fcd620bddddcd493aa7a4122 Mon Sep 17 00:00:00 2001 From: jhh Date: Thu, 30 Jan 2020 18:57:13 -0600 Subject: domain native and operational policies support - moved DomainMaker to policy-utils/ project. - support for native drools and controller drools policy types. Issue-ID: POLICY-2345 Signed-off-by: jhh Change-Id: I46b9816eadceb7ef280e0e6789f07b4d4ca51519 Signed-off-by: jhh --- .../domain/models/DomainPolicyTypesTest.java | 240 +++++++++++++++++++++ .../domain/models/DroolsPolicyModelsTest.java | 86 ++++++++ .../example.policy.drools.controller.tosca.json | 54 +++++ .../example.policy.native.drools.tosca.json | 29 +++ 4 files changed, 409 insertions(+) create mode 100644 feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DomainPolicyTypesTest.java create mode 100644 feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DroolsPolicyModelsTest.java create mode 100644 feature-lifecycle/src/test/resources/example.policy.drools.controller.tosca.json create mode 100644 feature-lifecycle/src/test/resources/example.policy.native.drools.tosca.json (limited to 'feature-lifecycle/src/test') diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DomainPolicyTypesTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DomainPolicyTypesTest.java new file mode 100644 index 00000000..945b00b1 --- /dev/null +++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DomainPolicyTypesTest.java @@ -0,0 +1,240 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.domain.models; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.worldturner.medeia.api.ValidationFailedException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.common.utils.resources.ResourceUtils; +import org.onap.policy.drools.domain.models.controller.ControllerPolicy; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsController; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsPolicy; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsProperties; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsRulesArtifact; +import org.onap.policy.drools.policies.DomainMaker; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; + +public class DomainPolicyTypesTest { + + // Policy Types + private static final String OPERATIONAL_DROOLS_POLICY_TYPE = "onap.policies.controlloop.operational.common.Drools"; + private static final String NATIVE_DROOLS_POLICY_TYPE = "onap.policies.native.Drools"; + + // Operational vCPE Policy + private static final String OP_POLICY_NAME_VCPE = "operational.restart"; + private static final String VCPE_OPERATIONAL_DROOLS_POLICY_JSON = + "policies/vCPE.policy.operational.input.tosca.json"; + public static final String VCPE_OPERATIONAL_DROOLS_LEGACY_POLICY_JSON = + "src/test/resources/tosca-policy-operational-restart.json"; + + // Native Drools Policy + private static final String EXAMPLE_NATIVE_DROOLS_POLICY_NAME = "example"; + private static final String EXAMPLE_NATIVE_DROOLS_POLICY_JSON = + "src/test/resources/example.policy.native.drools.tosca.json"; + + // Controller Drools Policy + private static final String EXAMPLE_CONTROLLER_DROOLS_POLICY_NAME = "example"; + private static final String EXAMPLE_CONTROLLER_DROOLS_POLICY_JSON = + "src/test/resources/example.policy.drools.controller.tosca.json"; + + private DomainMaker domainMaker; + private StandardCoder nonValCoder; + + @Before + public void setUp() { + domainMaker = new DomainMaker(); + nonValCoder = new StandardCoder(); + } + + @Test + public void testToscaOperationalPolicyType() throws CoderException, IOException { + String rawVcpeToscaPolicy = getExamplesPolicyString(VCPE_OPERATIONAL_DROOLS_POLICY_JSON, OP_POLICY_NAME_VCPE); + String rawVcpeLegacyToscaPolicy = getJsonFromFile(VCPE_OPERATIONAL_DROOLS_LEGACY_POLICY_JSON); + + // valid "known" policy type with implicit schema + assertTrue(domainMaker + .isConformant(new ToscaPolicyTypeIdentifier(OPERATIONAL_DROOLS_POLICY_TYPE, "1.0.0"), + rawVcpeToscaPolicy)); + + // policy type without schema + assertFalse(domainMaker + .isConformant(new ToscaPolicyTypeIdentifier("blah.blah", "1.0.0"), rawVcpeToscaPolicy)); + + // known policy type but invalid json (legacy). + assertFalse(domainMaker + .isConformant(new ToscaPolicyTypeIdentifier(OPERATIONAL_DROOLS_POLICY_TYPE, "1.0.0"), + rawVcpeLegacyToscaPolicy)); + + ToscaPolicy vcpeToscaPolicy = getExamplesPolicy(VCPE_OPERATIONAL_DROOLS_POLICY_JSON, OP_POLICY_NAME_VCPE); + assertTrue(domainMaker.isConformant(vcpeToscaPolicy)); + assertTrue(domainMaker.conformance(vcpeToscaPolicy)); + + // set an invalid value in the Tosca Policy (timeout less than minimum value). + final int timeout = (int) vcpeToscaPolicy.getProperties().get("timeout"); + vcpeToscaPolicy.getProperties().put("timeout", 0); + assertFalse(domainMaker.isConformant(vcpeToscaPolicy)); + assertThatThrownBy(() -> + domainMaker.conformance(vcpeToscaPolicy)) + .isInstanceOf(ValidationFailedException.class) + .hasMessageContaining("Value 0 is smaller than minimum 1"); + + // put back the original timeout value in the Tosca Policy + vcpeToscaPolicy.getProperties().put("timeout", timeout); + assertTrue(domainMaker.isConformant(vcpeToscaPolicy)); + assertTrue(domainMaker.conformance(vcpeToscaPolicy)); + + // remove required element + final Object operations = vcpeToscaPolicy.getProperties().remove("operations"); + assertFalse(domainMaker.isConformant(vcpeToscaPolicy)); + assertThatThrownBy(() -> + domainMaker.conformance(vcpeToscaPolicy)) + .isInstanceOf(ValidationFailedException.class) + .hasMessageContaining("Required property operations is missing from object"); + + // put back the original operations value in the Tosca Policy + vcpeToscaPolicy.getProperties().put("operations", operations); + assertTrue(domainMaker.isConformant(vcpeToscaPolicy)); + assertTrue(domainMaker.conformance(vcpeToscaPolicy)); + } + + @Test + public void testToscaNativeDroolsPolicy() throws CoderException, IOException { + String rawNativeDroolsPolicy = + getPolicyFromFileString(EXAMPLE_NATIVE_DROOLS_POLICY_JSON, EXAMPLE_NATIVE_DROOLS_POLICY_NAME); + ToscaPolicy toscaPolicy = + getExamplesPolicy(EXAMPLE_NATIVE_DROOLS_POLICY_JSON, EXAMPLE_NATIVE_DROOLS_POLICY_NAME); + + ToscaPolicyTypeIdentifier policyTypeId = + new ToscaPolicyTypeIdentifier(NATIVE_DROOLS_POLICY_TYPE, "1.0.0"); + domainMaker.isConformant(policyTypeId, rawNativeDroolsPolicy); + + assertTrue(domainMaker.isConformant(toscaPolicy)); + NativeDroolsPolicy domainDroolsPolicy = domainMaker.convertTo(toscaPolicy, NativeDroolsPolicy.class); + assertEquals("org.onap.policy.controlloop", domainDroolsPolicy.getProperties().getRulesArtifact().getGroupId()); + assertEquals("example", domainDroolsPolicy.getProperties().getRulesArtifact().getArtifactId()); + assertEquals("1.0.0", domainDroolsPolicy.getProperties().getRulesArtifact().getVersion()); + + String policyId = toscaPolicy.getMetadata().remove("policy-id"); + assertThatThrownBy(() -> domainMaker.convertTo(toscaPolicy, NativeDroolsPolicy.class)) + .isInstanceOf(CoderException.class).hasCauseInstanceOf(ValidationFailedException.class); + + toscaPolicy.getMetadata().put("policy-id", policyId); + + assertTrue(domainMaker.isDomainConformant(policyTypeId, domainDroolsPolicy)); + assertTrue(domainMaker.conformance(policyTypeId, domainDroolsPolicy)); + + domainDroolsPolicy.setName(""); + assertFalse(domainMaker.isDomainConformant(policyTypeId, domainDroolsPolicy)); + assertThatThrownBy(() -> domainMaker.conformance(policyTypeId, domainDroolsPolicy)) + .isInstanceOf(ValidationFailedException.class) + .hasMessageContaining("Pattern ^(.+)$ is not contained in text"); + + NativeDroolsPolicy domainDroolsPolicy2 = + NativeDroolsPolicy.builder().metadata(Metadata.builder().policyId("policy-id").build()).name("example") + .version("1.0.0").properties( + NativeDroolsProperties.builder().controller( + NativeDroolsController.builder().name("example").version("1.0.0").build()) + .rulesArtifact( + NativeDroolsRulesArtifact.builder().groupId("org.onap.policy.controlloop") + .artifactId("example").version("example").build()).build()) + .type("onap.policies.native.Drools") + .typeVersion("1.0.0").build(); + assertTrue(domainMaker + .isDomainConformant( + new ToscaPolicyTypeIdentifier(domainDroolsPolicy2.getType(), domainDroolsPolicy2.getTypeVersion()), + domainDroolsPolicy2)); + } + + @Test + public void testToscaControllerPolicy() throws CoderException { + ToscaPolicy toscaPolicy = + getExamplesPolicy(EXAMPLE_CONTROLLER_DROOLS_POLICY_JSON, EXAMPLE_CONTROLLER_DROOLS_POLICY_NAME); + + assertTrue(domainMaker.isConformant(toscaPolicy)); + ControllerPolicy controllerPolicy = domainMaker.convertTo(toscaPolicy, ControllerPolicy.class); + + assertEquals("example", controllerPolicy.getName()); + assertEquals("1.0.0", controllerPolicy.getVersion()); + assertEquals("onap.policies.drools.Controller", controllerPolicy.getType()); + assertEquals("1.0.0", controllerPolicy.getTypeVersion()); + assertEquals("example", controllerPolicy.getMetadata().getPolicyId()); + assertEquals("example", controllerPolicy.getProperties().getControllerName()); + assertEquals("DCAE_TOPIC", controllerPolicy.getProperties().getSourceTopics().get(0).getTopicName()); + assertEquals("org.onap.policy.controlloop.CanonicalOnset", + controllerPolicy.getProperties().getSourceTopics().get(0).getSerialization().get(0).getEventClass()); + assertEquals("[?($.closedLoopEventStatus == 'ONSET')]", + controllerPolicy.getProperties().getSourceTopics().get(0).getSerialization().get(0).getEventFilter()); + assertEquals("org.onap.policy.controlloop.util.Serialization", + controllerPolicy.getProperties().getSourceTopics().get(0).getSerialization().get(0) + .getCustomSerializer().getCustomSerializerClass()); + assertEquals("gson", + controllerPolicy.getProperties().getSourceTopics().get(0).getSerialization().get(0) + .getCustomSerializer().getJsonParser()); + assertEquals("APPC-CL", controllerPolicy.getProperties().getSinkTopics().get(0).getTopicName()); + assertEquals("org.onap.policy.appc.Response", + controllerPolicy.getProperties().getSinkTopics().get(0).getSerialization().get(0).getEventClass()); + assertEquals("[?($.CommonHeader && $.Status)]", + controllerPolicy.getProperties().getSinkTopics().get(0).getSerialization().get(0).getEventFilter()); + assertEquals("org.onap.policy.appc.util.Serialization", + controllerPolicy.getProperties().getSinkTopics().get(0).getSerialization().get(0) + .getCustomSerializer().getCustomSerializerClass()); + assertEquals("gsonPretty", + controllerPolicy.getProperties().getSinkTopics().get(0).getSerialization().get(0) + .getCustomSerializer().getJsonParser()); + assertEquals("value1", controllerPolicy.getProperties().getCustomConfig().get("field1")); + } + + private String getJsonFromFile(String filePath) throws IOException { + return new String(Files.readAllBytes(Paths.get(filePath))); + } + + private String getJsonFromResource(String resourcePath) { + return ResourceUtils.getResourceAsString(resourcePath); + } + + private String getPolicyFromFileString(String filePath, String policyName) throws CoderException, IOException { + String policyJson = getJsonFromFile(filePath); + ToscaServiceTemplate serviceTemplate = new StandardCoder().decode(policyJson, ToscaServiceTemplate.class); + return nonValCoder.encode(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName)); + } + + private ToscaPolicy getExamplesPolicy(String resourcePath, String policyName) throws CoderException { + String policyJson = getJsonFromResource(resourcePath); + ToscaServiceTemplate serviceTemplate = new StandardCoder().decode(policyJson, ToscaServiceTemplate.class); + return serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName); + } + + private String getExamplesPolicyString(String resourcePath, String policyName) throws CoderException { + return nonValCoder.encode(getExamplesPolicy(resourcePath, policyName)); + } +} \ No newline at end of file diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DroolsPolicyModelsTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DroolsPolicyModelsTest.java new file mode 100644 index 00000000..813acdfa --- /dev/null +++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/domain/models/DroolsPolicyModelsTest.java @@ -0,0 +1,86 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.domain.models; + +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.filters.FilterChain; +import com.openpojo.reflection.filters.FilterClassName; +import com.openpojo.reflection.filters.FilterNonConcrete; +import com.openpojo.reflection.impl.PojoClassFactory; +import com.openpojo.validation.Validator; +import com.openpojo.validation.ValidatorBuilder; +import com.openpojo.validation.test.impl.GetterTester; +import com.openpojo.validation.test.impl.SetterTester; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.onap.policy.drools.domain.models.controller.ControllerPolicy; +import org.onap.policy.drools.domain.models.controller.ControllerProperties; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsController; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsPolicy; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsProperties; +import org.onap.policy.drools.domain.models.nativ.rules.NativeDroolsRulesArtifact; + +public class DroolsPolicyModelsTest { + + @Test + public void testPackage() { + /* validate model pojos */ + List pojoClasses = + PojoClassFactory + .getPojoClassesRecursively("org.onap.policy.drools.domain.models", + new FilterChain(new FilterNonConcrete(), + new FilterClassName(DroolsPolicy.class.getName()))); + + Validator validator = ValidatorBuilder.create() + .with(new SetterTester(), new GetterTester()).build(); + validator.validate(pojoClasses); + } + + @Test + public void testBuildDomainPolicyNativeDrools() { + /* manually create a native drools policy */ + NativeDroolsPolicy.builder().metadata(Metadata.builder().policyId("policy-id").build()).name("example") + .type("onap.policies.native.Drools") + .typeVersion("1.0.0") + .version("1.0.0") + .properties( + NativeDroolsProperties.builder().controller( + NativeDroolsController.builder().name("example").version("1.0.0").build()) + .rulesArtifact( + NativeDroolsRulesArtifact.builder().groupId("org.onap.policy.controlloop") + .artifactId("example").version("example").build()).build()) + .build(); + } + + @Test + public void testBuildDomainPolicyController() { + /* manually create a controller policy */ + ControllerPolicy.builder().metadata(Metadata.builder().policyId("policy-id").build()).name("example") + .version("1.0.0") + .type("onap.policies.drools.Controller") + .typeVersion("1.0.0") + .properties(ControllerProperties.builder().controllerName("example").sourceTopics( + new ArrayList<>()).sinkTopics(new ArrayList<>()).build()) + .build(); + } + +} \ No newline at end of file diff --git a/feature-lifecycle/src/test/resources/example.policy.drools.controller.tosca.json b/feature-lifecycle/src/test/resources/example.policy.drools.controller.tosca.json new file mode 100644 index 00000000..b4dd50da --- /dev/null +++ b/feature-lifecycle/src/test/resources/example.policy.drools.controller.tosca.json @@ -0,0 +1,54 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_0_0", + "topology_template": { + "policies": [ + { + "example": { + "type": "onap.policies.drools.Controller", + "type_version": "1.0.0", + "version": "1.0.0", + "name": "example", + "metadata": { + "policy-id": "example" + }, + "properties": { + "controllerName": "example", + "sourceTopics": [ + { + "topicName": "DCAE_TOPIC", + "serialization": [ + { + "eventClass": "org.onap.policy.controlloop.CanonicalOnset", + "eventFilter": "[?($.closedLoopEventStatus == 'ONSET')]", + "customSerializer": { + "customSerializerClass": "org.onap.policy.controlloop.util.Serialization", + "jsonParser": "gson" + } + } + ] + } + ], + "sinkTopics": [ + { + "topicName": "APPC-CL", + "serialization": [ + { + "eventClass": "org.onap.policy.appc.Response", + "eventFilter": "[?($.CommonHeader && $.Status)]", + "customSerializer": { + "customSerializerClass": "org.onap.policy.appc.util.Serialization", + "jsonParser": "gsonPretty" + } + } + ] + } + ], + "customConfig": { + "field1" : "value1" + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/feature-lifecycle/src/test/resources/example.policy.native.drools.tosca.json b/feature-lifecycle/src/test/resources/example.policy.native.drools.tosca.json new file mode 100644 index 00000000..0313b2ed --- /dev/null +++ b/feature-lifecycle/src/test/resources/example.policy.native.drools.tosca.json @@ -0,0 +1,29 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_0_0", + "topology_template": { + "policies": [ + { + "example": { + "type": "onap.policies.native.Drools", + "type_version": "1.0.0", + "version": "1.0.0", + "name": "example", + "metadata": { + "policy-id": "example" + }, + "properties": { + "rulesArtifact": { + "groupId": "org.onap.policy.controlloop", + "artifactId": "example", + "version": "1.0.0" + }, + "controller": { + "name": "example", + "version": "1.0.0" + } + } + } + } + ] + } +} \ No newline at end of file -- cgit 1.2.3-korg