diff options
23 files changed, 433 insertions, 785 deletions
diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.html index 9f0028bd9..305ffa6f3 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/configuration-dashboard/configuration-dashboard.component.html @@ -728,9 +728,11 @@ </div> </div> </div> - <button type="button" class="btn btn-sm mb-2 btn-enrich" data-toggle="modal" - data-target="#enrichModal"> - <i class="icon-enrich" aria-hidden="true"></i> Manual Enrich + <button type="button" class="btn btn-sm mb-2 btn-enrich" + (click)="enrichBluePrint()"> + <!-- data-toggle="modal" data-target="#enrichModal"--> + + <i class="icon-enrich" aria-hidden="true"></i> Enrich </button> @@ -758,6 +760,9 @@ <a class="nav-item nav-link" id="nav-authentication-tab" data-toggle="tab" href="#nav-authentication" role="tab" aria-controls="nav-authentication" aria-selected="false">EXTERNAL SYSTEM AUTHENTICATION PROPERTIES</a> + <a class="nav-item nav-link" id="nav-topologytemplate-tab" data-toggle="tab" + href="#nav-topologytemplate" role="tab" aria-controls="nav-authentication" + aria-selected="false">Topology Template</a> </div> </div> @@ -790,6 +795,14 @@ </div> </div> </div> + <div class="tab-pane fade" id="nav-topologytemplate" role="tabpanel" + aria-labelledby="nav-authentication-tab"> + <div class="card creat-card"> + <div class="editor-container"> + <app-topology-template></app-topology-template> + </div> + </div> + </div> </div> </div> </div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.css b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.css new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.css diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.html new file mode 100644 index 000000000..f67364421 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.html @@ -0,0 +1,13 @@ +<p>topology-template works!</p> +<ul class="defintionsNote"> + <li><b>To add new property: </b></li> + <li>1. Use Copy and paste option or</li> + <li>2. Write them manually</li> +</ul> +<ace-editor [(text)]="content" [mode]="'json'" + [autoUpdateContent]="true" [durationBeforeCallback]="1000" [theme]="'eclipse'" + (textChanged)="textChanged($event)" + #editor style="height:300px;" + (autocomplete)="content" +> +</ace-editor> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.ts new file mode 100644 index 000000000..8fce6954d --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/topology-template/topology-template.component.ts @@ -0,0 +1,56 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {distinctUntilChanged, takeUntil} from 'rxjs/operators'; +import {DesignerStore} from '../../designer/designer.store'; +import {Subject} from 'rxjs'; +import {PackageCreationUtils} from '../package-creation.utils'; +import {PackageCreationStore} from '../package-creation.store'; + +@Component({ + selector: 'app-topology-template', + templateUrl: './topology-template.component.html', + styleUrls: ['./topology-template.component.css'] +}) +export class TopologyTemplateComponent implements OnInit, OnDestroy { + + ngUnsubscribe = new Subject(); + content = ' '; + private cbaPackage: any; + private designerState: any; + + constructor(private designerStore: DesignerStore, + private packageCreationUtils: PackageCreationUtils, + private packageCreationStore: PackageCreationStore) { + + this.packageCreationStore.state$ + .pipe(distinctUntilChanged((a: any, b: any) => JSON.stringify(a) === JSON.stringify(b)), + takeUntil(this.ngUnsubscribe)) + .subscribe( + cbaPackage => { + this.cbaPackage = cbaPackage; + }); + this.designerStore.state$.pipe( + distinctUntilChanged((a: any, b: any) => JSON.stringify(a) === JSON.stringify(b)), + takeUntil(this.ngUnsubscribe)) + .subscribe(state => { + this.designerState = state; + this.content = + this.packageCreationUtils.transformToJson(state.template); + console.log(this.content); + console.log(state.template); + }); + } + + ngOnInit() { + } + + textChanged($event: {}) { + this.cbaPackage.templateTopology.content = this.content; + this.designerState.template = JSON.parse(this.content); + + } + + ngOnDestroy() { + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.css b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.css index e69de29bb..953346b89 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.css +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.css @@ -0,0 +1,6 @@ +.dot { + height: 8px; + width: 1px; + background-color: #0ABDE3; + +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html index ca88c6571..dea94dbe6 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html @@ -33,6 +33,8 @@ <p class="packageName" tooltip="{{bluePrint.artifactName}}" placement="bottom"> {{bluePrint.artifactName}}</p> <span class="package-version">v{{bluePrint.artifactVersion}}</span> + <button *ngIf="bluePrint.published.includes('Y')" type="button" + class="dot"><i class="glyphicon glyphicon-ok"></i></button> </a> </div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages.module.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages.module.ts index ad79a1321..e231ebeb5 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages.module.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages.module.ts @@ -36,6 +36,8 @@ import { ImportPackageComponent } from './packages-dashboard/import-package/impo import { FunctionsAttributeComponent } from './designer/functions-attribute/functions-attribute.component'; import { ActionAttributesComponent } from './designer/action-attributes/action-attributes.component'; import { MatInputModule, MatPaginatorModule, MatProgressSpinnerModule, MatSortModule, MatTableModule } from '@angular/material'; +import { TopologyTemplateComponent } from './package-creation/topology-template/topology-template.component'; +import {CollapseModule} from 'ngx-bootstrap/collapse'; @NgModule({ declarations: [PackagesDashboardComponent, @@ -61,6 +63,7 @@ import { MatInputModule, MatPaginatorModule, MatProgressSpinnerModule, MatSortMo ImportPackageComponent, FunctionsAttributeComponent, ActionAttributesComponent, + TopologyTemplateComponent, ], imports: [ @@ -80,7 +83,8 @@ import { MatInputModule, MatPaginatorModule, MatProgressSpinnerModule, MatSortMo MatTableModule, MatPaginatorModule, MatSortModule, - MatProgressSpinnerModule + MatProgressSpinnerModule, + CollapseModule ], providers: [ApiService, JsonPipe, ComponentCanDeactivateGuard], bootstrap: [] diff --git a/docs/api-reference/bp-processor.rst b/docs/api-reference/bp-processor.rst index 31efc40fd..ea8880174 100644 --- a/docs/api-reference/bp-processor.rst +++ b/docs/api-reference/bp-processor.rst @@ -23,9 +23,8 @@ Download Here is the automatically created swagger file for CDS Blueprint Processor API: :download:`cds-bp-processor-api-swagger.json <media/cds-bp-processor-api-swagger.json>` -:download:`cds-bp-processor-api-swagger.yaml <media/cds-bp-processor-api-swagger.yaml>` -You can find a postman collection including sample requests for all endpoints here: +You can find a postman collection including sample requests for all endpoints here: :download:`bp-processor.postman_collection.json <media/bp-processor.postman_collection.json>`. Please keep the Postman Collection up-to-date for new endpoints. diff --git a/docs/api-reference/media/bp-processor.postman_collection.json b/docs/api-reference/media/bp-processor.postman_collection.json index f2a9f1437..0e62117b7 100644 --- a/docs/api-reference/media/bp-processor.postman_collection.json +++ b/docs/api-reference/media/bp-processor.postman_collection.json @@ -318,6 +318,169 @@ } }, "url": { + "raw": "http://{{host}}:{{port}}/api/v1/blueprint-model/by-name/pnf_netconf/version/1.0.0", + "protocol": "http", + "host": [ + "{{host}}" + ], + "port": "{{port}}", + "path": [ + "api", + "v1", + "blueprint-model", + "by-name", + "pnf_netconf", + "version", + "1.0.0" + ] + }, + "description": "Get Meta-Data of a Blueprint Model by its name and version." + }, + "response": [ + { + "name": "CDS Bootstrap", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "", + "value": "", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n\"loadModelType\" : false,\r\n\"loadResourceDictionary\" : true,\r\n\"loadCBA\" : false\r\n}", + "options": { + "raw": {} + } + }, + "url": { + "raw": "http://localhost:8081/api/v1/blueprint-model/bootstrap", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8081", + "path": [ + "api", + "v1", + "blueprint-model", + "bootstrap" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "X-ONAP-RequestID", + "value": "b73253b6-d2be-4701-bdb2-31fa66b79a01" + }, + { + "key": "X-ONAP-InvocationID", + "value": "b1a59296-fcf2-4435-b8de-9a2e9b9f4077" + }, + { + "key": "X-ONAP-PartnerName", + "value": "cds-controller" + }, + { + "key": "Vary", + "value": "Origin" + }, + { + "key": "Vary", + "value": "Access-Control-Request-Method" + }, + { + "key": "Vary", + "value": "Access-Control-Request-Headers" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Content-Length", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "X-XSS-Protection", + "value": "1 ; mode=block" + }, + { + "key": "Referrer-Policy", + "value": "no-referrer" + } + ], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "Download a Blueprint Model", + "protocolProfileBehavior": { + "disabledSystemHeaders": {} + }, + "request": { + "auth": { + "type": "basic", + "basic": [ + { + "key": "password", + "value": "ccsdkapps", + "type": "string" + }, + { + "key": "username", + "value": "ccsdkapps", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "disabled": true + }, + { + "key": "", + "type": "text", + "value": "", + "disabled": true + } + ], + "url": { "raw": "http://{{host}}:{{port}}/api/v1/blueprint-model/download/by-name/pnf_netconf/version/1.0.0", "protocol": "http", "host": [ @@ -335,7 +498,7 @@ "1.0.0" ] }, - "description": "Get Meta-Data of a Blueprint Model by its name and version." + "description": "Gets the CBA of a blueprint model by its name and version. Response can be saved to a file to download the CBA." }, "response": [ { @@ -482,7 +645,7 @@ } ], "url": { - "raw": "http://{{host}}:{{port}}/api/v1/blueprint-model/download/416f241d-3ef9-4cb6-8834-956ae4f70b07", + "raw": "http://{{host}}:{{port}}/api/v1/blueprint-model/download/44471683-4446-4ed9-8b27-fac6a8f81e5e", "protocol": "http", "host": [ "{{host}}" @@ -493,7 +656,7 @@ "v1", "blueprint-model", "download", - "416f241d-3ef9-4cb6-8834-956ae4f70b07" + "44471683-4446-4ed9-8b27-fac6a8f81e5e" ] }, "description": "Gets the CBA of a blueprint model by its ID. Response can be saved to a file to download the CBA." @@ -2682,12 +2845,12 @@ ], "variable": [ { - "id": "86d601d8-fded-49c0-8870-545b57019003", + "id": "59f58f5b-ee64-490b-be39-09983d888dd8", "key": "host", "value": "localhost" }, { - "id": "b53854bd-6fbb-42bb-a001-9b77a3883cf8", + "id": "284f1750-2dd3-4fa4-aade-cccd91d53cc7", "key": "port", "value": "8081" } diff --git a/docs/api-reference/media/cds-bp-processor-api-swagger.json b/docs/api-reference/media/cds-bp-processor-api-swagger.json index a9f596527..af3ed94e6 100644 --- a/docs/api-reference/media/cds-bp-processor-api-swagger.json +++ b/docs/api-reference/media/cds-bp-processor-api-swagger.json @@ -64,7 +64,7 @@ "200" : { "description" : "OK", "schema" : { - "type" : "object" + "$ref" : "#/definitions/BlueprintModelSearch" } }, "500" : { @@ -129,7 +129,7 @@ "200" : { "description" : "OK", "schema" : { - "type" : "object" + "$ref" : "#/definitions/BlueprintModelSearch" } }, "404" : { @@ -249,7 +249,7 @@ "200" : { "description" : "OK", "schema" : { - "type" : "object" + "$ref" : "#/definitions/BlueprintModelSearch" } }, "503" : { @@ -277,7 +277,10 @@ "200" : { "description" : "successful operation", "schema" : { - "type" : "object" + "type" : "array", + "items" : { + "$ref" : "#/definitions/BlueprintModelSearch" + } } } } @@ -440,7 +443,7 @@ "200" : { "description" : "successful operation", "schema" : { - "type" : "object" + "$ref" : "#/definitions/BlueprintModelSearch" } } } @@ -465,7 +468,10 @@ "200" : { "description" : "successful operation", "schema" : { - "type" : "object" + "type" : "array", + "items" : { + "$ref" : "#/definitions/BlueprintModelSearch" + } } } } @@ -482,7 +488,8 @@ "parameters" : [ { "in" : "body", "name" : "body", - "required" : false, + "description" : "Blueprint and workflow identification", + "required" : true, "schema" : { "$ref" : "#/definitions/WorkFlowSpecRequest" } @@ -548,7 +555,7 @@ "200" : { "description" : "OK", "schema" : { - "type" : "object" + "$ref" : "#/definitions/BlueprintModelSearch" } }, "404" : { diff --git a/docs/api-reference/media/cds-bp-processor-api-swagger.yaml b/docs/api-reference/media/cds-bp-processor-api-swagger.yaml deleted file mode 100644 index e16e22cad..000000000 --- a/docs/api-reference/media/cds-bp-processor-api-swagger.yaml +++ /dev/null @@ -1,714 +0,0 @@ ---- -swagger: "2.0" -info: - description: "Shows all resources and endpoints which CDS BP processor currently\ - \ provides with sample requests/responses, parameter description and other information." - version: "v1" - title: "CDS Blueprint Processor API Reference" - termsOfService: "https://www.onap.org/" - contact: - name: "ONAP Community" - url: "https://www.onap.org/" - email: "onap-discuss@lists.onap.org" - license: - name: "Apache 2.0" - url: "http://www.apache.org/licenses/LICENSE-2.0.html" -host: "localhost:8080" -tags: -- name: "Blueprint Model Catalog API" - description: "Manages all blueprint models which are available in CDS" -schemes: -- "http" -paths: - /api/v1/blueprint-model: - get: - tags: - - "Blueprint Model Catalog API" - summary: "List all Blueprint Models" - description: "Lists all meta-data of blueprint models which are saved in CDS." - operationId: "BlueprintModelController_allBlueprintModel_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: [] - responses: - 200: - description: "OK" - schema: - type: "array" - items: - $ref: "#/definitions/BlueprintModelSearch" - 500: - description: "Internal Server Error" - post: - tags: - - "Blueprint Model Catalog API" - summary: "Save a Blueprint Model" - description: "Saves a blueprint model by the given CBA zip file input. There\ - \ is no validation of the attached CBA happening when this API is called." - operationId: "BlueprintModelController_saveBlueprint_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "multipart/form-data" - produces: - - "application/json" - parameters: - - in: "body" - name: "file" - description: "CBA file to be uploaded (example: cba.zip)" - required: true - schema: - $ref: "#/definitions/FilePart" - responses: - 200: - description: "OK" - schema: - type: "object" - 500: - description: "Internal Server Error" - /api/v1/blueprint-model/bootstrap: - post: - tags: - - "Blueprint Model Catalog API" - summary: "Bootstrap CDS" - description: "Loads all Model Types, Resource Dictionaries and Blueprint Models\ - \ which are included in CDS by default. Before starting to work with CDS,\ - \ bootstrap should be called to load all the basic models that each orginization\ - \ might support. Parameter values can be set as `false` to skip loading e.g.\ - \ the Resource Dictionaries but this is not recommended." - operationId: "BlueprintModelController_bootstrap_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "application/json" - produces: - - "application/json" - parameters: - - in: "body" - name: "body" - description: "Specifies which elements to load" - required: true - schema: - $ref: "#/definitions/BootstrapRequest" - responses: - 200: - description: "OK" - schema: - type: "object" - 500: - description: "Internal Server Error" - /api/v1/blueprint-model/by-name/{name}/version/{version}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Get a Blueprint Model by Name and Version" - description: "Get Meta-Data of a Blueprint Model by its name and version." - operationId: "BlueprintModelController_getBlueprintByNameAndVersion_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "name" - in: "path" - description: "Name of the blueprint model" - required: true - type: "string" - x-example: "pnf_netconf" - - name: "version" - in: "path" - description: "Version of the blueprint model" - required: true - type: "string" - x-example: "1.0.0" - responses: - 200: - description: "OK" - schema: - type: "object" - 404: - description: "Not Found" - /api/v1/blueprint-model/download/by-name/{name}/version/{version}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Download a Blueprint Model" - description: "Gets the CBA of a blueprint model by its name and version. Response\ - \ can be saved to a file to download the CBA." - operationId: "BlueprintModelController_downloadBlueprintByNameAndVersion_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "name" - in: "path" - description: "Name of the blueprint model" - required: true - type: "string" - x-example: "pnf_netconf" - - name: "version" - in: "path" - description: "Version of the blueprint model" - required: true - type: "string" - x-example: "1.0.0" - responses: - 200: - description: "OK" - schema: - type: "object" - 404: - description: "Not Found" - /api/v1/blueprint-model/download/{id}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Download a Blueprint Model by ID" - description: "Gets the CBA of a blueprint model by its ID. Response can be saved\ - \ to a file to download the CBA." - operationId: "BlueprintModelController_downloadBluePrint_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "id" - in: "path" - description: "ID of the blueprint model to download" - required: true - type: "string" - x-example: "67ec1f96-ab55-4b81-aff9-23ee0ed1d7a4" - responses: - 200: - description: "OK" - schema: - type: "object" - 404: - description: "Not Found" - /api/v1/blueprint-model/enrich: - post: - tags: - - "Blueprint Model Catalog API" - summary: "Enrich a Blueprint Model" - description: "Enriches the attached CBA and returns the enriched CBA zip file\ - \ in the response. The enrichment process will complete the package by providing\ - \ all the definition of types used." - operationId: "BlueprintModelController_enrichBlueprint_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "multipart/form-data" - produces: - - "application/json" - parameters: - - in: "body" - name: "file" - description: "CBA zip file to be uploaded (example: cba_unenriched.zip)" - required: true - schema: - $ref: "#/definitions/FilePart" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/enrichandpublish: - post: - tags: - - "Blueprint Model Catalog API" - summary: "Enrich and publish a Blueprint Model" - description: "Enriches the attached CBA, validates it and saves it in CDS if\ - \ validation was successful." - operationId: "BlueprintModelController_enrichAndPubishlueprint_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "multipart/form-data" - produces: - - "application/json" - parameters: - - in: "body" - name: "file" - description: "Unenriched CBA zip file to be uploaded (example: cba_unenriched.zip)" - required: true - schema: - $ref: "#/definitions/FilePart" - responses: - 200: - description: "OK" - schema: - type: "object" - 503: - description: "Service Unavailable" - /api/v1/blueprint-model/meta-data/{keyword}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Search for Blueprints by a Keyword" - description: "Lists all blueprint models by a matching keyword in any of the\ - \ meta-data of the blueprint models. Blueprint models are just returned if\ - \ a whole keyword is matching, not just parts of it. Not case-sensitive. Used\ - \ by CDS UI." - operationId: "BlueprintModelController_allBlueprintModelMetaData_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "keyword" - in: "path" - description: "Keyword to search for in blueprint model meta-data" - required: true - type: "string" - x-example: "pnf_netconf" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/name/{name}/version/{version}: - delete: - tags: - - "Blueprint Model Catalog API" - summary: "Delete a Blueprint Model by Name" - description: "Deletes a blueprint model identified by its name and version from\ - \ CDS." - operationId: "BlueprintModelController_deleteBlueprintByName_DELETE.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - parameters: - - name: "name" - in: "path" - description: "Name of the blueprint model" - required: true - type: "string" - x-example: "pnf_netconf" - - name: "version" - in: "path" - description: "Version of the blueprint model" - required: true - type: "string" - x-example: "1.0.0" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/paged: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Get Blueprints ordered" - description: "Lists all blueprint models which are saved in CDS in an ordered\ - \ mode." - operationId: "BlueprintModelController_allBlueprintModelPaged_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "limit" - in: "query" - description: "Maximum number of returned blueprint models" - required: false - type: "integer" - default: 20 - format: "int32" - - name: "offset" - in: "query" - description: "Offset" - required: false - type: "integer" - default: 0 - format: "int32" - - name: "sort" - in: "query" - description: "Order of returned blueprint models" - required: false - type: "string" - default: "DATE" - enum: - - "DATE" - - "NAME" - - "VERSION" - - name: "sortType" - in: "query" - description: "Ascend or descend ordering" - required: false - type: "string" - default: "ASC" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/PageBlueprintModelSearch" - /api/v1/blueprint-model/paged/meta-data/{keyword}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Search for Blueprints by a Keyword in an ordered mode" - description: "Lists all blueprint models by a matching keyword in any of the\ - \ meta-data of the blueprint models in an ordered mode. Blueprint models are\ - \ just returned if a whole keyword is matching, not just parts of it. Not\ - \ case-sensitive. Used by CDS UI." - operationId: "BlueprintModelController_allBlueprintModelMetaDataPaged_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "keyword" - in: "path" - description: "Keyword to search for in blueprint model meta-data" - required: true - type: "string" - x-example: "pnf_netconf" - - name: "limit" - in: "query" - description: "Maximum number of returned blueprint models" - required: false - type: "integer" - default: 20 - format: "int32" - - name: "offset" - in: "query" - description: "Offset" - required: false - type: "integer" - default: 0 - format: "int32" - - name: "sort" - in: "query" - description: "Order of returned blueprint models" - required: false - type: "string" - default: "DATE" - enum: - - "DATE" - - "NAME" - - "VERSION" - - name: "sortType" - in: "query" - description: "Ascend or descend ordering" - required: false - type: "string" - default: "ASC" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/PageBlueprintModelSearch" - /api/v1/blueprint-model/publish: - post: - tags: - - "Blueprint Model Catalog API" - summary: "Publish a Blueprint Model" - description: "Validates the attached CBA file and saves it in CDS if validation\ - \ was successful. CBA needs to be already enriched." - operationId: "BlueprintModelController_publishBlueprint_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "multipart/form-data" - produces: - - "application/json" - parameters: - - in: "body" - name: "file" - description: "Enriched CBA zip file to be uploaded (example: cba_enriched.zip)" - required: true - schema: - $ref: "#/definitions/FilePart" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/search/{tags}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Search for a Blueprint by Tag" - description: "Searches for all blueprint models which contain the specified\ - \ input parameter in their tags. Blueprint models which contain just parts\ - \ of the searched word in their tags are also returned." - operationId: "BlueprintModelController_searchBlueprintModels_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "tags" - in: "path" - description: "Tag to search for" - required: true - type: "string" - x-example: "test" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/workflow-spec: - post: - tags: - - "Blueprint Model Catalog API" - summary: "Get Workflow Specification" - description: "Get the workflow of a blueprint identified by Blueprint and workflow\ - \ name. Inputs, outputs and data types of workflow is returned." - operationId: "BlueprintModelController_workflowSpec_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - consumes: - - "application/json" - produces: - - "application/json" - parameters: - - in: "body" - name: "body" - required: false - schema: - $ref: "#/definitions/WorkFlowSpecRequest" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/workflows/blueprint-name/{name}/version/{version}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Get Workflows of a Blueprint" - description: "Get all available workflows of a Blueprint identified by its name\ - \ and version." - operationId: "BlueprintModelController_getWorkflowList_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "name" - in: "path" - description: "Name of the blueprint model" - required: true - type: "string" - x-example: "pnf_netconf" - - name: "version" - in: "path" - description: "Version of the blueprint model" - required: true - type: "string" - x-example: "1.0.0" - responses: - 200: - description: "successful operation" - schema: - type: "object" - /api/v1/blueprint-model/{id}: - get: - tags: - - "Blueprint Model Catalog API" - summary: "Get a Blueprint Model by ID" - description: "Get meta-data of a blueprint model by its internally created ID." - operationId: "BlueprintModelController_getBlueprintModel_GET.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - produces: - - "application/json" - parameters: - - name: "id" - in: "path" - description: "ID of the blueprint model to search for" - required: true - type: "string" - x-example: "67ec1f96-ab55-4b81-aff9-23ee0ed1d7a4" - responses: - 200: - description: "OK" - schema: - type: "object" - 404: - description: "Not Found" - delete: - tags: - - "Blueprint Model Catalog API" - summary: "Delete a Blueprint Model by ID" - description: "Delete a blueprint model by its ID. ID is the internally created\ - \ ID of blueprint, not the name of blueprint." - operationId: "BlueprintModelController_deleteBlueprint_DELETE.org.onap.ccsdk.cds.blueprintsprocessor.designer.api" - parameters: - - name: "id" - in: "path" - description: "ID of the blueprint model to delete" - required: true - type: "string" - x-example: "67ec1f96-ab55-4b81-aff9-23ee0ed1d7a4" - responses: - 200: - description: "OK" - schema: - type: "object" - 404: - description: "RESOURCE_NOT_FOUND" -securityDefinitions: - Basic Auth: - type: "basic" -definitions: - BlueprintModelSearch: - type: "object" - required: - - "artifactName" - - "artifactVersion" - - "createdDate" - - "id" - - "published" - - "tags" - - "updatedBy" - properties: - id: - type: "string" - example: "\"658f9a48-7f54-41ba-ae18-c69f26f3dc94\"" - description: "ID of Blueprint model, is automatically created by CDS" - artifactUUId: - type: "string" - example: "null" - description: "Artifact UUID, usually null" - artifactType: - type: "string" - example: "\"SDNC_MODEL\"" - description: "Artifact Type, usually null" - artifactVersion: - type: "string" - example: "\"1.0.0\"" - description: "Artifact Version, usually 1.0.0" - artifactDescription: - type: "string" - example: "\"\"" - description: "Artifact Description, usually empty" - internalVersion: - type: "integer" - format: "int32" - example: "null" - description: "Internal Version of CBA, usually null" - createdDate: - type: "string" - format: "date-time" - example: "\"2020-11-19T10:34:56.000Z\"" - description: "Datetime of the creation of CBA in CDS" - artifactName: - type: "string" - example: "\"pnf_netconf\"" - description: "Artifact Name, defined in Metadata" - published: - type: "string" - example: "\"pnf_netconf\"" - description: "Artifact Name, defined in Metadata" - updatedBy: - type: "string" - example: "\"Deutsche Telekom AG\"" - description: "Name of publisher, defined in Metadata" - tags: - type: "string" - example: "\"test\"" - description: "Tags to identify the CBA, defined in Metadata" - BootstrapRequest: - type: "object" - required: - - "loadCBA" - - "loadModelType" - - "loadResourceDictionary" - properties: - loadModelType: - type: "boolean" - example: true - description: "Specifies if default model types should be loaded" - loadResourceDictionary: - type: "boolean" - example: true - description: "Specifies if default data dictionaries should be loaded" - loadCBA: - type: "boolean" - example: true - description: "Specifies if default blueprint models should be loaded" - FilePart: - type: "object" - Page: - type: "object" - properties: - totalPages: - type: "integer" - format: "int32" - totalElements: - type: "integer" - format: "int64" - size: - type: "integer" - format: "int32" - content: - type: "array" - items: - type: "object" - number: - type: "integer" - format: "int32" - sort: - $ref: "#/definitions/Sort" - last: - type: "boolean" - numberOfElements: - type: "integer" - format: "int32" - pageable: - $ref: "#/definitions/Pageable" - first: - type: "boolean" - empty: - type: "boolean" - PageBlueprintModelSearch: - type: "object" - properties: - totalPages: - type: "integer" - format: "int32" - totalElements: - type: "integer" - format: "int64" - size: - type: "integer" - format: "int32" - content: - type: "array" - items: - $ref: "#/definitions/BlueprintModelSearch" - number: - type: "integer" - format: "int32" - sort: - $ref: "#/definitions/Sort" - last: - type: "boolean" - numberOfElements: - type: "integer" - format: "int32" - pageable: - $ref: "#/definitions/Pageable" - first: - type: "boolean" - empty: - type: "boolean" - Pageable: - type: "object" - properties: - offset: - type: "integer" - format: "int64" - sort: - $ref: "#/definitions/Sort" - paged: - type: "boolean" - unpaged: - type: "boolean" - pageNumber: - type: "integer" - format: "int32" - pageSize: - type: "integer" - format: "int32" - Sort: - type: "object" - properties: - unsorted: - type: "boolean" - sorted: - type: "boolean" - empty: - type: "boolean" - WorkFlowSpecRequest: - type: "object" - required: - - "blueprintName" - - "workflowName" - properties: - blueprintName: - type: "string" - example: "\"pnf_netconf\"" - description: "Name of the BLueprint" - version: - type: "string" - returnContent: - type: "string" - workflowName: - type: "string" - example: "\"config-assign\"" - description: "Name of the Workflow" - specType: - type: "string" diff --git a/ms/blueprintsprocessor/application/pom.xml b/ms/blueprintsprocessor/application/pom.xml index 2b144338a..cccff5228 100755 --- a/ms/blueprintsprocessor/application/pom.xml +++ b/ms/blueprintsprocessor/application/pom.xml @@ -335,9 +335,9 @@ <springmvc>true</springmvc> <locations> <location>org.onap.ccsdk.cds.blueprintsprocessor.designer.api.BlueprintModelController</location> - <!-- These locations are not implemented yet <location>org.onap.ccsdk.cds.blueprintsprocessor.resource.api</location> <location>org.onap.ccsdk.cds.blueprintsprocessor.configs.api</location> + <!-- This location is not implemented yet <location>org.onap.ccsdk.cds.blueprintsprocessor.healthapi</location> --> </locations> @@ -370,7 +370,7 @@ <type>basic</type> </securityDefinition> </securityDefinitions> - <outputFormats>json,yaml</outputFormats> + <outputFormats>json</outputFormats> <swaggerDirectory>${basedir}/../../../docs/api-reference/media</swaggerDirectory> <swaggerFileName>cds-bp-processor-api-swagger</swaggerFileName> <jsonExampleValues>true</jsonExampleValues> diff --git a/ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshot.kt b/ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshot.kt index 7df5ea144..a260d32bc 100644 --- a/ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshot.kt +++ b/ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshot.kt @@ -50,7 +50,7 @@ class ResourceConfigSnapshot : Serializable { @Column(name = "resource_type", nullable = false) var resourceType: String? = null - @get:ApiModelProperty(value = "ID associated with the resource type in the inventory system.", required = true) + @get:ApiModelProperty(value = "ID associated with the resource type in the inventory system.", required = true, example = "\"1\"") @Column(name = "resource_id", nullable = false) var resourceId: String? = null @@ -58,7 +58,7 @@ class ResourceConfigSnapshot : Serializable { @Column(name = "status", nullable = false) var status: Status? = null - @get:ApiModelProperty(value = "Snapshot of the resource as retrieved from resource.", required = true) + @get:ApiModelProperty(value = "Snapshot of the resource as retrieved from resource.", required = true, example = "\"config_snapshot\"") @Lob @Column(name = "config_snapshot", nullable = false) var config_snapshot: String? = null diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt index 38c5c99fb..79a00b1f0 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt @@ -150,8 +150,11 @@ open class ResourceResolutionServiceImpl( val failedResolution = resourceAssignmentList.filter { it.status != "success" && it.property?.required == true }.map { it.name } if (failedResolution.isNotEmpty()) { - log.error("Failed to resolve required resources($failedResolution)") - bluePrintRuntimeService.setBluePrintError(resourceAssignmentRuntimeService.getBluePrintError()) + // The following error message is returned by default to handle a scenario when + // error message comes empty even when resolution has actually failed. + // Example: input-source type resolution seems to fail with no error code. + bluePrintRuntimeService.getBluePrintError().errors.add("Failed to resolve required resources($failedResolution)") + bluePrintRuntimeService.getBluePrintError().errors.addAll(resourceAssignmentRuntimeService.getBluePrintError().errors) } } return ResourceResolutionResult(templateMap, assignmentMap) diff --git a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt index 98e5e5aec..f3e4e59aa 100644 --- a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt +++ b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintWorkflowService.kt @@ -103,7 +103,7 @@ abstract class AbstractBluePrintWorkFlowService<In, Out> : CoroutineScope, BlueP var exceptions: MutableList<Exception> = arrayListOf() - final override val coroutineContext: CoroutineContext + override val coroutineContext: CoroutineContext get() = job + CoroutineName("Wf") fun cancel() { diff --git a/ms/blueprintsprocessor/modules/blueprints/resource-dict/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/resource/dict/ResourceDefinition.kt b/ms/blueprintsprocessor/modules/blueprints/resource-dict/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/resource/dict/ResourceDefinition.kt index 556f4a3da..2e7e18258 100644 --- a/ms/blueprintsprocessor/modules/blueprints/resource-dict/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/resource/dict/ResourceDefinition.kt +++ b/ms/blueprintsprocessor/modules/blueprints/resource-dict/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/resource/dict/ResourceDefinition.kt @@ -20,29 +20,37 @@ package org.onap.ccsdk.cds.controllerblueprints.resource.dict import com.fasterxml.jackson.annotation.JsonFormat import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.JsonNode +import io.swagger.annotations.ApiModel +import io.swagger.annotations.ApiModelProperty import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition import java.io.Serializable import java.util.Date +@ApiModel open class ResourceDefinition { @JsonProperty(value = "name", required = true) + @ApiModelProperty(value = "Name", required = true, example = "\"default-source\"") lateinit var name: String @JsonProperty(value = "property", required = true) + @ApiModelProperty(value = "Property", required = true) lateinit var property: PropertyDefinition var tags: String? = null /** The default group for Resource Definition is "default" */ @JsonProperty(value = "group", required = true) + @ApiModelProperty(value = "Group", required = true, example = "\"default\"") var group: String = "default" @JsonProperty(value = "updated-by") + @ApiModelProperty(value = "Updated by", required = true, example = "\"example@onap.com\"") lateinit var updatedBy: String @JsonProperty(value = "sources", required = true) + @ApiModelProperty(value = "Sources", required = true, example = "\"sources\"") lateinit var sources: MutableMap<String, NodeTemplate> } diff --git a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt index d285fe52d..584df27ed 100644 --- a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt @@ -48,7 +48,7 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/v1/configs") @Api( - value = "/api/v1/configs", + value = "Resource configuration", description = "Interaction with stored configurations." ) open class ResourceConfigSnapshotController(private val resourceConfigSnapshotService: ResourceConfigSnapshotService) { @@ -67,7 +67,6 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe } @RequestMapping( - path = [""], method = [RequestMethod.GET], produces = [MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE] ) @@ -79,10 +78,10 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe @ResponseBody @PreAuthorize("hasRole('USER')") fun get( - @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false) + @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false, example = "\"PNF\"") @RequestParam(value = "resourceType", required = true) resourceType: String, - @ApiParam(value = "Resource Id associated of the resource configuration snapshot.", required = false) + @ApiParam(value = "Resource Id associated of the resource configuration snapshot.", required = false, example = "\"1\"") @RequestParam(value = "resourceId", required = true) resourceId: String, @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "RUNNING", required = false) @@ -142,18 +141,18 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe value = "Store a resource configuration snapshot identified by resourceId, resourceType, status.", notes = "Store a resource configuration snapshot, identified by its resourceId and resourceType, " + "and optionally its status, either RUNNING or CANDIDATE.", - response = ResourceConfigSnapshot::class, produces = MediaType.APPLICATION_JSON_VALUE + response = ResourceConfigSnapshot::class ) @ResponseBody @PreAuthorize("hasRole('USER')") fun postWithResourceIdAndResourceType( - @ApiParam(value = "Resource Type associated with the resolution.", required = false) + @ApiParam(value = "Resource Type associated with the resolution.", required = false, example = "\"PNF\"") @PathVariable(value = "resourceType", required = true) resourceType: String, - @ApiParam(value = "Resource Id associated with the resolution.", required = false) + @ApiParam(value = "Resource Id associated with the resolution.", required = false, example = "\"1\"") @PathVariable(value = "resourceId", required = true) resourceId: String, @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "RUNNING", required = true) @PathVariable(value = "status", required = true) status: String, - @ApiParam(value = "Config snapshot to store.", required = true) + @ApiParam(value = "Config snapshot to store.", required = true, example = "\"config_snapshot\"") @RequestBody snapshot: String ): ResponseEntity<ResourceConfigSnapshot> = runBlocking { @@ -178,7 +177,7 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe @ResponseBody @PreAuthorize("hasRole('USER')") fun getAllByID( - @ApiParam(value = "Resource Id associated of the resource configuration snapshots.", required = false) + @ApiParam(value = "Resource Id associated of the resource configuration snapshots.", required = false, example = "\"1\"") @RequestParam(value = "resourceId", required = true) resourceId: String, @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false) @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String @@ -223,7 +222,7 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe @ResponseBody @PreAuthorize("hasRole('USER')") fun getAllByType( - @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false) + @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false, example = "\"PNF\"") @RequestParam(value = "resourceType", required = true) resourceType: String, @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false) @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String diff --git a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BlueprintModelController.kt b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BlueprintModelController.kt index 167e4358d..8b79ce74a 100644 --- a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BlueprintModelController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/BlueprintModelController.kt @@ -91,7 +91,9 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @PostMapping(produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) @ApiOperation( value = "Save a Blueprint Model", - notes = "Saves a blueprint model by the given CBA zip file input. There is no validation of the attached CBA happening when this API is called." + notes = "Saves a blueprint model by the given CBA zip file input. " + + "There is no validation of the attached CBA happening when this API is called.", + response = BlueprintModelSearch::class ) @ApiResponses( ApiResponse(code = 200, message = "OK"), @@ -148,7 +150,9 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint value = "Search for Blueprints by a Keyword", notes = "Lists all blueprint models by a matching keyword in any of the meta-data of the blueprint models. " + "Blueprint models are just returned if a whole keyword is matching, not just parts of it. Not case-sensitive. " + - "Used by CDS UI." + "Used by CDS UI.", + responseContainer = "List", + response = BlueprintModelSearch::class ) @ResponseBody @PreAuthorize("hasRole('USER')") @@ -206,7 +210,8 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @GetMapping("/by-name/{name}/version/{version}", produces = [MediaType.APPLICATION_JSON_VALUE]) @ApiOperation( value = "Get a Blueprint Model by Name and Version", - notes = "Get Meta-Data of a Blueprint Model by its name and version." + notes = "Get Meta-Data of a Blueprint Model by its name and version.", + response = BlueprintModelSearch::class ) @ApiResponses( ApiResponse(code = 200, message = "OK"), @@ -249,7 +254,8 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @GetMapping("/{id}", produces = [MediaType.APPLICATION_JSON_VALUE]) @ApiOperation( value = "Get a Blueprint Model by ID", - notes = "Get meta-data of a blueprint model by its internally created ID." + notes = "Get meta-data of a blueprint model by its internally created ID.", + response = BlueprintModelSearch::class ) @ApiResponses( ApiResponse(code = 200, message = "OK"), @@ -316,7 +322,8 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint ) @ApiOperation( value = "Enrich and publish a Blueprint Model", - notes = "Enriches the attached CBA, validates it and saves it in CDS if validation was successful." + notes = "Enriches the attached CBA, validates it and saves it in CDS if validation was successful.", + response = BlueprintModelSearch::class ) @ApiResponses( ApiResponse(code = 200, message = "OK"), @@ -335,7 +342,8 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @PostMapping("/publish", produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) @ApiOperation( value = "Publish a Blueprint Model", - notes = "Validates the attached CBA file and saves it in CDS if validation was successful. CBA needs to be already enriched." + notes = "Validates the attached CBA file and saves it in CDS if validation was successful. CBA needs to be already enriched.", + response = BlueprintModelSearch::class ) @ResponseBody @Throws(BluePrintException::class) @@ -351,7 +359,9 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @ApiOperation( value = "Search for a Blueprint by Tag", notes = "Searches for all blueprint models which contain the specified input parameter in their tags. " + - "Blueprint models which contain just parts of the searched word in their tags are also returned." + "Blueprint models which contain just parts of the searched word in their tags are also returned.", + responseContainer = "List", + response = BlueprintModelSearch::class ) @ResponseBody @PreAuthorize("hasRole('USER')") @@ -397,7 +407,10 @@ open class BlueprintModelController(private val bluePrintModelHandler: BluePrint @ResponseBody @Throws(BluePrintException::class) @PreAuthorize("hasRole('USER')") - suspend fun workflowSpec(@RequestBody workFlowSpecReq: WorkFlowSpecRequest): + suspend fun workflowSpec( + @ApiParam(required = true, value = "Blueprint and workflow identification") + @RequestBody workFlowSpecReq: WorkFlowSpecRequest + ): ResponseEntity<String> = mdcWebCoroutineScope { var json = bluePrintModelHandler.prepareWorkFlowSpec(workFlowSpecReq) .asJsonString() diff --git a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/ResourceDictionaryController.kt b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/ResourceDictionaryController.kt index 7f569cfba..1dcfa2ff1 100644 --- a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/ResourceDictionaryController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/ResourceDictionaryController.kt @@ -16,6 +16,9 @@ package org.onap.ccsdk.cds.blueprintsprocessor.designer.api +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam import org.onap.ccsdk.cds.blueprintsprocessor.designer.api.domain.ResourceDictionary import org.onap.ccsdk.cds.blueprintsprocessor.designer.api.handler.ResourceDictionaryHandler import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.mdcWebCoroutineScope @@ -34,24 +37,43 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping(value = ["/api/v1/dictionary"]) +@Api( + value = "Resource dictionary", + description = "Interaction with stored dictionaries." +) open class ResourceDictionaryController(private val resourceDictionaryHandler: ResourceDictionaryHandler) { @GetMapping(path = ["/{name}"], produces = [MediaType.APPLICATION_JSON_VALUE]) + @ApiOperation( + value = "Retrieve a resource dictionary.", + notes = "Retrieve a resource dictionary by name provided.", + response = ResourceDictionary::class + ) @ResponseBody @Throws(BluePrintException::class) - suspend fun getResourceDictionaryByName(@PathVariable(value = "name") name: String): ResourceDictionary = + suspend fun getResourceDictionaryByName( + @ApiParam(value = "Name of the resource.", required = true, example = "\"hostname\"") + @PathVariable(value = "name") name: String + ): ResourceDictionary = mdcWebCoroutineScope { resourceDictionaryHandler.getResourceDictionaryByName(name) } @PostMapping( - path = [""], produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.APPLICATION_JSON_VALUE] ) + @ApiOperation( + value = "Saves a resource dictionary.", + notes = "Saves a resource dictionary by dictionary provided.", + response = ResourceDictionary::class + ) @ResponseBody @Throws(BluePrintException::class) - suspend fun saveResourceDictionary(@RequestBody dataDictionary: ResourceDictionary): ResourceDictionary = + suspend fun saveResourceDictionary( + @ApiParam(value = "Resource dictionary to store.", required = true) + @RequestBody dataDictionary: ResourceDictionary + ): ResourceDictionary = mdcWebCoroutineScope { resourceDictionaryHandler.saveResourceDictionary(dataDictionary) } @@ -61,15 +83,31 @@ open class ResourceDictionaryController(private val resourceDictionaryHandler: R produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.APPLICATION_JSON_VALUE] ) + @ApiOperation( + value = "Saves a resource dictionary.", + notes = "Saves a resource dictionary by resource definition provided.", + nickname = "ResourceDictionaryController_saveResourceDictionary_1_POST.org.onap.ccsdk.cds.blueprintsprocessor.designer.api", + response = ResourceDefinition::class + ) @ResponseBody @Throws(BluePrintException::class) - suspend fun saveResourceDictionary(@RequestBody resourceDefinition: ResourceDefinition): ResourceDefinition = + suspend fun saveResourceDictionary( + @ApiParam(value = "Resource definition to generate.", required = true) + @RequestBody resourceDefinition: ResourceDefinition + ): ResourceDefinition = mdcWebCoroutineScope { resourceDictionaryHandler.saveResourceDefinition(resourceDefinition) } @DeleteMapping(path = ["/{name}"]) - suspend fun deleteResourceDictionaryByName(@PathVariable(value = "name") name: String) = mdcWebCoroutineScope { + @ApiOperation( + value = "Removes a resource dictionary.", + notes = "Removes a resource dictionary by name provided." + ) + suspend fun deleteResourceDictionaryByName( + @ApiParam(value = "Name of the resource.", required = true) + @PathVariable(value = "name") name: String + ) = mdcWebCoroutineScope { resourceDictionaryHandler.deleteResourceDictionary(name) } @@ -78,26 +116,55 @@ open class ResourceDictionaryController(private val resourceDictionaryHandler: R produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.APPLICATION_JSON_VALUE] ) + @ApiOperation( + value = "Searches for a resource dictionary.", + notes = "Searches for a resource dictionary by names provided.", + responseContainer = "List", + response = ResourceDictionary::class + ) @ResponseBody - suspend fun searchResourceDictionaryByNames(@RequestBody names: List<String>): List<ResourceDictionary> = + suspend fun searchResourceDictionaryByNames( + @ApiParam(value = "List of names.", required = true) + @RequestBody names: List<String> + ): List<ResourceDictionary> = mdcWebCoroutineScope { resourceDictionaryHandler.searchResourceDictionaryByNames(names) } @GetMapping(path = ["/search/{tags}"], produces = [MediaType.APPLICATION_JSON_VALUE]) + @ApiOperation( + value = "Searches for a resource dictionary.", + notes = "Searches for a resource dictionary by tags provided.", + responseContainer = "List", + response = ResourceDictionary::class + ) @ResponseBody - suspend fun searchResourceDictionaryByTags(@PathVariable(value = "tags") tags: String): List<ResourceDictionary> = + suspend fun searchResourceDictionaryByTags( + @ApiParam(value = "Tags list.", required = true, example = "\"status\"") + @PathVariable(value = "tags") tags: String + ): List<ResourceDictionary> = mdcWebCoroutineScope { resourceDictionaryHandler.searchResourceDictionaryByTags(tags) } @GetMapping(path = ["/source-mapping"], produces = [MediaType.APPLICATION_JSON_VALUE]) + @ApiOperation( + value = "Searches for a source mapping.", + notes = "Searches for a source mapping.", + response = ResourceSourceMapping::class + ) @ResponseBody suspend fun getResourceSourceMapping(): ResourceSourceMapping = mdcWebCoroutineScope { resourceDictionaryHandler.getResourceSourceMapping() } @GetMapping(path = ["/resource_dictionary_group"], produces = [MediaType.APPLICATION_JSON_VALUE]) + @ApiOperation( + value = "Retrieve all resource dictionary groups.", + notes = "Retrieve all resource dictionary groups.", + responseContainer = "List", + response = String::class + ) @ResponseBody suspend fun getResourceDictionaryDistinct(): List<String> = mdcWebCoroutineScope { resourceDictionaryHandler.getResourceDictionaryDistinct() diff --git a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/domain/ResourceDictionary.kt b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/domain/ResourceDictionary.kt index eaa63ddee..5dac6b5e5 100644 --- a/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/domain/ResourceDictionary.kt +++ b/ms/blueprintsprocessor/modules/inbounds/designer-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/designer/api/domain/ResourceDictionary.kt @@ -17,6 +17,7 @@ package org.onap.ccsdk.cds.blueprintsprocessor.designer.api.domain import com.fasterxml.jackson.annotation.JsonFormat +import io.swagger.annotations.ApiModel import io.swagger.annotations.ApiModelProperty import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceDefinition import org.springframework.data.annotation.LastModifiedDate @@ -40,40 +41,42 @@ import javax.persistence.TemporalType * @version 1.0 */ @EntityListeners(AuditingEntityListener::class) +@ApiModel @Entity @Table(name = "RESOURCE_DICTIONARY") class ResourceDictionary : Serializable { @Id @Column(name = "name", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Name", required = true, example = "\"sample-db-source\"") lateinit var name: String @Column(name = "data_type", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Data type", required = true, example = "\"string\"") lateinit var dataType: String @Column(name = "entry_schema") + @ApiModelProperty(value = "Entry schema", required = true, example = "\"dt-license-key\"") var entrySchema: String? = null @Column(name = "resource_dictionary_group") - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Resource dictionary group", required = true, example = "\"default\"") var resourceDictionaryGroup: String? = null @Lob @Convert(converter = JpaResourceDefinitionConverter::class) @Column(name = "definition", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Definition", required = true) lateinit var definition: ResourceDefinition @Lob @Column(name = "description", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Description", required = true, example = "\"demo_artifacts_version\"") lateinit var description: String @Lob @Column(name = "tags", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Tags", required = true, example = "\"hostname\"") lateinit var tags: String @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") @@ -83,7 +86,7 @@ class ResourceDictionary : Serializable { var creationDate: Date? = null @Column(name = "updated_by", nullable = false) - @ApiModelProperty(required = true) + @ApiModelProperty(value = "Updated by", required = true, example = "\"username\"") lateinit var updatedBy: String override fun toString(): String { diff --git a/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/ResourceController.kt b/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/ResourceController.kt index e7c11e306..3c18ba4f9 100644 --- a/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/ResourceController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/ResourceController.kt @@ -38,7 +38,7 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/v1/resources") @Api( - value = "/api/v1/resources", + value = "Resources", description = "Interaction with resolved resources." ) open class ResourceController(private var resourceResolutionDBService: ResourceResolutionDBService) { @@ -116,8 +116,7 @@ open class ResourceController(private var resourceResolutionDBService: ResourceR ) @ApiOperation( value = "Delete resources using resolution key", - notes = "Delete all the resources associated to a resolution-key using blueprint metadata, artifact name and the resolution-key.", - produces = MediaType.APPLICATION_JSON_VALUE + notes = "Delete all the resources associated to a resolution-key using blueprint metadata, artifact name and the resolution-key." ) @PreAuthorize("hasRole('USER')") fun deleteByBlueprintNameAndBlueprintVersionAndArtifactNameAndResolutionKey( @@ -148,8 +147,7 @@ open class ResourceController(private var resourceResolutionDBService: ResourceR ) @ApiOperation( value = "Fetch a resource value using resolution key.", - notes = "Retrieve a stored resource value using the blueprint metadata, artifact name, resolution-key along with the name of the resource value to retrieve.", - produces = MediaType.APPLICATION_JSON_VALUE + notes = "Retrieve a stored resource value using the blueprint metadata, artifact name, resolution-key along with the name of the resource value to retrieve." ) @ResponseBody @PreAuthorize("hasRole('USER')") diff --git a/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/TemplateController.kt b/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/TemplateController.kt index b56a63b17..b80e81ca0 100644 --- a/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/TemplateController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/resource-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/resource/api/TemplateController.kt @@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/v1/template") @Api( - value = "/api/v1/template", + value = "Resource template", description = "Interaction with resolved template." ) open class TemplateController(private val templateResolutionService: TemplateResolutionService) { @@ -146,8 +146,7 @@ open class TemplateController(private val templateResolutionService: TemplateRes value = "Store a resolved template w/ resolution-key", notes = "Store a template for a given CBA's action, identified by its blueprint name, blueprint version, " + "artifact name and resolution key.", - response = TemplateResolution::class, - produces = MediaType.APPLICATION_JSON_VALUE + response = TemplateResolution::class ) @ResponseBody @PreAuthorize("hasRole('USER')") @@ -178,8 +177,7 @@ open class TemplateController(private val templateResolutionService: TemplateRes value = "Store a resolved template w/ resourceId and resourceType", notes = "Store a template for a given CBA's action, identified by its blueprint name, blueprint version, " + "artifact name, resourceId and resourceType.", - response = TemplateResolution::class, - produces = MediaType.APPLICATION_JSON_VALUE + response = TemplateResolution::class ) @ResponseBody @PreAuthorize("hasRole('USER')") diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt index 0146358a8..464ae8ddc 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt @@ -17,12 +17,14 @@ package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.coroutineScope import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceOutput import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.Status import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException +import org.onap.ccsdk.cds.controllerblueprints.core.MDCContext import org.onap.ccsdk.cds.controllerblueprints.core.asGraph import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty import org.onap.ccsdk.cds.controllerblueprints.core.data.EdgeLabel @@ -35,6 +37,7 @@ import org.onap.ccsdk.cds.controllerblueprints.core.service.NodeExecuteMessage import org.onap.ccsdk.cds.controllerblueprints.core.service.NodeSkipMessage import org.onap.ccsdk.cds.controllerblueprints.core.service.WorkflowExecuteMessage import org.springframework.stereotype.Service +import kotlin.coroutines.CoroutineContext @Service("imperativeWorkflowExecutionService") class ImperativeWorkflowExecutionService( @@ -54,14 +57,21 @@ class ImperativeWorkflowExecutionService( val graph = bluePrintContext.workflowByName(workflowName).asGraph() - return ImperativeBluePrintWorkflowService(nodeTemplateExecutionService) - .executeWorkflow(graph, bluePrintRuntimeService, executionServiceInput) + return coroutineScope { + ImperativeBluePrintWorkflowService( + nodeTemplateExecutionService, + this.coroutineContext[MDCContext] + ) + }.let { it.executeWorkflow(graph, bluePrintRuntimeService, executionServiceInput) } } } -open class ImperativeBluePrintWorkflowService(private val nodeTemplateExecutionService: NodeTemplateExecutionService) : +open class ImperativeBluePrintWorkflowService(private val nodeTemplateExecutionService: NodeTemplateExecutionService, private val mdcContext: CoroutineContext?) : AbstractBluePrintWorkFlowService<ExecutionServiceInput, ExecutionServiceOutput>() { + final override val coroutineContext: CoroutineContext + get() = mdcContext?.let { super.coroutineContext + it } ?: super.coroutineContext + val log = logger(ImperativeBluePrintWorkflowService::class) lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*> |