Bug fixes and improvements in CDS Simulator 06/113806/4
authora.sreekumar <ajith.sreekumar@bell.ca>
Mon, 12 Oct 2020 16:22:32 +0000 (17:22 +0100)
committera.sreekumar <ajith.sreekumar@bell.ca>
Tue, 13 Oct 2020 15:08:19 +0000 (16:08 +0100)
1) CDS Simulator was not able to run alone. It needed one of the
RestServer simulators to start up to continue running. Providing the cds
simulators parameters alone in the config file was resulting in
termination of the Main process. This is fixed.

2) Response from the CDS Simuator when blueprint and action names are
unknown (in real cases, when a corresponding CBA is not uploaded to CDS) is updated to mimic an actual CDS response instead of always
returning a dummy success response.

Change-Id: I79a6d158addaad31649809006d1e3c1dfdb47a1f
Issue-ID: POLICY-2828
Signed-off-by: a.sreekumar <ajith.sreekumar@bell.ca>
models-interactions/model-actors/actor.cds/src/test/resources/org/onap/policy/simulators/cds/my_artifact-subscribe.json [new file with mode: 0644]
models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/CdsSimulator.java
models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/CdsSimulatorTest.java

diff --git a/models-interactions/model-actors/actor.cds/src/test/resources/org/onap/policy/simulators/cds/my_artifact-subscribe.json b/models-interactions/model-actors/actor.cds/src/test/resources/org/onap/policy/simulators/cds/my_artifact-subscribe.json
new file mode 100644 (file)
index 0000000..307ee93
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "commonHeader": {
+    "timestamp": "2020-03-20T14:00:25.217Z",
+    "requestId": "123456-1000",
+    "subRequestId": "sub-123456-1000",
+    "flag": {
+    },
+    "originatorId": "sdnc"
+  },
+  "actionIdentifiers": {
+    "blueprintName": "my_artifact",
+    "blueprintVersion": "1.0.0",
+    "actionName": "subscribe",
+    "mode": "sync"
+  },
+  "status": {
+    "code": 200,
+    "message": "success",
+    "eventType": "EVENT_COMPONENT_EXECUTED",
+    "timestamp": "2020-07-02T14:56:25.608Z"
+  },
+  "payload": {
+    "subscription-response": {
+        "status": "success"
+    }
+  }
+}
\ No newline at end of file
index 6c505b3..222bd7f 100644 (file)
@@ -29,11 +29,14 @@ import io.grpc.netty.NettyServerBuilder;
 import io.grpc.stub.StreamObserver;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.time.Instant;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import lombok.Getter;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
 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;
@@ -42,7 +45,7 @@ import org.onap.policy.common.utils.resources.ResourceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CdsSimulator {
+public class CdsSimulator implements Runnable {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CdsSimulator.class);
 
@@ -82,7 +85,7 @@ public class CdsSimulator {
 
             @Override
             public StreamObserver<ExecutionServiceInput> process(
-                            final StreamObserver<ExecutionServiceOutput> responseObserver) {
+                final StreamObserver<ExecutionServiceOutput> responseObserver) {
 
                 return new StreamObserver<ExecutionServiceInput>() {
 
@@ -90,9 +93,7 @@ public class CdsSimulator {
                     public void onNext(final ExecutionServiceInput executionServiceInput) {
                         LOGGER.info("Received request input to CDS: {}", executionServiceInput);
                         try {
-                            String responseString = getResponseString(executionServiceInput, countOfSuccesfulEvents);
-                            Builder builder = ExecutionServiceOutput.newBuilder();
-                            JsonFormat.parser().ignoringUnknownFields().merge(responseString, builder);
+                            Builder builder = getResponse(executionServiceInput, countOfSuccesfulEvents);
                             TimeUnit.MILLISECONDS.sleep(requestedResponseDelayMs);
                             responseObserver.onNext(builder.build());
                         } catch (InvalidProtocolBufferException e) {
@@ -117,13 +118,25 @@ public class CdsSimulator {
         };
 
         server = NettyServerBuilder.forAddress(new InetSocketAddress(host, port)).addService(testCdsBlueprintServerImpl)
-                        .build();
+            .build();
     }
 
+    /**
+     * Start the server.
+     *
+     * @throws IOException IO exception.
+     */
     public void start() throws IOException {
         server.start();
+        // The grpc server uses daemon threads by default. Hence the application will exit as soon the main thread
+        // completes. So, wrap the server in a non-daemon thread and call awaitTermination to keep the thread alive
+        // until the server is terminated.
+        new Thread(this).start();
     }
 
+    /**
+     * Stop the server.
+     */
     public void stop() {
         server.shutdown();
     }
@@ -133,9 +146,11 @@ public class CdsSimulator {
      *
      * @param executionServiceInput service input
      * @param countOfSuccesfulEvents number of successive successful events
-     * @return  responseString
+     * @return builder for ExecutionServiceOutput response
+     * @throws InvalidProtocolBufferException when response string cannot be converted
      */
-    public String getResponseString(ExecutionServiceInput executionServiceInput, int countOfSuccesfulEvents) {
+    public Builder getResponse(ExecutionServiceInput executionServiceInput, int countOfSuccesfulEvents)
+        throws InvalidProtocolBufferException {
         String resourceName = "DefaultResponseEvent";
         if (!StringUtils.isBlank(executionServiceInput.getActionIdentifiers().getActionName())) {
             ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
@@ -149,12 +164,31 @@ public class CdsSimulator {
         }
         LOGGER.info("Fetching response from {}", resourceName);
         String responseString = ResourceUtils.getResourceAsString(resourceLocation + resourceName);
-        if (responseString == null) {
+        Builder builder = ExecutionServiceOutput.newBuilder();
+        if (null == responseString) {
             LOGGER.info("Expected response file {} not found in {}", resourceName, resourceLocation);
-            responseString = ResourceUtils.getResourceAsString(resourceLocation
-                + "DefaultResponseEvent.json");
+            ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
+            builder.setCommonHeader(executionServiceInput.getCommonHeader());
+            builder.setActionIdentifiers(actionIdentifiers);
+            builder.setPayload(executionServiceInput.getPayload());
+            builder.setStatus(Status.newBuilder().setCode(500).setMessage("failure")
+                .setErrorMessage("failed to get  get cba file name(" + actionIdentifiers.getBlueprintName()
+                    + "), version(" + actionIdentifiers.getBlueprintVersion() + ") from db : file check failed.")
+                .setEventType(EventType.EVENT_COMPONENT_FAILURE).setTimestamp(Instant.now().toString()));
+        } else {
+            LOGGER.debug("Returning response from CDS Simulator: {}", responseString);
+            JsonFormat.parser().ignoringUnknownFields().merge(responseString, builder);
+        }
+        return builder;
+    }
+
+    @Override
+    public void run() {
+        try {
+            server.awaitTermination();
+        } catch (InterruptedException e) {
+            LOGGER.info("gRPC server is terminated");
+            Thread.currentThread().interrupt();
         }
-        LOGGER.debug("Returning response from CDS Simulator: {}", responseString);
-        return responseString;
     }
 }
index cd4f3b5..07ec0dc 100644 (file)
@@ -128,13 +128,16 @@ public class CdsSimulatorTest {
     }
 
     @Test
-    public void testGetResponseString() throws IOException, CoderException, ParseException {
+    public void testGetResponse() throws IOException, CoderException, ParseException {
         CdsSimulator cdsSimulator = new CdsSimulator(Util.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));
+        org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.Builder esoBuilder =
+            ExecutionServiceOutput.newBuilder();
+        JsonFormat.parser().ignoringUnknownFields().merge(responseqstr, esoBuilder);
+        assertEquals(esoBuilder.toString(), cdsSimulator.getResponse(request, 0).toString());
     }
 }