From ef5768de060c6cbf10b06569e00617b052dc7e61 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Mon, 23 Mar 2020 11:36:09 -0400 Subject: Update new SDNR actor with v2.0 structures SDNR v2.0 introduced an extra "input" and "output" layer within the body of the messages. Added POJOs to match that, and updated the actor to use the new POJOs so that no extra steps are needed during serialization or deserialization. Also modified the SDNR and APPC-LCM simulators to discard request messages when looking for the response, if the sink and source topics happen to be the same. Added the SDNR simulator. Added more coverage to the SDNR actor. Fixed a sonar issue in the SDNR junit code: - use a constant instead of a literal (i.e., for "ModifyConfig") Issue-ID: POLICY-2434 Signed-off-by: Jim Hahn Change-Id: I70914a299dd5e9ee8eaccb5d42a2596cab814091 --- models-interactions/model-simulators/pom.xml | 15 ++-- .../onap/policy/simulators/AppcLcmTopicServer.java | 9 +++ .../onap/policy/simulators/SdnrTopicServer.java | 51 +++++++++++++ .../policy/simulators/sdnr/vpci.sdnr.success.json | 23 ++++++ .../policy/simulators/AppcLcmTopicServerTest.java | 16 ++++ .../policy/simulators/SdnrTopicServerTest.java | 85 ++++++++++++++++++++++ .../policy/simulators/sdnr/vpci.sdnr.request.json | 18 +++++ 7 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/SdnrTopicServer.java create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.success.json create mode 100644 models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/SdnrTopicServerTest.java create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.request.json (limited to 'models-interactions/model-simulators') diff --git a/models-interactions/model-simulators/pom.xml b/models-interactions/model-simulators/pom.xml index d74aa05ad..d91d9ccf5 100644 --- a/models-interactions/model-simulators/pom.xml +++ b/models-interactions/model-simulators/pom.xml @@ -59,6 +59,16 @@ appclcm ${project.version} + + org.onap.policy.models.policy-models-interactions.model-impl + sdnc + ${project.version} + + + org.onap.policy.models.policy-models-interactions.model-impl + sdnr + ${project.version} + org.onap.policy.models.policy-models-interactions.model-impl so @@ -75,11 +85,6 @@ gson provided - - org.onap.policy.models.policy-models-interactions.model-impl - sdnc - ${project.version} - org.onap.policy.models policy-models-decisions diff --git a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/AppcLcmTopicServer.java b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/AppcLcmTopicServer.java index df4cbb31e..6b2eabe8d 100644 --- a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/AppcLcmTopicServer.java +++ b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/AppcLcmTopicServer.java @@ -36,6 +36,15 @@ public class AppcLcmTopicServer extends TopicServer { @Override protected String process(AppcLcmDmaapWrapper request) { + /* + * In case the request and response are on the same topic, this may be invoked + * with a request or with a response object. If the "output" is not null, then we + * know it's a response. + */ + if (request.getBody().getOutput() != null) { + return null; + } + String response = ResourceUtils.getResourceAsString("org/onap/policy/simulators/appclcm/appc.lcm.success.json"); return response.replace("${replaceMe}", request.getBody().getInput().getCommonHeader().getSubRequestId()); } diff --git a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/SdnrTopicServer.java b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/SdnrTopicServer.java new file mode 100644 index 000000000..043a2c523 --- /dev/null +++ b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/SdnrTopicServer.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.simulators; + +import org.onap.policy.common.endpoints.event.comm.TopicSink; +import org.onap.policy.common.endpoints.event.comm.TopicSource; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.common.utils.resources.ResourceUtils; +import org.onap.policy.sdnr.PciMessage; + +/** + * SDNR topic server. + */ +public class SdnrTopicServer extends TopicServer { + public SdnrTopicServer(TopicSink sink, TopicSource source) { + super(sink, source, new StandardCoder(), PciMessage.class); + } + + @Override + protected String process(PciMessage request) { + /* + * In case the request and response are on the same topic, this may be invoked + * with a request or with a response object. If the "output" is null, then we know + * it's a response. + */ + if (request.getBody().getOutput() != null) { + return null; + } + + String response = ResourceUtils.getResourceAsString("org/onap/policy/simulators/sdnr/vpci.sdnr.success.json"); + return response.replace("${replaceMe}", request.getBody().getInput().getCommonHeader().getSubRequestId()); + } +} diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.success.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.success.json new file mode 100644 index 000000000..b9137d2c4 --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.success.json @@ -0,0 +1,23 @@ +{ + "body": { + "output": { + "CommonHeader": { + "TimeStamp": "2018-09-10T07:10:05.614Z", + "APIver": "1.0", + "RequestID": "9d2d790e-a5f0-11e8-98d0-529269fb1459", + "SubRequestID": "${replaceMe}", + "RequestTrack": [], + "Flags": [] + }, + "Status": { + "Code": 200, + "Value": "SUCCESS" + }, + "Payload": "{ \"Configurations\":[ { \"Status\": { \"Code\": 200, \"Value\": \"SUCCESS\" }, \"data\":{\"FAPService\":{\"alias\":\"Chn0330\",\"X0005b9Lte\":{\"phyCellIdInUse\":6,\"pnfName\":\"ncserver23\"},\"CellConfig\":{\"LTE\":{\"RAN\":{\"Common\":{\"CellIdentity\":\"Chn0330\"}}}}}} } ] }" + } + }, + "version": "1.0", + "rpc-name": "ModifyConfig", + "correlation-id": "9d2d790e-a5f0-11e8-98d0-529269fb1459-1", + "type": "response" +} diff --git a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/AppcLcmTopicServerTest.java b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/AppcLcmTopicServerTest.java index bc803154f..f3f546a41 100644 --- a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/AppcLcmTopicServerTest.java +++ b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/AppcLcmTopicServerTest.java @@ -22,6 +22,8 @@ package org.onap.policy.simulators; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import org.junit.Before; @@ -66,4 +68,18 @@ public class AppcLcmTopicServerTest { assertThat(respCaptor.getValue()).contains("111be3d2").doesNotContain("replaceMe"); } + + /** + * Tests process() when the message is a response. + */ + @Test + public void testProcessNoResponse() { + // NOTE: this json file is a RESPONSE, not a request + String request = ResourceUtils.getResourceAsString("org/onap/policy/simulators/appclcm/appc.lcm.success.json"); + assertNotNull(request); + + server.onTopicEvent(CommInfrastructure.NOOP, MY_TOPIC, request); + + verify(sink, never()).send(any()); + } } diff --git a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/SdnrTopicServerTest.java b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/SdnrTopicServerTest.java new file mode 100644 index 000000000..d8f6d1150 --- /dev/null +++ b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/SdnrTopicServerTest.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.simulators; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; +import org.onap.policy.common.endpoints.event.comm.TopicSink; +import org.onap.policy.common.endpoints.event.comm.TopicSource; +import org.onap.policy.common.utils.resources.ResourceUtils; + +public class SdnrTopicServerTest { + private static final String MY_TOPIC = "my-topic"; + + @Mock + private TopicSink sink; + @Mock + private TopicSource source; + + private SdnrTopicServer server; + + /** + * Sets up. + */ + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + server = new SdnrTopicServer(sink, source); + } + + @Test + public void testProcess() { + String request = ResourceUtils.getResourceAsString("org/onap/policy/simulators/sdnr/vpci.sdnr.request.json"); + assertNotNull(request); + + server.onTopicEvent(CommInfrastructure.NOOP, MY_TOPIC, request); + + ArgumentCaptor respCaptor = ArgumentCaptor.forClass(String.class); + verify(sink).send(respCaptor.capture()); + + assertThat(respCaptor.getValue()).contains("111be3d2").doesNotContain("replaceMe"); + } + + /** + * Tests process() when the message is a response. + */ + @Test + public void testProcessNoResponse() { + // NOTE: this json file is a RESPONSE, not a request + String request = ResourceUtils.getResourceAsString("org/onap/policy/simulators/sdnr/vpci.sdnr.success.json"); + assertNotNull(request); + + server.onTopicEvent(CommInfrastructure.NOOP, MY_TOPIC, request); + + verify(sink, never()).send(any()); + } +} diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.request.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.request.json new file mode 100644 index 000000000..fa78c6dcc --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/sdnr/vpci.sdnr.request.json @@ -0,0 +1,18 @@ +{ + "body": { + "input": { + "CommonHeader": { + "TimeStamp": "2018-09-10T07:10:05.614Z", + "APIver": "1.0", + "RequestID": "664be3d2-6c12-4f4b-a3e7-c349acced200", + "SubRequestID": "111be3d2-6c12-4f4b-a3e7-c349acced200", + "RequestTrack": [], + "Flags": [] + } + } + }, + "version": "1.0", + "rpc-name": "modifyconfig", + "correlation-id": "9d2d790e-a5f0-11e8-98d0-529269fb1459-1", + "type": "response" +} -- cgit 1.2.3-korg