diff options
14 files changed, 587 insertions, 46 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.Apex.yaml b/models-examples/src/main/resources/policytypes/onap.policies.native.Apex.yaml new file mode 100644 index 000000000..11663944f --- /dev/null +++ b/models-examples/src/main/resources/policytypes/onap.policies.native.Apex.yaml @@ -0,0 +1,207 @@ +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.Apex: + derived_from: onap.policies.Native + description: a policy type for native apex policies + version: 1.0.0 + properties: + engine_service: + type: onap.datatypes.native.apex.EngineService + description: APEX Engine Service Parameters + inputs: + type: map + description: Inputs for handling events coming into the APEX engine + entry_schema: + type: onap.datatypes.native.apex.EventHandler + outputs: + type: map + description: Outputs for handling events going out of the APEX engine + entry_schema: + type: onap.datatypes.native.apex.EventHandler + environment: + type: list + description: Envioronmental parameters for the APEX engine + entry_schema: + type: onap.datatypes.native.apex.Environment + +data_types: + onap.datatypes.native.apex.EngineService: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + description: Specifies the engine name + required: false + default: "ApexEngineService" + version: + type: string + description: Specifies the engine version in double dotted format + required: false + default: "1.0.0" + id: + type: int + description: Specifies the engine id + required: true + instance_count: + type: int + description: Specifies the number of engine threads that should be run + required: true + deployment_port: + type: int + description: Specifies the port to connect to for engine administration + required: false + default: 1 + policy_model_file_name: + type: string + description: The name of the file from which to read the APEX policy model + required: false + default: "" + policy_type_impl: + type: string + description: The policy type implementation from which to read the APEX policy model + required: false + default: "" + periodic_event_period: + type: string + description: The time interval in milliseconds for the periodic scanning event, 0 means don't scan + required: false + default: 0 + engine: + type: onap.datatypes.native.apex.engineservice.Engine + description: The parameters for all engines in the APEX engine service + required: true + onap.datatypes.native.apex.EventHandler: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + description: Specifies the event handler name, if not specified this is set to the key name + required: false + carrier_technology: + type: onap.datatypes.native.apex.CarrierTechnology + description: Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka) + required: true + event_protocol: + type: onap.datatypes.native.apex.EventProtocol + description: Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO) + required: true + event_name: + type: string + description: Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent + required: false + event_name_filter: + type: string + description: Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through + required: false + synchronous_mode: + type: bool + description: Specifies the event handler is syncronous (receive event and send response) + required: false + default: false + synchronous_peer: + type: string + description: The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode + required: false + default: "" + synchronous_timeout: + type: int + description: The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode + required: false + default: "" + requestor_mode: + type: bool + description: Specifies the event handler is in requestor mode (send event and wait for response mode) + required: false + default: false + requestor_peer: + type: string + description: The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode + required: false + default: "" + requestor_timeout: + type: int + description: The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode + required: false + default: "" + onap.datatypes.native.apex.CarrierTechnology: + derived_from: tosca.datatypes.Root + properties: + label: + type: string + description: The label (name) of the carrier technology (such as REST, Kafka, WebSocket) + required: true + plugin_parameter_class_name: + type: string + description: The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class + required: false + onap.datatypes.native.apex.EventProtocol: + derived_from: tosca.datatypes.Root + properties: + label: + type: string + description: The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO) + required: true + event_protocol_plugin_class: + type: string + description: The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class + required: false + onap.datatypes.native.apex.Environmental: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + description: The name of the environment variable + required: true + value: + type: string + description: The value of the environment variable + required: true + onap.datatypes.native.apex.engineservice.Engine: + derived_from: tosca.datatypes.Root + properties: + context: + type: onap.datatypes.native.apex.engineservice.engine.Context + description: The properties for handling context in APEX engines, defaults to using Java maps for context + required: false + executors: + type: map + description: The plugins for policy executors used in engines such as javascript, MVEL, Jython + required: true + entry_schema: + description: The plugin class path for this policy executor + type: string + onap.datatypes.native.apex.engineservice.engine.Context: + derived_from: tosca.datatypes.Root + properties: + distributor: + type: onap.datatypes.native.apex.Plugin + description: The plugin to be used for distributing context between APEX PDPs at runtime + required: false + schemas: + type: map + description: The plugins for context schemas available in APEX PDPs such as Java and Avro + required: false + entry_schema: + type: onap.datatypes.native.apex.Plugin + locking: + type: onap.datatypes.native.apex.plugin + description: The plugin to be used for locking context in and between APEX PDPs at runtime + required: false + persistence: + type: onap.datatypes.native.apex.Plugin + description: The plugin to be used for persisting context for APEX PDPs at runtime + required: false + onap.datatypes.native.apex.Plugin: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + description: The name of the executor such as Javascript, Jython or MVEL + required: true + plugin_class_name: + type: string + description: The class path of the plugin class for this executor
\ 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/aai/src/main/java/org/onap/policy/aai/AaiManager.java b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java index 5b484243a..923b8d329 100644 --- a/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java +++ b/models-interactions/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java @@ -22,7 +22,6 @@ package org.onap.policy.aai; -import com.google.gson.JsonSyntaxException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -30,9 +29,9 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; + import org.json.JSONArray; import org.json.JSONObject; -import org.onap.policy.aai.util.Serialization; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; import org.onap.policy.common.endpoints.utils.NetLoggerUtil; import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; @@ -55,14 +54,13 @@ public final class AaiManager { private static final StandardCoder CODER = new StandardCoder(); - /** The rest manager. */ // The REST manager used for processing REST calls for this AAI manager private final RestManager restManager; /** custom query and other AAI resource URLs. */ private static final String CQ_URL = "/aai/v16/query?format=resource"; - private static final String TENANT_URL = - "/aai/v16/search/nodes-query?search-node-type=vserver&filter=vserver-name:EQUALS:"; + private static final String TENANT_URL = "/aai/v16/search/nodes-query?" + + "search-node-type=vserver&filter=vserver-name:EQUALS:"; private static final String PREFIX = "/aai/v16"; private static final String PNF_URL = PREFIX + "/network/pnfs/pnf/"; private static final String AAI_DEPTH_SUFFIX = "?depth=0"; @@ -116,7 +114,7 @@ public final class AaiManager { * @return String */ private String getCustomQueryRequestPayload(String url, String username, String password, UUID requestId, - String vserver) { + String vserver) { String urlGet = url + TENANT_URL; @@ -135,7 +133,7 @@ public final class AaiManager { * @return AaiCqResponse response from Aai for custom query */ public AaiCqResponse getCustomQueryResponse(String url, String username, String password, UUID requestId, - String vserver) { + String vserver) { final Map<String, String> headers = createHeaders(requestId); @@ -145,24 +143,27 @@ public final class AaiManager { url = url + CQ_URL; - Pair<Integer, String> httpDetails = - this.restManager.put(url, username, password, headers, APPLICATION_JSON, requestJson); + Pair<Integer, String> httpDetails = this.restManager.put(url, username, password, headers, APPLICATION_JSON, + requestJson); logger.debug("RestManager.put after"); if (httpDetails == null) { - logger.info("AAI POST Null Response to {}", url); + NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, url, "AAI POST Null Response"); + logger.debug("AAI POST Null Response to {}", url); return null; } int httpResponseCode = httpDetails.first; - logger.info(url); - logger.info("{}", httpResponseCode); - logger.info(httpDetails.second); + NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, url, "Response code: " + httpResponseCode); + NetLoggerUtil.getNetworkLogger().debug(httpDetails.second); + + logger.debug(url); + logger.debug("{}", httpResponseCode); + logger.debug(httpDetails.second); if (httpDetails.second != null) { - String resp = httpDetails.second; - return new AaiCqResponse(resp); + return new AaiCqResponse(httpDetails.second); } return null; } @@ -178,7 +179,7 @@ public final class AaiManager { * @return String returns the string from the get query */ private String getStringQuery(final String url, final String username, final String password, final UUID requestId, - final String key) { + final String key) { Map<String, String> headers = createHeaders(requestId); @@ -190,21 +191,22 @@ public final class AaiManager { NetLoggerUtil.getNetworkLogger().info("[OUT|{}|{}|]", CommInfrastructure.REST, urlGet); Pair<Integer, String> httpDetailsGet = restManager.get(urlGet, username, password, headers); if (httpDetailsGet == null) { - logger.info("AAI GET Null Response to {}", urlGet); + NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, url, "AAI POST Null Response"); + logger.debug("AAI GET Null Response to {}", urlGet); return null; } int httpResponseCode = httpDetailsGet.first; - logger.info(urlGet); - logger.info("{}", httpResponseCode); - logger.info(httpDetailsGet.second); + NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, url, "Response code: " + httpResponseCode); + NetLoggerUtil.getNetworkLogger().debug(httpDetailsGet.second); - if (httpResponseCode == 200) { - String responseGet = httpDetailsGet.second; - if (responseGet != null) { - return responseGet; - } + logger.debug(urlGet); + logger.debug("{}", httpResponseCode); + logger.debug(httpDetailsGet.second); + + if (httpResponseCode == 200 && httpDetailsGet.second != null) { + return httpDetailsGet.second; } try { Thread.sleep(1000); @@ -217,7 +219,6 @@ public final class AaiManager { return null; } - /** * Create the headers for the HTTP request. * @@ -259,12 +260,13 @@ public final class AaiManager { return null; } try { + @SuppressWarnings("unchecked") Map<String, String> pnfParams = CODER.decode(responseGet, HashMap.class); // Map to AAI node.attribute notation return pnfParams.entrySet().stream() - .collect(Collectors.toMap(e -> "pnf." + e.getKey(), Map.Entry::getValue)); + .collect(Collectors.toMap(e -> "pnf." + e.getKey(), Map.Entry::getValue)); } catch (CoderException e) { - logger.error("Failed to fetch PNF from AAI"); + logger.error("Failed to fetch PNF from AAI", e); return null; } } diff --git a/models-interactions/model-impl/aai/src/test/resources/logback-test.xml b/models-interactions/model-impl/aai/src/test/resources/logback-test.xml new file mode 100644 index 000000000..b5a897433 --- /dev/null +++ b/models-interactions/model-impl/aai/src/test/resources/logback-test.xml @@ -0,0 +1,42 @@ +<!-- + ============LICENSE_START======================================================= + Copyright (C) 2019 Nordix Foundation. + ================================================================================ + 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========================================================= +--> + +<configuration scan="true" scanPeriod="30 seconds" debug="false"> + + <contextName>ModelImplAai</contextName> + <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> + <property name="LOG_DIR" value="${java.io.tmpdir}/pf_logging/" /> + + <!-- USE FOR STD OUT ONLY --> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern> + </encoder> + </appender> + + <root level="info"> + <appender-ref ref="STDOUT" /> + </root> + + <logger name="org.onap.policy.aai" level="debug" additivity="false"> + <appender-ref ref="STDOUT" /> + </logger> + +</configuration> 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-pap/src/main/java/org/onap/policy/models/pap/concepts/PdpGroupUpdateResponse.java b/models-pap/src/main/java/org/onap/policy/models/pap/concepts/PdpGroupUpdateResponse.java new file mode 100644 index 000000000..fc38a9cea --- /dev/null +++ b/models-pap/src/main/java/org/onap/policy/models/pap/concepts/PdpGroupUpdateResponse.java @@ -0,0 +1,35 @@ +/* + * ============LICENSE_START======================================================= + * ONAP Policy Models + * ================================================================================ + * Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * 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.policy.models.pap.concepts; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * Response to PDP Group Create/Update REST API. + */ +@Getter +@Setter +@ToString(callSuper = true) +public class PdpGroupUpdateResponse extends SimpleResponse { + +} 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<>(); @@ -26,7 +26,7 @@ <parent> <groupId>org.onap.policy.parent</groupId> <artifactId>integration</artifactId> - <version>3.1.0-SNAPSHOT</version> + <version>3.1.0</version> <relativePath /> </parent> @@ -48,7 +48,7 @@ <sonar.jacoco.itReportPath>${project.basedir}/../target/code-coverage/jacoco-it.exec</sonar.jacoco.itReportPath> <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> - <policy.common.version>1.6.0-SNAPSHOT</policy.common.version> + <policy.common.version>1.6.0</policy.common.version> </properties> <modules> |