diff options
author | Einat Vinouze <einat.vinouze@intl.att.com> | 2019-11-04 11:20:29 +0200 |
---|---|---|
committer | Einat Vinouze <einat.vinouze@intl.att.com> | 2019-11-04 11:20:29 +0200 |
commit | 3ae52e57505549227bd30fbbd5cd45239858cfe7 (patch) | |
tree | e2440d710a8300f29da9020f2276d367fff8a379 | |
parent | 46d7ba49211c86e9208d6634461afc6ebac70f8d (diff) |
fix - when retrieve topology we are using threadPool and the MDC values are not updated
Issue-ID: VID-253
Signed-off-by: Einat Vinouze <einat.vinouze@intl.att.com>
Change-Id: I275d1768f17764efc1bde36baf53439922b534ab
Signed-off-by: Einat Vinouze <einat.vinouze@intl.att.com>
3 files changed, 26 insertions, 11 deletions
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodeBuilder.java b/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodeBuilder.java index d53eba8d3..9a5e7484f 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodeBuilder.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/AAITreeNodeBuilder.java @@ -42,6 +42,7 @@ import org.onap.vid.properties.VidProperties; import org.onap.vid.utils.Streams; import org.onap.vid.utils.Tree; import org.onap.vid.utils.Unchecked; +import org.slf4j.MDC; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; @@ -256,24 +257,33 @@ public class AAITreeNodeBuilder { if (!relationships.isEmpty()) { List<Callable<List<AAITreeNode>>> tasks = relationships.stream() - .map(relationship -> - (Callable<List<AAITreeNode>>) () -> - getChildNode(threadPool, nodesAccumulator, relationship.getRelatedTo(), - relationship.getRelatedLink(), pathsTree)) - .collect(Collectors.toList()); + .map(relationship -> + withCopyOfMDC(() -> getChildNode(threadPool, nodesAccumulator, relationship.getRelatedTo(), + relationship.getRelatedLink(), pathsTree))) + .collect(Collectors.toList()); try { int depth = pathsTree.getChildrenDepth(); threadPool.invokeAll(tasks, timeout * depth, TimeUnit.SECONDS) - .forEach(future -> - addChildren(node, future) - ); + .forEach(future -> + addChildren(node, future) + ); } catch (Exception e) { throw new GenericUncheckedException(e); } } } + private <V> Callable<V> withCopyOfMDC(Callable<V> callable) { + //in order to be able to write the correct data while creating the node on a new thread + // save a copy of the current thread's context map, with keys and values of type String. + final Map<String, String> copyOfParentMDC = MDC.getCopyOfContextMap(); + return () -> { + MDC.setContextMap(copyOfParentMDC); + return callable.call(); + }; + } + private List<AAITreeNode> getChildNode(ExecutorService threadPool, ConcurrentSkipListSet<AAITreeNode> nodesAccumulator, String childNodeType, String childNodeUrl, Tree<AAIServiceTree.AaiRelationship> pathsTree) { diff --git a/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java index e5a2a739b..82cc72081 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java @@ -31,6 +31,7 @@ import org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet; import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet; import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; +import org.onap.vid.more.LoggerFormatTest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.testng.ITestResult; @@ -150,13 +151,15 @@ public class ServiceTreeApiTest extends BaseApiTest { new PresetAAIGetCloudRegionFromVnf(vnfPreset1.getInstanceId()), new PresetAAIGetCloudRegionFromVnf(vnfPreset2.getInstanceId()), new PresetAAIGetCloudRegionFromVnf(vnfPreset3.getInstanceId()), - new PresetAAIGetCloudRegionFromVnf(vnfPreset4.getInstanceId()) + new PresetAAIGetCloudRegionFromVnf(vnfPreset4.getInstanceId()), + new PresetAAIGetSubscribersGet() ), CLEAR_THEN_SET); String api_url = "aai_search_group_members?subscriberId={subscriberId}&serviceType={serviceType}&serviceInvariantId={serviceInvariantId}" + "&groupType={groupType}&groupRole={groupRole}"; - final String response = restTemplate.getForObject(buildUri(api_url), String.class, "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", "LOAD-GROUP", "SERVICE-ACCESS"); + final ResponseEntity<String> responseEntity = restTemplate.getForEntity(buildUri(api_url), String.class, "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", "LOAD-GROUP", "SERVICE-ACCESS"); + String response = responseEntity.getBody(); LOGGER.info(response); @@ -176,6 +179,8 @@ public class ServiceTreeApiTest extends BaseApiTest { .replace("VNF4_INSTANCE_TYPE", vnfPreset4.getInstanceType()); assertJsonEquals(response, expected); + final String requestId = responseEntity.getHeaders().getFirst("X-ECOMP-RequestID-echo"); + LoggerFormatTest.assertHeadersAndMetricLogs(restTemplate, uri, requestId, "/network/generic-vnfs/generic-vnf/", 5); } @Test diff --git a/vid-automation/src/test/java/org/onap/vid/more/LoggerFormatTest.java b/vid-automation/src/test/java/org/onap/vid/more/LoggerFormatTest.java index 6638a0e23..a233f255e 100644 --- a/vid-automation/src/test/java/org/onap/vid/more/LoggerFormatTest.java +++ b/vid-automation/src/test/java/org/onap/vid/more/LoggerFormatTest.java @@ -167,7 +167,7 @@ public class LoggerFormatTest extends BaseApiTest { } public static void assertIdsInMetricsLog(List<String> logLines, String requestId, String invocationId) { - assertThat("request id and invocation id must be found in exactly two rows", + assertThat("request id and invocation id must be found in exactly two rows in: \n" + String.join("\n", logLines), logLines, containsInRelativeOrder( allOf( |