From 7fb6242e113efb3653c7846ffe7ac2959612daf3 Mon Sep 17 00:00:00 2001 From: "puthuparambil.aditya" Date: Wed, 23 Sep 2020 12:39:46 +0100 Subject: Enhance gRPC Simulator: 1.Make gRPC Simulator respond to different actions by generating the response on the basis of received request. 2.Include CDS Simulator in policy-models-simulator 3.Introduce a packages module in models-sim to package the docker image of policy-models-simulator which includes all the simulators(pdp-simulator to be added in future) in models. 4.The Jenkins job changes to push this newly created Docker image may be taken in the next release. Issue-ID: POLICY-2828 Signed-off-by: puthuparambil.aditya Change-Id: Ic1663bbe8205c64a8133ea0b0c28152f21d0732a --- .../org/onap/policy/simulators/CdsSimulator.java | 62 +++++++++++++++++++--- .../simulators/cds/DefaultResponseEvent-error.json | 22 ++++++++ .../simulators/cds/DefaultResponseEvent.json | 29 ++++++++++ .../cds/pm_control-create-subscription-error.json | 22 ++++++++ .../cds/pm_control-create-subscription.json | 29 ++++++++++ .../onap/policy/simulators/CdsSimulatorTest.java | 17 +++++- .../simulators/cds/DefaultResponseEvent-error.json | 22 ++++++++ .../simulators/cds/DefaultResponseEvent.json | 29 ++++++++++ .../policy/simulators/cds/create-subscription.json | 29 ++++++++++ .../cds/pm_control-create-subscription-error.json | 22 ++++++++ .../cds/pm_control-create-subscription.json | 29 ++++++++++ 11 files changed, 304 insertions(+), 8 deletions(-) create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/create-subscription.json create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json create mode 100644 models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json (limited to 'models-interactions') diff --git a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/CdsSimulator.java b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/CdsSimulator.java index dbbaa1681..f1785c8ee 100644 --- a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/CdsSimulator.java +++ b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/CdsSimulator.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2020 Nordix Foundation. * Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2020 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. @@ -28,13 +29,16 @@ import io.grpc.netty.NettyServerBuilder; import io.grpc.stub.StreamObserver; import java.io.IOException; import java.net.InetSocketAddress; -import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import lombok.Getter; -import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers; import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceImplBase; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.Builder; +import org.onap.policy.common.utils.resources.ResourceUtils; public class CdsSimulator { @Getter @@ -42,6 +46,10 @@ public class CdsSimulator { private final Server server; + private final String resourceLocation; + + private AtomicInteger countOfEvents = new AtomicInteger(1); + /** * Constructs the object, but does not start it. * @@ -49,7 +57,21 @@ public class CdsSimulator { * @param port port of the server */ public CdsSimulator(String host, int port) { + this(host, port, "org/onap/policy/simulators/cds/", 0, 0); + } + + /** + * Constructs the object, but does not start it. + * + * @param host host name of the server + * @param port port of the server + * @param countOfSuccesfulEvents number of successive successful events + * @param requestedResponseDelayMs time for the request to be processed + */ + public CdsSimulator(String host, int port, String resourceLocation, int countOfSuccesfulEvents, + long requestedResponseDelayMs) { this.port = port; + this.resourceLocation = resourceLocation; BluePrintProcessingServiceImplBase testCdsBlueprintServerImpl = new BluePrintProcessingServiceImplBase() { @@ -62,18 +84,17 @@ public class CdsSimulator { @Override public void onNext(final ExecutionServiceInput executionServiceInput) { try { - String responseString = IOUtils.toString( - getClass().getResource("cds/CreateSubscriptionResponseEvent.json"), - StandardCharsets.UTF_8); + String responseString = getResponseString(executionServiceInput, countOfSuccesfulEvents); Builder builder = ExecutionServiceOutput.newBuilder(); JsonFormat.parser().ignoringUnknownFields().merge(responseString, builder); + TimeUnit.MILLISECONDS.sleep(requestedResponseDelayMs); responseObserver.onNext(builder.build()); - } catch (InvalidProtocolBufferException e) { throw new SimulatorRuntimeException("Cannot convert ExecutionServiceOutput output", e); - } catch (IOException e) { throw new SimulatorRuntimeException("Cannot read ExecutionServiceOutput from file", e); + } catch (InterruptedException e) { + throw new SimulatorRuntimeException("Execution Interrupted", e); } } @@ -101,4 +122,31 @@ public class CdsSimulator { public void stop() { server.shutdown(); } + + /** + * Constructs the ResponseString on the basis of request. + * + * @param executionServiceInput service input + * @param countOfSuccesfulEvents number of successive successful events + * @return responseString + */ + public String getResponseString(ExecutionServiceInput executionServiceInput, int countOfSuccesfulEvents) { + String resourceName = "DefaultResponseEvent"; + if (!StringUtils.isBlank(executionServiceInput.getActionIdentifiers().getActionName())) { + ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers(); + resourceName = actionIdentifiers.getBlueprintName() + "-" + actionIdentifiers.getActionName(); + } + if (countOfSuccesfulEvents > 0 && countOfEvents.getAndIncrement() % countOfSuccesfulEvents == 0) { + // generating the failure response + resourceName = resourceName + "-error.json"; + } else { + resourceName = resourceName + ".json"; + } + String responseString = ResourceUtils.getResourceAsString(resourceLocation + resourceName); + if (responseString == null) { + responseString = ResourceUtils.getResourceAsString(resourceLocation + + "DefaultResponseEvent.json"); + } + return responseString; + } } diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json new file mode 100644 index 000000000..a66b1114f --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json @@ -0,0 +1,22 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 500, + "message": "failure", + "eventType": "EVENT_COMPONENT_FAILURE", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json new file mode 100644 index 000000000..adb51adcb --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json @@ -0,0 +1,29 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 200, + "message": "success", + "eventType": "EVENT_COMPONENT_EXECUTED", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + }, + "payload": { + "create-subscription-response": { + "odl-response": { + "status": "success" + } + } + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json new file mode 100644 index 000000000..a66b1114f --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json @@ -0,0 +1,22 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 500, + "message": "failure", + "eventType": "EVENT_COMPONENT_FAILURE", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json new file mode 100644 index 000000000..adb51adcb --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json @@ -0,0 +1,29 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 200, + "message": "success", + "eventType": "EVENT_COMPONENT_EXECUTED", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + }, + "payload": { + "create-subscription-response": { + "odl-response": { + "status": "success" + } + } + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/CdsSimulatorTest.java b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/CdsSimulatorTest.java index 5f82b7e94..fea03e3e4 100644 --- a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/CdsSimulatorTest.java +++ b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/CdsSimulatorTest.java @@ -3,6 +3,7 @@ * ONAP * ================================================================================ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2020 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. @@ -28,11 +29,13 @@ import io.grpc.internal.DnsNameResolverProvider; import io.grpc.internal.PickFirstLoadBalancerProvider; import io.grpc.netty.NettyChannelBuilder; import io.grpc.stub.StreamObserver; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.apache.commons.io.IOUtils; +import org.json.simple.parser.ParseException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -40,7 +43,9 @@ import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessin import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceStub; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput; +import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.common.utils.resources.ResourceUtils; public class CdsSimulatorTest { private static final StandardCoder coder = new StandardCoder(); @@ -61,7 +66,6 @@ public class CdsSimulatorTest { public void test() throws Exception { String reqstr = IOUtils.toString(getClass().getResource("cds/cds.request.json"), StandardCharsets.UTF_8); ExecutionServiceInput request = coder.decode(reqstr, ExecutionServiceInput.class); - ManagedChannel channel = NettyChannelBuilder.forAddress("localhost", sim.getPort()) .nameResolverFactory(new DnsNameResolverProvider()) .loadBalancerFactory(new PickFirstLoadBalancerProvider()).usePlaintext().build(); @@ -111,4 +115,15 @@ public class CdsSimulatorTest { channel.shutdown(); } } + + @Test + public void testGetResponseString() throws IOException, CoderException, ParseException { + CdsSimulator cdsSimulator = new CdsSimulator("localhost", sim.getPort()); + String reqstr = ResourceUtils.getResourceAsString( + "org/onap/policy/simulators/cds/cds.request.json"); + String responseqstr = ResourceUtils.getResourceAsString( + "org/onap/policy/simulators/cds/pm_control-create-subscription.json"); + ExecutionServiceInput request = coder.decode(reqstr, ExecutionServiceInput.class); + assertEquals(responseqstr, cdsSimulator.getResponseString(request, 0)); + } } diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json new file mode 100644 index 000000000..a66b1114f --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent-error.json @@ -0,0 +1,22 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 500, + "message": "failure", + "eventType": "EVENT_COMPONENT_FAILURE", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json new file mode 100644 index 000000000..adb51adcb --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/DefaultResponseEvent.json @@ -0,0 +1,29 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 200, + "message": "success", + "eventType": "EVENT_COMPONENT_EXECUTED", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + }, + "payload": { + "create-subscription-response": { + "odl-response": { + "status": "success" + } + } + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/create-subscription.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/create-subscription.json new file mode 100644 index 000000000..adb51adcb --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/create-subscription.json @@ -0,0 +1,29 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 200, + "message": "success", + "eventType": "EVENT_COMPONENT_EXECUTED", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + }, + "payload": { + "create-subscription-response": { + "odl-response": { + "status": "success" + } + } + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json new file mode 100644 index 000000000..a66b1114f --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription-error.json @@ -0,0 +1,22 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 500, + "message": "failure", + "eventType": "EVENT_COMPONENT_FAILURE", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + } +} \ No newline at end of file diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json new file mode 100644 index 000000000..adb51adcb --- /dev/null +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/cds/pm_control-create-subscription.json @@ -0,0 +1,29 @@ +{ + "commonHeader": { + "timestamp": "2020-03-20T14:00:25.217Z", + "requestId": "123456-1000", + "subRequestId": "sub-123456-1000", + "flag": { + }, + "originatorId": "sdnc" + }, + "actionIdentifiers": { + "blueprintName": "pm_control", + "blueprintVersion": "1.0.0", + "actionName": "create-subscription", + "mode": "sync" + }, + "status": { + "code": 200, + "message": "success", + "eventType": "EVENT_COMPONENT_EXECUTED", + "timestamp": "Fri Mar 20 14:00:26 GMT 2020" + }, + "payload": { + "create-subscription-response": { + "odl-response": { + "status": "success" + } + } + } +} \ No newline at end of file -- cgit 1.2.3-korg