From 369a94a9fd626b35d52c2e7ee5f19e6ff6e1b9d8 Mon Sep 17 00:00:00 2001 From: "a.sreekumar" Date: Thu, 18 Mar 2021 12:39:46 +0000 Subject: Fixing parallel event execution problem in APEX-PDP REST layer Parallel event execution in APEX was resulting in incorrect dynamic REST url. This issue is fixed in this review. Change-Id: Id8a28c001a7fd7915df1f5909109bb369667ab40 Issue-ID: POLICY-3019 Signed-off-by: a.sreekumar --- .../restrequestor/ApexRestRequestorConsumer.java | 47 ++++++++---------- .../service/engine/main/ApexEventUnmarshaller.java | 8 +-- .../restclient/TestExecutionPropertyRest.java | 40 --------------- .../DummyApexEventConsumer.java | 4 +- .../executionproperties/logic/TaskFetchHttpCode.js | 7 +-- .../RESTHttpCodeFilterSetToTagUrlOK.json | 58 ---------------------- 6 files changed, 29 insertions(+), 135 deletions(-) delete mode 100644 testsuites/integration/integration-uservice-test/src/test/resources/testdata/executionproperties/RESTHttpCodeFilterSetToTagUrlOK.json diff --git a/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restrequestor/src/main/java/org/onap/policy/apex/plugins/event/carrier/restrequestor/ApexRestRequestorConsumer.java b/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restrequestor/src/main/java/org/onap/policy/apex/plugins/event/carrier/restrequestor/ApexRestRequestorConsumer.java index 54dba7a7c..d7ee0a5ee 100644 --- a/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restrequestor/src/main/java/org/onap/policy/apex/plugins/event/carrier/restrequestor/ApexRestRequestorConsumer.java +++ b/plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restrequestor/src/main/java/org/onap/policy/apex/plugins/event/carrier/restrequestor/ApexRestRequestorConsumer.java @@ -99,8 +99,6 @@ public class ApexRestRequestorConsumer extends ApexPluginsEventConsumer { // The number of the next request runner thread private static long nextRequestRunnerThreadNo = 0; - private String untaggedUrl = null; - // The pattern for filtering status code private Pattern httpCodeFilterPattern = null; @@ -207,22 +205,6 @@ public class ApexRestRequestorConsumer extends ApexPluginsEventConsumer { continue; } - Properties inputExecutionProperties = restRequest.getExecutionProperties(); - untaggedUrl = restConsumerProperties.getUrl(); - if (inputExecutionProperties != null) { - Set names = restConsumerProperties.getKeysFromUrl(); - Set inputProperty = inputExecutionProperties.stringPropertyNames(); - - names.stream().map(Optional::of) - .forEach(op -> op.filter(inputProperty::contains) - .orElseThrow(() -> new ApexEventRuntimeException( - "key\"" + op.get() + "\"specified on url \"" + restConsumerProperties.getUrl() - + "\"not found in execution properties passed by the current policy"))); - - untaggedUrl = names.stream().reduce(untaggedUrl, - (acc, str) -> acc.replace("{" + str + "}", (String) inputExecutionProperties.get(str))); - } - // Set the time stamp of the REST request restRequest.setTimestamp(System.currentTimeMillis()); @@ -311,18 +293,31 @@ public class ApexRestRequestorConsumer extends ApexPluginsEventConsumer { public void run() { // Get the thread for the request restRequestThread = Thread.currentThread(); - + Properties inputExecutionProperties = request.getExecutionProperties(); + String url = restConsumerProperties.getUrl(); + Set names = restConsumerProperties.getKeysFromUrl(); + if (!names.isEmpty() && inputExecutionProperties != null) { + Set inputProperty = inputExecutionProperties.stringPropertyNames(); + + names.stream().map(Optional::of) + .forEach(op -> op.filter(inputProperty::contains) + .orElseThrow(() -> new ApexEventRuntimeException( + "key\"" + op.get() + "\"specified on url \"" + restConsumerProperties.getUrl() + + "\"not found in execution properties passed by the current policy"))); + + url = names.stream().reduce(url, + (acc, str) -> acc.replace("{" + str + "}", (String) inputExecutionProperties.get(str))); + } try { if (restConsumerProperties.getHttpMethod().equals(HttpMethod.PUT) || restConsumerProperties.getHttpMethod().equals(HttpMethod.POST)) { - NetLoggerUtil.log(EventType.OUT, CommInfrastructure.REST, untaggedUrl, - request.getEvent().toString()); + NetLoggerUtil.log(EventType.OUT, CommInfrastructure.REST, url, request.getEvent().toString()); } // Execute the REST request - final Response response = sendEventAsRestRequest(untaggedUrl); + final Response response = sendEventAsRestRequest(url); // Get the event we received final String eventJsonString = response.readEntity(String.class); - NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, untaggedUrl, eventJsonString); + NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, url, eventJsonString); // Match the return code Matcher isPass = httpCodeFilterPattern.matcher(String.valueOf(response.getStatus())); @@ -336,7 +331,7 @@ public class ApexRestRequestorConsumer extends ApexPluginsEventConsumer { // Check there is content if (StringUtils.isBlank(eventJsonString)) { final String errorMessage = - "received an empty response to \"" + request + "\" from URL \"" + untaggedUrl + "\""; + "received an empty response to \"" + request + "\" from URL \"" + url + "\""; throw new ApexEventRuntimeException(errorMessage); } @@ -371,8 +366,8 @@ public class ApexRestRequestorConsumer extends ApexPluginsEventConsumer { * * @return the response to the REST request */ - public Response sendEventAsRestRequest(String untaggedUrl) { - Builder headers = client.target(untaggedUrl).request(APPLICATION_JSON) + public Response sendEventAsRestRequest(String url) { + Builder headers = client.target(url).request(APPLICATION_JSON) .headers(restConsumerProperties.getHttpHeadersAsMultivaluedMap()); switch (restConsumerProperties.getHttpMethod()) { case GET: diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexEventUnmarshaller.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexEventUnmarshaller.java index fdc404c67..d31940aa0 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexEventUnmarshaller.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexEventUnmarshaller.java @@ -226,13 +226,13 @@ public class ApexEventUnmarshaller implements ApexEventReceiver, Runnable { // Ignore this event continue; } - if (!generateExecutionId) { apexEvent.setExecutionId(executionId); + apexEvent.setExecutionProperties(executionProperties); + } else { + // Clean up executionProperties in case if it is not a response event to a request made from APEX + apexEvent.setExecutionProperties(new Properties(executionProperties)); } - - apexEvent.setExecutionProperties(executionProperties); - // Cache synchronized events that are sent if (consumerParameters.isPeeredMode(EventHandlerPeeredMode.SYNCHRONOUS)) { final SynchronousEventCache synchronousEventCache = diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestExecutionPropertyRest.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestExecutionPropertyRest.java index 0cf7dc652..b3f27c52e 100644 --- a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestExecutionPropertyRest.java +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/adapt/restclient/TestExecutionPropertyRest.java @@ -238,46 +238,6 @@ public class TestExecutionPropertyRest { LOGGER.info("testBadCodeFilter-OUTSTRING=\n" + outContent.toString() + "\nEnd-TagUrl"); } - /** - * Test Http code filter set and tag Url are transformed correctly. - */ - @Test - public void testReplaceUrlTag() throws Exception { - final Client client = ClientBuilder.newClient(); - // @formatter:off - final String[] cliArgs = new String[] { - "-c", - "src/test/resources/policies/executionproperties/policy/ExecutionPropertiesRestTestPolicyModel.apex", - "-o", - "target/ExecutionPropertiesRestTestPolicyModel.json", - "-ac", - "src/test/resources/testdata/executionproperties/RESTHttpCodeFilterSetToTagUrlOK.json", - "-t", - "src/test/resources/tosca/ToscaTemplate.json", - "-ot", - "target/classes/APEXPolicy.json" - }; - // @formatter:on - - new ApexCliToscaEditorMain(cliArgs); - - // @formatter:off - final String[] args = { - "-p", - "target/classes/APEXPolicy.json" - }; - // @formatter:on - apexMain = new ApexMain(args); - - await().atMost(5, TimeUnit.SECONDS).until(() -> { - Response response = client.target("http://localhost:32801/TestExecutionRest/apex/event/GetProperUrl") - .request("application/json").get(); - return response.readEntity(String.class).contains("\"PostProperUrl\": 1"); - }); - assertTrue(apexMain.isAlive()); - LOGGER.info("testReplaceUrlTag-OUTSTRING=\n" + outContent.toString() + "\nEnd-TagUrl"); - } - /** * Test Http code filter set and multi-tag Url are transformed correctly. */ diff --git a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java index c4b93b002..1dc6f13a2 100644 --- a/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java +++ b/testsuites/integration/integration-uservice-test/src/test/java/org/onap/policy/apex/testsuites/integration/uservice/executionproperties/DummyApexEventConsumer.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. - * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. 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. @@ -125,7 +125,7 @@ public class DummyApexEventConsumer implements ApexEventConsumer { RunTestEvent event = new RunTestEvent(); event.setTestToRun(dummyConsumerProperties.getTestToRun()); try { - eventReceiver.receiveEvent(executionProperties, event.toJson()); + eventReceiver.receiveEvent(1, executionProperties, event.toJson()); } catch (Exception e) { String message = "event processing for executor properties testing failed: " + e.getMessage(); LOGGER.warn(message, e); diff --git a/testsuites/integration/integration-uservice-test/src/test/resources/policies/executionproperties/logic/TaskFetchHttpCode.js b/testsuites/integration/integration-uservice-test/src/test/resources/policies/executionproperties/logic/TaskFetchHttpCode.js index b60e2acee..f4d979d1f 100644 --- a/testsuites/integration/integration-uservice-test/src/test/resources/policies/executionproperties/logic/TaskFetchHttpCode.js +++ b/testsuites/integration/integration-uservice-test/src/test/resources/policies/executionproperties/logic/TaskFetchHttpCode.js @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2019-2020 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. 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. @@ -22,11 +23,7 @@ executor.logger.debug(executor.getSubject().getId()); executor.logger.debug("executionProperties: " + executor.getExecutionProperties()); -if (executor.getExecutionProperties().get("HTTP_CODE_STATUS") == "500") - executor.outFields.put("testToRun", "CodeFilterSet"); -else - executor.outFields.put("testToRun", "CodeFilterDefault"); - +executor.outFields.put("testToRun", "CodeFilterSet"); executor.logger.debug("testToRun: " + executor.outFields.get("testToRun")); true; diff --git a/testsuites/integration/integration-uservice-test/src/test/resources/testdata/executionproperties/RESTHttpCodeFilterSetToTagUrlOK.json b/testsuites/integration/integration-uservice-test/src/test/resources/testdata/executionproperties/RESTHttpCodeFilterSetToTagUrlOK.json deleted file mode 100644 index 22ab9e3bb..000000000 --- a/testsuites/integration/integration-uservice-test/src/test/resources/testdata/executionproperties/RESTHttpCodeFilterSetToTagUrlOK.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "engineServiceParameters": { - "name": "MyApexEngine", - "version": "0.0.1", - "id": 45, - "instanceCount": 4, - "deploymentPort": 12561, - "engineParameters": { - "executorParameters": { - "JAVASCRIPT": { - "parameterClassName": "org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters" - } - } - } - }, - "eventInputParameters": { - "GetCodeConsumer": { - "carrierTechnologyParameters": { - "carrierTechnology": "RESTCLIENT", - "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", - "parameters": { - "url": "http://localhost:32801/TestExecutionRest/apex/event/FetchHttpCode", - "httpMethod": "GET", - "httpHeaders" : [ - ], - "httpCodeFilter" : "[1-5][0][0-5]" - } - }, - "eventProtocolParameters": { - "eventProtocol": "JSON", - "parameters": { - "testToRun": "FetchHttpCode" - } - }, - "eventName": "Event0200" - } - }, - "eventOutputParameters": { - "FirstProducer": { - "carrierTechnologyParameters": { - "carrierTechnology": "RESTCLIENT", - "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters", - "parameters": { - "url": "http://localhost:32801/TestExecutionRest/apex/event/{tagId}", - "httpMethod": "PUT", - "httpHeaders" : [ - ["Content-Type", "application/json"], - ["Date", "Tue, 24 Jul 2019 14:57:12 GMT"] - ] - } - }, - "eventProtocolParameters": { - "eventProtocol": "JSON" - }, - "eventName": "Event0201" - } - } -} -- cgit 1.2.3-korg