diff options
9 files changed, 271 insertions, 16 deletions
diff --git a/models-examples/src/main/resources/policytypes/onap.policies.drools.Controller.yaml b/models-examples/src/main/resources/policytypes/onap.policies.drools.Controller.yaml new file mode 100644 index 000000000..74db20205 --- /dev/null +++ b/models-examples/src/main/resources/policytypes/onap.policies.drools.Controller.yaml @@ -0,0 +1,70 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.drools.Controller: + derived_from: tosca.policies.Root + description: a policy type for drools controller configuration + version: 1.0.0 + properties: + controllerName: + type: string + required: true + description: the drools controller name + sourceTopics: + type: list + required: false + description: all the source topices and configurations needed for the events coming under each topic + entry_schema: + type: onap.datatypes.dmaap.topic + sinkTopics: + type: list + required: false + description: all the sink topices and configurations needed for the events sending under each topic + entry_schema: + type: onap.datatypes.dmaap.topic + customConfig: + type: map + required: false + description: any use case specific configurations relevant to the drools controller + entry_schema: + type: string + +data_types: + onap.datatypes.dmaap.topic: + derived_from: tosca.datatypes.Root + properties: + topicName: + type: string + required: true + description: the dmaap topic name + serialization: + type: list + required: true + description: all the configurations needed for serializing all kinds of events under current topic + entry_schema: + type: onap.datatypes.dmaap.serialization + onap.datatypes.dmaap.serialization: + derived_from: tosca.datatypes.Root + properties: + eventCanonicalName: + type: string + required: true + description: the event canonical class for serialization + eventFilter: + type: string + required: false + description: the JSONPath based condition to filter out the events to serialize + customSerializer: + type: onap.datatypes.dmaap.custom_serializer + required: false + description: a custom serializer to use for serializing current event + onap.datatypes.dmaap.custom_serializer: + derived_from: tosca.datatypes.Root + properties: + customSerializerClass: + type: string + required: true + description: the class of custom serializer + jsonParser: + type: string + required: true + description: a json parser to use which is implemented in custom serializer class
\ No newline at end of file diff --git a/models-examples/src/main/resources/policytypes/onap.policies.native.Drools.yaml b/models-examples/src/main/resources/policytypes/onap.policies.native.Drools.yaml new file mode 100644 index 000000000..39b9c7f28 --- /dev/null +++ b/models-examples/src/main/resources/policytypes/onap.policies.native.Drools.yaml @@ -0,0 +1,47 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.Native: + derived_from: tosca.policies.Root + description: a base policy type for all native PDP policies + version: 1.0.0 + onap.policies.native.Drools: + derived_from: onap.policies.Native + description: a policy type for native drools policies + version: 1.0.0 + properties: + rule_artifact: + type: onap.datatypes.native.rule_artifact + required: true + description: the GAV information of the maven artifact + controller: + type: onap.datatypes.drools.controller.relation + required: true + description: the drools controller to which the current native policy is assigned + +data_types: + onap.datatypes.native.rule_artifact: + derived_from: tosca.datatypes.Root + properties: + groupId: + type: string + required: true + description: the groupId of the maven artifact + artifactId: + type: string + required: true + description: the artifactId of the maven artifact + version: + type: string + required: true + description: the version of the maven artifact + onap.datatypes.drools.controller.relation: + derived_from: tosca.datatypes.Root + properties: + controllerPolicyName: + type: string + required: true + description: the name of drools controller policy + controllerPolicyVersion: + type: string + required: true + description: the version of drools controller policy
\ No newline at end of file diff --git a/models-examples/src/main/resources/policytypes/onap.policies.native.Xacml.yaml b/models-examples/src/main/resources/policytypes/onap.policies.native.Xacml.yaml new file mode 100644 index 000000000..d065f6187 --- /dev/null +++ b/models-examples/src/main/resources/policytypes/onap.policies.native.Xacml.yaml @@ -0,0 +1,17 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.Native: + derived_from: tosca.policies.Root + description: a base policy type for all native PDP policies + version: 1.0.0 + onap.policies.native.Xacml: + derived_from: onap.policies.Native + description: a policy type for native xacml policies + version: 1.0.0 + properties: + policy: + type: String + required: true + description: The XML XACML 3.0 PolicySet or Policy + metadata: + encoding: URL
\ No newline at end of file diff --git a/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/constants/CdsActorConstants.java b/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/constants/CdsActorConstants.java index 8f929c83e..0dc5bfb34 100644 --- a/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/constants/CdsActorConstants.java +++ b/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/constants/CdsActorConstants.java @@ -32,6 +32,7 @@ public class CdsActorConstants { // CDS blueprint archive parameters public static final String KEY_CBA_NAME = "artifact_name"; public static final String KEY_CBA_VERSION = "artifact_version"; + public static final String KEY_POLICY_PAYLOAD_DATA = "data"; public static final String KEY_RESOLUTION_KEY = "resolution-key"; public static final String CDS_REQUEST_SUFFIX = "-request"; public static final String CDS_REQUEST_PROPERTIES_SUFFIX = "-properties"; diff --git a/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequest.java b/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequest.java index 4193db59f..e362fe874 100644 --- a/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequest.java +++ b/models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequest.java @@ -57,14 +57,26 @@ public class CdsActionRequest implements Serializable { * @throws CoderException if error occurs when serializing to JSON string */ public String generateCdsPayload() throws CoderException { - // 1. Build the innermost object to include AAI properties and policy payload information - Map<String, String> cdsActionPropsMap = new LinkedHashMap<>(); - cdsActionPropsMap.putAll(aaiProperties); - cdsActionPropsMap.putAll(policyPayload); + // 1a. Build the innermost object to include AAI properties + Map<String, Object> cdsActionPropsMap = new LinkedHashMap<>(aaiProperties); if (additionalEventParams != null) { cdsActionPropsMap.putAll(additionalEventParams); } + // 1b. Build the innermost object to include policy payload. + // If the policy payload data is a valid JSON string convert to an object else retain as a string. + if (policyPayload != null && !policyPayload.isEmpty()) { + String payload = policyPayload.get(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA); + try { + Object payloadObj = CODER.decode(payload, Object.class); + cdsActionPropsMap.put(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, payloadObj); + } catch (CoderException e) { + cdsActionPropsMap.put(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, payload); + } + } else { + cdsActionPropsMap.put(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, ""); + } + // 2. Build the enclosing CDS action request properties object to contain (1) and the resolution-key Map<String, Object> cdsActionRequestMap = new LinkedHashMap<>(); cdsActionRequestMap.put(CdsActorConstants.KEY_RESOLUTION_KEY, resolutionKey); diff --git a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequestTest.java b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequestTest.java index e34fa33ab..7266d0311 100644 --- a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequestTest.java +++ b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/request/CdsActionRequestTest.java @@ -18,10 +18,13 @@ package org.onap.policy.controlloop.actor.cds.request; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableMap; +import java.util.HashMap; import java.util.Map; +import org.junit.Before; import org.junit.Test; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants; @@ -29,23 +32,65 @@ import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants; public class CdsActionRequestTest { private static final String TEST_ACTION_NAME = "vfw-modify-config"; + private CdsActionRequest req = new CdsActionRequest(); - @Test - public void testGenerateCdsPayload() throws CoderException { - // Setup the CdsActionRequest object - CdsActionRequest req = new CdsActionRequest(); + /** + * Setup the CdsActionRequest object. + */ + @Before + public void setUp() { req.setActionName(TEST_ACTION_NAME); req.setResolutionKey("1234567890"); - Map<String, String> payloadProps = ImmutableMap.of("data", "{\"active-streams\":\"5\"}"); - req.setPolicyPayload(payloadProps); Map<String, String> aaiParams = ImmutableMap.of("service-instance.service-instance-id", "1234", "generic-vnf.vnf-id", "5678"); req.setAaiProperties(aaiParams); - Map<String, String> eventParams = - ImmutableMap.of("event-param-1", "1234", "event-param-2", "5678"); + Map<String, String> eventParams = ImmutableMap.of("event-param-1", "1234", "event-param-2", "5678"); req.setAdditionalEventParams(eventParams); + } + + @Test + public void testGenerateCdsPayloadWhenPolicyPayloadIsNotValidJsonString() throws CoderException { + String payloadStr = "active-streams=5"; + Map<String, String> payloadProps = ImmutableMap.of(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, payloadStr); + req.setPolicyPayload(payloadProps); + + // Act + String result = req.generateCdsPayload(); + + // Assert + assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_PROPERTIES_SUFFIX)); + assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_SUFFIX)); + assertTrue(result.contains(CdsActorConstants.KEY_RESOLUTION_KEY)); + assertTrue(result.contains("\"" + CdsActorConstants.KEY_POLICY_PAYLOAD_DATA + "\":\"" + payloadStr + "\"")); + } + + @Test + public void testGenerateCdsPayloadWhenPolicyPayloadIsValidJsonString() throws CoderException { + String payloadStr = "{\"active-streams\":\"5\"}"; + Map<String, String> payloadProps = ImmutableMap.of(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, payloadStr); + req.setPolicyPayload(payloadProps); + + // Act + String result = req.generateCdsPayload(); + + // Assert + assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_PROPERTIES_SUFFIX)); + assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_SUFFIX)); + assertTrue(result.contains(CdsActorConstants.KEY_RESOLUTION_KEY)); + assertTrue(result.contains("\"" + CdsActorConstants.KEY_POLICY_PAYLOAD_DATA + "\":" + payloadStr)); + } + + @Test + public void testGenerateCdsPayloadWhenPolicyPayloadIsNull() throws CoderException { + Map<String, String> payloadProps = new HashMap<String, String>() { + private static final long serialVersionUID = 1L; + { + put(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA, null); + } + }; + req.setPolicyPayload(payloadProps); // Act String result = req.generateCdsPayload(); @@ -54,5 +99,6 @@ public class CdsActionRequestTest { assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_PROPERTIES_SUFFIX)); assertTrue(result.contains(TEST_ACTION_NAME + CdsActorConstants.CDS_REQUEST_SUFFIX)); assertTrue(result.contains(CdsActorConstants.KEY_RESOLUTION_KEY)); + assertFalse(result.contains(CdsActorConstants.KEY_POLICY_PAYLOAD_DATA)); } } diff --git a/models-interactions/model-impl/cds/pom.xml b/models-interactions/model-impl/cds/pom.xml index 1dd691aca..8183cc7e4 100644 --- a/models-interactions/model-impl/cds/pom.xml +++ b/models-interactions/model-impl/cds/pom.xml @@ -35,7 +35,6 @@ <grpc.version>1.17.1</grpc.version> <protobuf.version>3.6.1</protobuf.version> <grpc.netty.version>4.1.39.Final</grpc.netty.version> - <ccsdk.version>0.4.4</ccsdk.version> </properties> <dependencies> @@ -43,7 +42,6 @@ <dependency> <groupId>org.onap.ccsdk.cds.components</groupId> <artifactId>proto-definition</artifactId> - <version>${ccsdk.version}</version> </dependency> <!-- protobuf dependencies --> diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpGroupFilter.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpGroupFilter.java index d67f2d4cb..7faf19748 100644 --- a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpGroupFilter.java +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpGroupFilter.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2019 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. @@ -121,7 +122,7 @@ public class PdpGroupFilter implements PfObjectFilter<PdpGroup> { if (matchPolicyTypesExactly && areListsIdentical(pdpSubGroup.getSupportedPolicyTypes(), typeFilter)) { return true; } else if (!matchPolicyTypesExactly - && findSingleElement(pdpSubGroup.getSupportedPolicyTypes(), typeFilter)) { + && findSupportedPolicyType(pdpSubGroup.getSupportedPolicyTypes(), typeFilter)) { return true; } } @@ -131,6 +132,32 @@ public class PdpGroupFilter implements PfObjectFilter<PdpGroup> { } /** + * Find a single supported type. + * + * @param supportedPolicyTypes supported types + * @param typeFilter the list of types, one of which we wish to find supported by + * the list we are searching + * @return true if one element of the elements to find is supported by an element on + * the list we searched + */ + private boolean findSupportedPolicyType(List<ToscaPolicyTypeIdentifier> supportedPolicyTypes, + List<ToscaPolicyTypeIdentifier> typeFilter) { + for (ToscaPolicyTypeIdentifier supportedPolicyType : supportedPolicyTypes) { + String supName = supportedPolicyType.getName(); + if (supName.endsWith(".*")) { + String substr = supName.substring(0, supName.length() - 1); + if (typeFilter.stream().anyMatch(type -> type.getName().startsWith(substr))) { + return true; + } + } else if (typeFilter.contains(supportedPolicyType)) { + return true; + } + } + + return false; + } + + /** * Filter PDP groups on policy. * * @param pdpGroup the PDP group to check diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/concepts/PdpGroupFilterTest.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/concepts/PdpGroupFilterTest.java index 808bfe7d4..9ffb0f41d 100644 --- a/models-pdp/src/test/java/org/onap/policy/models/pdp/concepts/PdpGroupFilterTest.java +++ b/models-pdp/src/test/java/org/onap/policy/models/pdp/concepts/PdpGroupFilterTest.java @@ -27,7 +27,7 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; - +import java.util.stream.Collectors; import org.junit.Before; import org.junit.Test; import org.onap.policy.common.utils.coder.CoderException; @@ -183,6 +183,22 @@ public class PdpGroupFilterTest { assertEquals(0, filteredList.size()); identifierList.clear(); + // don't match wild cards + identifierList.add(new ToscaPolicyTypeIdentifier(NON_EXISTANT, VERSION1)); + filter = PdpGroupFilter.builder().policyTypeList(identifierList).build(); + final List<PdpGroup> wildCards = + pdpGroupList.stream().map(this::makeWildCardPolicyTypes).collect(Collectors.toList()); + filteredList = filter.filter(wildCards); + assertEquals(0, filteredList.size()); + identifierList.clear(); + + // match wild cards + identifierList.add(new ToscaPolicyTypeIdentifier(POLICY_TYPE0, VERSION1)); + filter = PdpGroupFilter.builder().policyTypeList(identifierList).build(); + filteredList = filter.filter(wildCards); + assertEquals(4, filteredList.size()); + identifierList.clear(); + identifierList.add(new ToscaPolicyTypeIdentifier(POLICY_TYPE0, VERSION1)); filter = PdpGroupFilter.builder().policyTypeList(identifierList).build(); filteredList = filter.filter(pdpGroupList); @@ -251,6 +267,27 @@ public class PdpGroupFilterTest { assertEquals(1, filteredList.size()); } + /** + * Makes a clone of a PdpGroup, changing all occurrences of supported policy type, + * "policy.type.0", to a wild card type, "policy.type.*". + * + * @param group group to be cloned + * @return a new PdpGroup containing wild card policy types + */ + private PdpGroup makeWildCardPolicyTypes(PdpGroup group) { + PdpGroup newGroup = new PdpGroup(group); + + for (PdpSubGroup subgroup : newGroup.getPdpSubgroups()) { + for (ToscaPolicyTypeIdentifier subType : subgroup.getSupportedPolicyTypes()) { + if (POLICY_TYPE0.equals(subType.getName())) { + subType.setName("policy.type.*"); + } + } + } + + return newGroup; + } + @Test public void testFilterPolicy() { List<ToscaPolicyIdentifier> identifierList = new ArrayList<>(); |