diff options
20 files changed, 170 insertions, 115 deletions
diff --git a/cds-ui/client/src/app/common/core/store/models/resources.model.ts b/cds-ui/client/src/app/common/core/store/models/resources.model.ts index 019c2684a..e89094bb1 100644 --- a/cds-ui/client/src/app/common/core/store/models/resources.model.ts +++ b/cds-ui/client/src/app/common/core/store/models/resources.model.ts @@ -27,4 +27,5 @@ export interface IResources { updated_bt:string; property: IPropertyData; sources: ISourcesData; + definition?: any; }
\ No newline at end of file diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.service.ts b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.service.ts index fdb261d52..dd17a30d2 100644 --- a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.service.ts +++ b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.service.ts @@ -1,3 +1,24 @@ +/* +============LICENSE_START========================================== +=================================================================== +Copyright (C) 2019 IBM Intellectual Property. All rights reserved. +=================================================================== + +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the License); +you may not use this software 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============================================ +*/ + import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.html b/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.html index 97c65b220..46e1ea7da 100644 --- a/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.html +++ b/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.html @@ -34,9 +34,6 @@ limitations under the License. <ng-template matStepLabel>Browse CBA Template file</ng-template> <div class="matStepContent"> <app-search-template [optionSelected]="templateOption" (cbaFile)="fileChange($event)"></app-search-template> - <!-- <div> - <button mat-button matStepperNext class="matStepNextBtn">Upload</button> - </div>--> </div> </mat-step> <mat-step [stepControl]="step3FormGroup"> diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.ts b/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.ts index 561f15a5d..9188b43b8 100644 --- a/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.ts +++ b/cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.component.ts @@ -19,8 +19,6 @@ limitations under the License. ============LICENSE_END============================================ */ import { Component, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; import { IBlueprint } from 'src/app/common/core/store/models/blueprint.model'; import { IBlueprintState } from 'src/app/common/core/store/models/blueprintState.model'; import { IMetaData } from 'src/app/common/core/store/models/metadata.model'; @@ -40,8 +38,7 @@ export class SelectTemplateComponent implements OnInit { importModel: IImportModel; templateOption: any; - constructor(private store: Store<IBlueprintState>) { - // this.importModel.file = ''; + constructor() { } ngOnInit() { @@ -51,23 +48,14 @@ export class SelectTemplateComponent implements OnInit { this.templateOption = option; console.log(this.templateOption); } - + fileChange(topologyTemp: ITopologyTemplate) { this.topologyTemplate = topologyTemp; console.log(topologyTemp); } metaDataDetail(data: IMetaData) { - + this.metaData = data; console.log("parent" + this.metaData.author_email); } - upload() { - - } - - // saveBlueprintModel(){ - // this.blueprint.toplogyTemplates=this.topologyTemplate; - // this.blueprint.metadata= this.metaData; - // // this.store.dispatch(new CreateBlueprint(this.blueprint)); - // } } diff --git a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.component.ts b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.component.ts index 2da1287ba..aa8a1064d 100644 --- a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.component.ts +++ b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.component.ts @@ -47,6 +47,7 @@ export class ResourceEditComponent implements OnInit { viewText: string = "Open in Editor Mode"; @ViewChild(JsonEditorComponent) editor: JsonEditorComponent; options = new JsonEditorOptions(); + sourcesList = []; constructor(private store: Store<IAppState>, private resourceEditService: ResourceEditService, private alertService: NotificationHandlerService) { this.rdState = this.store.select('resources'); @@ -60,6 +61,9 @@ export class ResourceEditComponent implements OnInit { resourcesdata => { var resourcesState: IResourcesState = { resources: resourcesdata.resources, isLoadSuccess: resourcesdata.isLoadSuccess, isSaveSuccess: resourcesdata.isSaveSuccess, isUpdateSuccess: resourcesdata.isUpdateSuccess }; this.resources=resourcesState.resources; + if(resourcesdata.resources.definition && resourcesdata.resources.definition.sources) { + this.sourcesList = resourcesdata.resources.definition.sources; + } }) } diff --git a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts index 417f6edb3..ed1ef6f37 100644 --- a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts +++ b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts @@ -38,12 +38,10 @@ export class ResourceEditService { } getSources() { - // to do - return this.api.get('ResourceDictionaryURLs.getSources'); + return this.api.get(ResourceDictionaryURLs.getSources); } getModelType(name) { - // to do - return this.api.get("ResourceDictionaryURLs.getModelType + '/' + name"); + return this.api.get(ResourceDictionaryURLs.getModelType + '/' + name); } }
\ No newline at end of file diff --git a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.ts b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.ts index c4ad83d67..42f990a24 100644 --- a/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.ts +++ b/cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.ts @@ -20,7 +20,7 @@ * ============LICENSE_END========================================================= */ -import { Component, OnInit, ViewChild, EventEmitter, Output } from '@angular/core'; +import { Component, OnInit, ViewChild, EventEmitter, Output, Input } from '@angular/core'; import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop'; import { IResources } from 'src/app/common/core/store/models/resources.model'; import { IResourcesState } from 'src/app/common/core/store/models/resourcesState.model'; @@ -62,9 +62,17 @@ export class SourcesTemplateComponent implements OnInit { resourcesdata => { var resourcesState: IResourcesState = { resources: resourcesdata.resources, isLoadSuccess: resourcesdata.isLoadSuccess, isSaveSuccess: resourcesdata.isSaveSuccess, isUpdateSuccess: resourcesdata.isUpdateSuccess }; this.resources=resourcesState.resources; - this.sources = resourcesState.resources.sources; + // this.sources = resourcesState.resources.sources; + if(resourcesState.resources.definition && resourcesState.resources.definition.sources) { + this.sources = resourcesState.resources.definition.sources; + } for (let key in this.sources) { - this.sourcesOptions.push(key); + // this.sourcesOptions.push(key); + let source = { + name : key, + data: this.sources[key] + } + this.sourcesOptions.push(source); } }) } @@ -136,5 +144,19 @@ export class SourcesTemplateComponent implements OnInit { event.previousIndex, event.currentIndex); } - } + } + + getResources() { + this.apiService.getSources() + .subscribe(data=>{ + console.log(data); + for (let key in data[0]) { + let sourceObj = { name: key, value: data[0][key] } + this.option.push(sourceObj); + } + // this.sourcesOptions = data; + }, error=>{ + console.log(error); + }) + } } diff --git a/cds-ui/server/src/controllers/blueprint-rest.controller.ts b/cds-ui/server/src/controllers/blueprint-rest.controller.ts index 52e77ee7b..14aba5617 100644 --- a/cds-ui/server/src/controllers/blueprint-rest.controller.ts +++ b/cds-ui/server/src/controllers/blueprint-rest.controller.ts @@ -42,20 +42,20 @@ import { Response, RestBindings, } from '@loopback/rest'; -import {Blueprint} from '../models'; +import { Blueprint } from '../models'; import { inject } from '@loopback/core'; import { BlueprintService } from '../services'; import * as fs from 'fs'; import * as multiparty from 'multiparty'; import * as request_lib from 'request'; -import {controllerApiConfig, processorApiConfig, appConfig} from '../config/app-config'; -import {bluePrintManagementServiceGrpcClient} from '../clients/blueprint-management-service-grpc-client'; +import { controllerApiConfig, processorApiConfig, appConfig } from '../config/app-config'; +import { bluePrintManagementServiceGrpcClient } from '../clients/blueprint-management-service-grpc-client'; export class BlueprintRestController { constructor( - @inject('services.BlueprintService') + @inject('services.BlueprintService') public bpservice: BlueprintService, - ) {} + ) { } @get('/blueprints', { responses: { @@ -69,6 +69,17 @@ export class BlueprintRestController { return await this.bpservice.getAllblueprints(); } + @get('/searchByTags/{tags}', { + responses: { + '200': { + content: { 'application/json': {} }, + }, + }, + }) + async getByTags(@param.path.string('tags') tags: string) { + return await this.bpservice.getByTags(tags); + } + @post('/create-blueprint') async upload( @requestBody({ @@ -78,21 +89,21 @@ export class BlueprintRestController { 'multipart/form-data': { // Skip body parsing 'x-parser': 'stream', - schema: {type: 'object'}, + schema: { type: 'object' }, }, }, }) request: Request, @inject(RestBindings.Http.RESPONSE) response: Response, ): Promise<Response> { - return new Promise((resolve, reject) => { - this.getFileFromMultiPartForm(request).then(file=>{ - this.uploadFileToBlueprintController(file, "/blueprint-model/", response).then(resp=>{ + return new Promise((resolve, reject) => { + this.getFileFromMultiPartForm(request).then(file => { + this.uploadFileToBlueprintController(file, "/blueprint-model/", response).then(resp => { resolve(resp); - }, err=>{ - reject(err); - }); - }, err=>{ + }, err => { + reject(err); + }); + }, err => { reject(err); }); }); @@ -107,21 +118,21 @@ export class BlueprintRestController { 'multipart/form-data': { // Skip body parsing 'x-parser': 'stream', - schema: {type: 'object'}, + schema: { type: 'object' }, }, }, }) request: Request, @inject(RestBindings.Http.RESPONSE) response: Response, ): Promise<Response> { - return new Promise((resolve, reject) => { - this.getFileFromMultiPartForm(request).then(file=>{ - this.uploadFileToBlueprintController(file, "/blueprint-model/publish/", response).then(resp=>{ + return new Promise((resolve, reject) => { + this.getFileFromMultiPartForm(request).then(file => { + this.uploadFileToBlueprintController(file, "/blueprint-model/publish/", response).then(resp => { resolve(resp); - }, err=>{ - reject(err); - }); - }, err=>{ + }, err => { + reject(err); + }); + }, err => { reject(err); }); }); @@ -136,21 +147,21 @@ export class BlueprintRestController { 'multipart/form-data': { // Skip body parsing 'x-parser': 'stream', - schema: {type: 'object'}, + schema: { type: 'object' }, }, }, }) request: Request, @inject(RestBindings.Http.RESPONSE) response: Response, ): Promise<Response> { - return new Promise((resolve, reject) => { - this.getFileFromMultiPartForm(request).then(file=>{ - this.uploadFileToBlueprintController(file, "/blueprint-model/enrich/", response).then(resp=>{ - resolve(resp); - }, err=>{ - reject(err); - }); - }, err=>{ + return new Promise((resolve, reject) => { + this.getFileFromMultiPartForm(request).then(file => { + this.uploadFileToBlueprintController(file, "/blueprint-model/enrich/", response).then(resp => { + resolve(resp); + }, err => { + reject(err); + }); + }, err => { reject(err); }); }); @@ -159,21 +170,21 @@ export class BlueprintRestController { @get('/download-blueprint/{name}/{version}') async download( @param.path.string('name') name: string, - @param.path.string('version') version:string, + @param.path.string('version') version: string, @inject(RestBindings.Http.RESPONSE) response: Response, ): Promise<Response> { - return this.downloadFileFromBlueprintController("/blueprint-model/download/by-name/"+name+"/version/"+version, response); + return this.downloadFileFromBlueprintController("/blueprint-model/download/by-name/" + name + "/version/" + version, response); } - async getFileFromMultiPartForm(request: Request): Promise<multiparty.File>{ + async getFileFromMultiPartForm(request: Request): Promise<multiparty.File> { return new Promise((resolve, reject) => { let form = new multiparty.Form(); form.parse(request, (err: any, fields: any, files: { [x: string]: any[]; }) => { if (err) reject(err); let file = files['file'][0]; // get the file from the returned files object - if(!file){ + if (!file) { reject('File was not found in form data.'); - }else{ + } else { resolve(file); } }); @@ -189,34 +200,34 @@ export class BlueprintRestController { 'multipart/form-data': { // Skip body parsing 'x-parser': 'stream', - schema: {type: 'object'}, + schema: { type: 'object' }, }, }, }) request: Request, @inject(RestBindings.Http.RESPONSE) response: Response, ): Promise<Response> { - return new Promise((resolve, reject) => { - this.getFileFromMultiPartForm(request).then(file=>{ - if(appConfig.action.deployBlueprint.grpcEnabled) - return this.uploadFileToBlueprintProcessorGrpc(file, response); - else + return new Promise((resolve, reject) => { + this.getFileFromMultiPartForm(request).then(file => { + if (appConfig.action.deployBlueprint.grpcEnabled) + return this.uploadFileToBlueprintProcessorGrpc(file, response); + else return this.uploadFileToBlueprintProcessor(file, "/execution-service/upload/", response); - }, err=>{ + }, err => { reject(err); }); }); } - async uploadFileToBlueprintController(file: multiparty.File, uri: string, response: Response): Promise<Response>{ + async uploadFileToBlueprintController(file: multiparty.File, uri: string, response: Response): Promise<Response> { return this.uploadFileToBlueprintService(file, controllerApiConfig.http.url + uri, controllerApiConfig.http.authToken, response); } - async uploadFileToBlueprintProcessor(file: multiparty.File, uri: string, response: Response): Promise<Response>{ + async uploadFileToBlueprintProcessor(file: multiparty.File, uri: string, response: Response): Promise<Response> { return this.uploadFileToBlueprintService(file, processorApiConfig.http.url + uri, processorApiConfig.http.authToken, response); } - async uploadFileToBlueprintService(file: multiparty.File, url: string, authToken: string, response: Response): Promise<Response>{ + async uploadFileToBlueprintService(file: multiparty.File, url: string, authToken: string, response: Response): Promise<Response> { let options = { url: url, headers: { @@ -238,7 +249,7 @@ export class BlueprintRestController { fs.unlink(file.path, (err: any) => { if (err) { console.error(err); - } + } }); } @@ -280,10 +291,10 @@ export class BlueprintRestController { async uploadFileToBlueprintProcessorGrpc(file: multiparty.File, response: Response): Promise<Response> { return new Promise<Response>((resolve, reject) => { - bluePrintManagementServiceGrpcClient.uploadBlueprint(file.path).then(output=>{ + bluePrintManagementServiceGrpcClient.uploadBlueprint(file.path).then(output => { response.send(output.status.message); resolve(response); - }, err=>{ + }, err => { response.status(500).send(err); resolve(response); }); diff --git a/cds-ui/server/src/datasources/blueprint.datasource-template.ts b/cds-ui/server/src/datasources/blueprint.datasource-template.ts index 35edf33e3..1188d9bcf 100644 --- a/cds-ui/server/src/datasources/blueprint.datasource-template.ts +++ b/cds-ui/server/src/datasources/blueprint.datasource-template.ts @@ -21,5 +21,22 @@ export default { "getAllblueprints": [] } - }] + }, + { + "template": { + "method": "GET", + "url": controllerApiConfig.http.url + "/blueprint-model/search/{tags}", + "headers": { + "accepts": "application/json", + "content-type": "application/json", + "authorization": controllerApiConfig.http.authToken + }, + "responsePath": "$.*" + }, + "functions": { + "getByTags": ["tags"] + + } + }, +] };
\ No newline at end of file diff --git a/cds-ui/server/src/services/blueprint.service.ts b/cds-ui/server/src/services/blueprint.service.ts index 970b2afda..0545faca8 100644 --- a/cds-ui/server/src/services/blueprint.service.ts +++ b/cds-ui/server/src/services/blueprint.service.ts @@ -4,6 +4,7 @@ import {BlueprintDataSource} from '../datasources'; export interface BlueprintService { getAllblueprints(): Promise<any>; + getByTags(tags: string): Promise<JSON>; } export class BlueprintServiceProvider implements Provider<BlueprintService> { diff --git a/docs/microservices/controllerBlueprintStudioProcessorMS.rst b/docs/microservices/controllerBlueprintStudioProcessorMS.rst index 683b6943d..9dcd31187 100644 --- a/docs/microservices/controllerBlueprintStudioProcessorMS.rst +++ b/docs/microservices/controllerBlueprintStudioProcessorMS.rst @@ -9,31 +9,12 @@ The Controller Blueprint Archive is the overall service design, fully model-driv The CBA is .zip file which is saved in Controller Blueprint Database. -Dynamic API: ------------- - -The nature of the API request and response is meant to be model driven and dynamic. They both share the same definition. - -The actionName, under the actionIdentifiers refers to the name of a Workflow (see workflow) - -The content of the payload is what is fully dynamic / model driven. - -The first top level element will always be either $actionName-request for a request or $actionName-response for a response. - -Then the content within this element is fully based on the workflow input and output. +Controller Blueprint Microservices: +----------------------------------- .. toctree:: :maxdepth: 1 dynamicapi - -Enrichment: ------------ - -Helps to generate complete valid CBA file. - -.. toctree:: - :maxdepth: 1 - enrichment
\ No newline at end of file diff --git a/docs/microservices/enrichment.rst b/docs/microservices/enrichment.rst index 55984d77c..1f94556e3 100644 --- a/docs/microservices/enrichment.rst +++ b/docs/microservices/enrichment.rst @@ -12,12 +12,14 @@ Once the base CBA zip file is done, the enrichment process will complete the des The following shows 2 ways to run CBA enrichment -*REST API request +REST API request: +---------------- |image0| -*CDS UI +CDS UI: +------ |image1| diff --git a/docs/flexibleplugin.rst b/docs/microservices/flexibleplugin.rst index 5c83ac9b7..5c83ac9b7 100644 --- a/docs/flexibleplugin.rst +++ b/docs/microservices/flexibleplugin.rst diff --git a/docs/media/dyanmicapi.JPG b/docs/microservices/media/dyanmicapi.jpg Binary files differindex 3e00da3e8..3e00da3e8 100644 --- a/docs/media/dyanmicapi.JPG +++ b/docs/microservices/media/dyanmicapi.jpg diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceHandler.kt b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceHandler.kt index 5a4f3dea4..347e5eac4 100644 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceHandler.kt +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceHandler.kt @@ -118,7 +118,7 @@ class ExecutionServiceHandler(private val bluePrintPathConfiguration: BluePrintP return output } catch (e: Exception) { log.error("fail processing request id $requestId", e) - return response(executionServiceInput, e.localizedMessage, true) + return response(executionServiceInput, e.localizedMessage ?: e.message ?: e.toString(), true) } } @@ -156,4 +156,4 @@ class ExecutionServiceHandler(private val bluePrintPathConfiguration: BluePrintP return executionServiceOutput } -}
\ No newline at end of file +} diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingConfig.kt b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingConfig.kt index a04a79921..17e157d15 100644 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingConfig.kt +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingConfig.kt @@ -1,5 +1,7 @@ package org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.ObjectMapper import org.apache.kafka.clients.CommonClientConfigs import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.StringDeserializer @@ -7,10 +9,10 @@ import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInpu import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.kafka.annotation.EnableKafka import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory import org.springframework.kafka.core.ConsumerFactory import org.springframework.kafka.core.DefaultKafkaConsumerFactory +import org.springframework.kafka.support.serializer.ErrorHandlingDeserializer2 import org.springframework.kafka.support.serializer.JsonDeserializer @Configuration @@ -26,11 +28,20 @@ open class MessagingConfig { val configProperties = hashMapOf<String, Any>() configProperties[CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServers configProperties[ConsumerConfig.GROUP_ID_CONFIG] = groupId - configProperties[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java.name - configProperties[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = JsonDeserializer::class.java.name - configProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") + configProperties[ConsumerConfig.AUTO_OFFSET_RESET_CONFIG] = "latest" + configProperties[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java + configProperties[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = ErrorHandlingDeserializer2::class.java + configProperties[ErrorHandlingDeserializer2.VALUE_DESERIALIZER_CLASS] = JsonDeserializer::class.java.name - return DefaultKafkaConsumerFactory(configProperties, StringDeserializer(), JsonDeserializer(ExecutionServiceInput::class.java)) + val deserializer = JsonDeserializer<ExecutionServiceInput>() + deserializer.setRemoveTypeHeaders(true) + deserializer.addTrustedPackages("*") + + val jsonDeserializer = JsonDeserializer(ExecutionServiceInput::class.java, + ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)) + + return DefaultKafkaConsumerFactory(configProperties, StringDeserializer(), + ErrorHandlingDeserializer2<ExecutionServiceInput>(jsonDeserializer)) } /** diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingController.kt b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingController.kt index 1d219a83e..54cc0c129 100644 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/MessagingController.kt @@ -18,6 +18,7 @@ package org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking import org.apache.commons.lang3.builder.ToStringBuilder +import org.apache.kafka.clients.consumer.ConsumerRecord import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput import org.onap.ccsdk.cds.blueprintsprocessor.message.service.BluePrintMessageLibPropertyService import org.slf4j.LoggerFactory @@ -39,17 +40,15 @@ open class MessagingController(private val propertyService: BluePrintMessageLibP } @KafkaListener(topics = ["\${blueprintsprocessor.messageclient.self-service-api.consumerTopic}"]) - open fun receive(input: ExecutionServiceInput) { - - log.info("Successfully received a message: {}", ToStringBuilder.reflectionToString(input)) + open fun receive(record: ConsumerRecord<String, ExecutionServiceInput>) { runBlocking { - log.info("Successfully received a message: {}", ToStringBuilder.reflectionToString(input)) + log.info("Successfully received a message: {}", ToStringBuilder.reflectionToString(record.value())) // Process the message. async { - processMessage(input) - } + processMessage(record.value()) + }.await() } } diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/messaginglib/MessagingControllerTest.kt b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/messaginglib/MessagingControllerTest.kt index f7459f522..602033ad9 100644 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/messaginglib/MessagingControllerTest.kt +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/messaginglib/MessagingControllerTest.kt @@ -90,7 +90,7 @@ class MessagingControllerTest { @Autowired lateinit var webTestClient: WebTestClient - var receivedEvent: String? = null + var event: ExecutionServiceInput? = null @Before fun setup() { @@ -142,11 +142,13 @@ class MessagingControllerTest { log.info("test-sender sent message='{}'", ToStringBuilder.reflectionToString(input)) Thread.sleep(1000) + + assertNotNull(event) } @KafkaListener(topicPartitions = [TopicPartition(topic = "\${blueprintsprocessor.messageclient.self-service-api.topic}", partitionOffsets = [PartitionOffset(partition = "0", initialOffset = "0")])]) - fun receivedEventFromBluePrintProducer(event: ExecutionServiceInput) { - assertNotNull(event) + fun receivedEventFromBluePrintProducer(receivedEvent: ExecutionServiceInput) { + event = receivedEvent } private fun uploadBluePrint() { @@ -172,7 +174,7 @@ class MessagingControllerTest { } private fun loadCbaArchive():File { - return Paths.get("./src/test/resources/cba-for-kafka-integration.zip").toFile() + return Paths.get("./src/test/resources/cba-for-kafka-integration_enriched.zip").toFile() } @Configuration diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration.zip b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration.zip Binary files differdeleted file mode 100644 index 23070380c..000000000 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration.zip +++ /dev/null diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration_enriched.zip b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration_enriched.zip Binary files differnew file mode 100755 index 000000000..9581191d7 --- /dev/null +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/test/resources/cba-for-kafka-integration_enriched.zip |