Implement GRPC response payload 60/95260/2
authorBrinda Santh <brindasanth@in.ibm.com>
Mon, 9 Sep 2019 18:30:16 +0000 (14:30 -0400)
committerBrinda Santh <brindasanth@in.ibm.com>
Thu, 12 Sep 2019 01:00:56 +0000 (21:00 -0400)
Change-Id: I137cb9e2fa15c12f45a412d84e867f0613f15bf8
Issue-ID: CCSDK-1682
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BluePrintManagementGRPCHandler.kt
ms/blueprintsprocessor/modules/inbounds/designer-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BluePrintManagementGRPCHandlerTest.kt
ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/service/ListenerServiceImpl.java
ms/sdclistener/application/src/test/java/org/onap/ccsdk/cds/sdclistener/handler/BluePrintProcessorHandlerTest.java

index c48f1dd..08250ed 100644 (file)
@@ -19,7 +19,7 @@
 package org.onap.ccsdk.cds.blueprintsprocessor.designer.api
 
 import com.google.protobuf.ByteString
-import io.grpc.StatusException
+import com.google.protobuf.util.JsonFormat
 import io.grpc.stub.StreamObserver
 import kotlinx.coroutines.runBlocking
 import org.onap.ccsdk.cds.blueprintsprocessor.designer.api.handler.BluePrintModelHandler
@@ -27,6 +27,7 @@ import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader
 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonString
 import org.onap.ccsdk.cds.controllerblueprints.core.emptyTONull
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.currentTimestamp
 import org.onap.ccsdk.cds.controllerblueprints.management.api.*
@@ -34,6 +35,7 @@ import org.slf4j.LoggerFactory
 import org.springframework.security.access.prepost.PreAuthorize
 import org.springframework.stereotype.Service
 
+//TODO("Convert to coroutines handler")
 @Service
 open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: BluePrintModelHandler)
     : BluePrintManagementServiceGrpc.BluePrintManagementServiceImplBase() {
@@ -45,6 +47,7 @@ open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: Blu
     StreamObserver<BluePrintManagementOutput>) {
 
         runBlocking {
+            //TODO("catch if request id is missing")
             log.info("request(${request.commonHeader.requestId})")
             try {
                 /** Get the file byte array */
@@ -56,15 +59,16 @@ open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: Blu
                 when (uploadAction) {
                     UploadAction.DRAFT.toString() -> {
                         val blueprintModel = bluePrintModelHandler.upload(byteArray, false)
-                        responseObserver.onNext(successStatus(request.commonHeader))
+                        responseObserver.onNext(successStatus(request.commonHeader, blueprintModel.asJsonString()))
                     }
                     UploadAction.PUBLISH.toString() -> {
                         val blueprintModel = bluePrintModelHandler.upload(byteArray, true)
-                        responseObserver.onNext(successStatus(request.commonHeader))
+                        responseObserver.onNext(successStatus(request.commonHeader, blueprintModel.asJsonString()))
                     }
                     UploadAction.VALIDATE.toString() -> {
                         //TODO("Not Implemented")
-                        responseObserver.onError(failStatus("Not Implemented",
+                        responseObserver.onNext(failStatus(request.commonHeader,
+                                "Upload action($uploadAction) not implemented",
                                 BluePrintProcessorException("Not Implemented")))
                     }
                     UploadAction.ENRICH.toString() -> {
@@ -72,13 +76,16 @@ open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: Blu
                         responseObserver.onNext(enrichmentStatus(request.commonHeader, enrichedByteArray))
                     }
                     else -> {
-                        responseObserver.onError(failStatus("Upload action($uploadAction) not implemented",
-                                BluePrintProcessorException("Upload action($uploadAction) not implemented")))
+                        responseObserver.onNext(failStatus(request.commonHeader,
+                                "Upload action($uploadAction) not implemented",
+                                BluePrintProcessorException("Not implemented")))
                     }
                 }
-                responseObserver.onCompleted()
             } catch (e: Exception) {
-                responseObserver.onError(failStatus("request(${request.commonHeader.requestId}): Failed to upload CBA", e))
+                responseObserver.onNext(failStatus(request.commonHeader,
+                        "request(${request.commonHeader.requestId}): Failed to upload CBA", e))
+            } finally {
+                responseObserver.onCompleted()
             }
         }
     }
@@ -96,9 +103,11 @@ open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: Blu
             try {
                 bluePrintModelHandler.deleteBlueprintModel(blueprintName, blueprintVersion)
                 responseObserver.onNext(successStatus(request.commonHeader))
-                responseObserver.onCompleted()
             } catch (e: Exception) {
-                responseObserver.onError(failStatus("request(${request.commonHeader.requestId}): Failed to delete $blueprint", e))
+                responseObserver.onNext(failStatus(request.commonHeader,
+                        "request(${request.commonHeader.requestId}): Failed to delete $blueprint", e))
+            } finally {
+                responseObserver.onCompleted()
             }
         }
     }
@@ -114,21 +123,37 @@ open class BluePrintManagementGRPCHandler(private val bluePrintModelHandler: Blu
                             .build())
                     .build()
 
-    private fun successStatus(header: CommonHeader): BluePrintManagementOutput =
-            BluePrintManagementOutput.newBuilder()
-                    .setCommonHeader(header)
-                    .setStatus(Status.newBuilder()
-                            .setTimestamp(currentTimestamp())
-                            .setMessage(BluePrintConstants.STATUS_SUCCESS)
-                            .setCode(200)
-                            .build())
-                    .build()
+    private fun successStatus(header: CommonHeader, propertyContent: String? = null): BluePrintManagementOutput {
+        // Populate Response Payload
+        val propertiesBuilder = BluePrintManagementOutput.newBuilder().propertiesBuilder
+        propertyContent?.let {
+            JsonFormat.parser().merge(propertyContent, propertiesBuilder)
+        }
+        return BluePrintManagementOutput.newBuilder()
+                .setCommonHeader(header)
+                .setProperties(propertiesBuilder.build())
+                .setStatus(Status.newBuilder()
+                        .setTimestamp(currentTimestamp())
+                        .setMessage(BluePrintConstants.STATUS_SUCCESS)
+                        .setCode(200)
+                        .build())
+                .build()
+    }
 
-    private fun failStatus(message: String, e: Exception): StatusException {
+    private fun failStatus(header: CommonHeader, message: String, e: Exception): BluePrintManagementOutput {
         log.error(message, e)
-        return io.grpc.Status.INTERNAL
-                .withDescription(message)
-                .withCause(e)
-                .asException()
+        return BluePrintManagementOutput.newBuilder()
+                .setCommonHeader(header)
+                .setStatus(Status.newBuilder()
+                        .setTimestamp(currentTimestamp())
+                        .setMessage(BluePrintConstants.STATUS_FAILURE)
+                        .setErrorMessage(message)
+                        .setCode(500)
+                        .build())
+                .build()
+//        return io.grpc.Status.INTERNAL
+//                .withDescription(message)
+//                .withCause(e)
+//                .asException()
     }
 }
index 6e4e91a..9f1bd9c 100644 (file)
@@ -20,9 +20,13 @@ package org.onap.ccsdk.cds.blueprintsprocessor.designer.api
 
 import com.google.protobuf.ByteString
 import io.grpc.testing.GrpcServerRule
+import kotlinx.coroutines.runBlocking
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.onap.ccsdk.cds.blueprintsprocessor.grpc.GRPCLibConstants
+import org.onap.ccsdk.cds.blueprintsprocessor.grpc.TokenAuthGrpcClientProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.grpc.service.TokenAuthGrpcClientService
 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers
 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
@@ -35,10 +39,7 @@ import org.springframework.context.annotation.ComponentScan
 import org.springframework.test.annotation.DirtiesContext
 import org.springframework.test.context.TestPropertySource
 import org.springframework.test.context.junit4.SpringRunner
-import kotlin.test.AfterTest
-import kotlin.test.BeforeTest
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
+import kotlin.test.*
 
 @RunWith(SpringRunner::class)
 @EnableAutoConfiguration
@@ -96,6 +97,28 @@ class BluePrintManagementGRPCHandlerTest {
         assertEquals(200, output.status.code)
     }
 
+    /** This is Integration test sample, Do not enable this test case in server build, this is for local desktop testing*/
+    private fun integrationTestGrpcManagement() {
+        runBlocking {
+            val tokenAuthGrpcClientProperties = TokenAuthGrpcClientProperties().apply {
+                host = "127.0.0.1"
+                port = 9111
+                type = GRPCLibConstants.TYPE_TOKEN_AUTH
+                token = "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw=="
+            }
+            val basicAuthGrpcClientService = TokenAuthGrpcClientService(tokenAuthGrpcClientProperties)
+            val channel = basicAuthGrpcClientService.channel()
+
+            val blockingStub = BluePrintManagementServiceGrpc.newBlockingStub(channel)
+
+            val bluePrintUploadInput = createUploadInputRequest("12345", UploadAction.DRAFT.toString())
+
+            val bluePrintManagementOutput = blockingStub.uploadBlueprint(bluePrintUploadInput)
+            assertNotNull(bluePrintManagementOutput, "failed to get response")
+        }
+    }
+
+
     private fun createUploadInputRequest(id: String, action: String): BluePrintUploadInput {
         val file = normalizedFile("./src/test/resources/test-cba.zip")
         assertTrue(file.exists(), "couldnt get file ${file.absolutePath}")
index 77f3ea5..1937af7 100644 (file)
  */
 package org.onap.ccsdk.cds.sdclistener.service;
 
-import static java.lang.String.format;
-import static org.onap.ccsdk.cds.sdclistener.status.SdcListenerStatus.NotificationType.SDC_LISTENER_COMPONENT;
-import static org.onap.sdc.utils.DistributionStatusEnum.COMPONENT_DONE_ERROR;
-import static org.onap.sdc.utils.DistributionStatusEnum.COMPONENT_DONE_OK;
 import com.google.protobuf.ByteString;
 import io.grpc.ManagedChannel;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 import org.apache.commons.io.FileUtils;
 import org.apache.tomcat.util.http.fileupload.IOUtils;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk;
+import org.onap.ccsdk.cds.controllerblueprints.management.api.UploadAction;
 import org.onap.ccsdk.cds.sdclistener.client.SdcListenerAuthClientInterceptor;
 import org.onap.ccsdk.cds.sdclistener.dto.SdcListenerDto;
 import org.onap.ccsdk.cds.sdclistener.handler.BluePrintProcesssorHandler;
@@ -52,6 +38,22 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.UUID;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import static java.lang.String.format;
+import static org.onap.ccsdk.cds.sdclistener.status.SdcListenerStatus.NotificationType.SDC_LISTENER_COMPONENT;
+import static org.onap.sdc.utils.DistributionStatusEnum.COMPONENT_DONE_ERROR;
+import static org.onap.sdc.utils.DistributionStatusEnum.COMPONENT_DONE_OK;
+
 @Component
 @ConfigurationProperties("listenerservice")
 public class ListenerServiceImpl implements ListenerService {
@@ -216,6 +218,13 @@ public class ListenerServiceImpl implements ListenerService {
         FileChunk fileChunk = FileChunk.newBuilder().setChunk(ByteString.copyFrom(bytes)).build();
         FileUtil.deleteFile(file, path);
         return BluePrintUploadInput.newBuilder()
+                .setCommonHeader(CommonHeader.newBuilder()
+                        .setRequestId(UUID.randomUUID().toString())
+                        .setSubRequestId(UUID.randomUUID().toString())
+                        .setOriginatorId("SDC-LISTENER")
+                        .build())
+                .setActionIdentifiers(ActionIdentifiers.newBuilder()
+                        .setActionName(UploadAction.PUBLISH.toString()).build())
                 .setFileChunk(fileChunk)
                 .build();
     }
index ee20f87..7a92c00 100644 (file)
  */
 package org.onap.ccsdk.cds.sdclistener.handler;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import com.google.protobuf.ByteString;
 import io.grpc.ManagedChannel;
 import io.grpc.inprocess.InProcessChannelBuilder;
 import io.grpc.inprocess.InProcessServerBuilder;
 import io.grpc.stub.StreamObserver;
 import io.grpc.testing.GrpcCleanupRule;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Paths;
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.onap.ccsdk.cds.sdclistener.client.SdcListenerAuthClientInterceptor;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementServiceGrpc.BluePrintManagementServiceImplBase;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput;
 import org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk;
+import org.onap.ccsdk.cds.controllerblueprints.management.api.UploadAction;
+import org.onap.ccsdk.cds.sdclistener.client.SdcListenerAuthClientInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 @RunWith(SpringRunner.class)
 @EnableConfigurationProperties({BluePrintProcesssorHandler.class, SdcListenerAuthClientInterceptor.class})
 @SpringBootTest(classes = {BluePrintProcessorHandlerTest.class})
@@ -66,7 +72,7 @@ public class BluePrintProcessorHandlerTest {
         final BluePrintManagementServiceImplBase serviceImplBase = new BluePrintManagementServiceImplBase() {
             @Override
             public void uploadBlueprint(BluePrintUploadInput request,
-                StreamObserver<BluePrintManagementOutput> responseObserver) {
+                                        StreamObserver<BluePrintManagementOutput> responseObserver) {
                 responseObserver.onNext(getBluePrintManagementOutput());
                 responseObserver.onCompleted();
             }
@@ -77,7 +83,7 @@ public class BluePrintProcessorHandlerTest {
 
         // Create a server, add service, start, and register.
         grpcCleanup.register(
-            InProcessServerBuilder.forName(serverName).addService(serviceImplBase).directExecutor().build().start());
+                InProcessServerBuilder.forName(serverName).addService(serviceImplBase).directExecutor().build().start());
 
         // Create a client channel.
         channel = grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build());
@@ -101,7 +107,16 @@ public class BluePrintProcessorHandlerTest {
         byte[] bytes = FileUtils.readFileToByteArray(file);
         FileChunk fileChunk = FileChunk.newBuilder().setChunk(ByteString.copyFrom(bytes)).build();
 
-        return BluePrintUploadInput.newBuilder().setFileChunk(fileChunk).build();
+
+        return BluePrintUploadInput.newBuilder()
+                .setCommonHeader(CommonHeader.newBuilder()
+                        .setRequestId(UUID.randomUUID().toString())
+                        .setSubRequestId(UUID.randomUUID().toString())
+                        .setOriginatorId("SDC-LISTENER")
+                        .build())
+                .setActionIdentifiers(ActionIdentifiers.newBuilder()
+                        .setActionName(UploadAction.PUBLISH.toString()).build())
+                .setFileChunk(fileChunk).build();
     }
 
     private BluePrintManagementOutput getBluePrintManagementOutput() {