export const ResourceDictionaryURLs = {
saveResourceDictionary: '/resourcedictionary/save',
searchResourceDictionaryByTags: '/resourcedictionary/search',
- searchResourceDictionaryByName: ''
+ searchResourceDictionaryByName: '',
+ getSources: '/resourcedictionary/source-mapping',
+ getModelType: '/resourcedictionary/model-type'
}
\ No newline at end of file
--- /dev/null
+<!--
+============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============================================
+-->
+<form class="search-form" [formGroup]="myControl">
+ <mat-form-field class="search-full-width">
+ <input #resourceSelect type="text" [(ngModel)]="searchText" placeholder="Search Resources" matInput [matAutocomplete]="auto" formControlName="search_input">
+ <button matSuffix mat-icon-button (click)="fetchResourceByName()"><mat-icon>search</mat-icon></button>
+ <mat-autocomplete #auto="matAutocomplete">
+ <mat-option (click)="selected(option)" *ngFor="let option of options" [value]="option.tags">
+ {{option.tags}}
+ </mat-option>
+ </mat-autocomplete>
+ </mat-form-field>
+</form>
\ No newline at end of file
--- /dev/null
+/*
+============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============================================
+*/
\ No newline at end of file
--- /dev/null
+/*
+============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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SearchFromDatabaseComponent } from './search-from-database.component';
+
+describe('SearchFromDatabaseComponent', () => {
+ let component: SearchFromDatabaseComponent;
+ let fixture: ComponentFixture<SearchFromDatabaseComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ SearchFromDatabaseComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(SearchFromDatabaseComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
--- /dev/null
+/*
+============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 { Component, OnInit, ViewChild, EventEmitter, Output } from '@angular/core';
+import { FormBuilder, FormGroup, Validators} from '@angular/forms';
+import { SearchTemplateService } from '../search-template.service';
+import { MatAutocompleteTrigger } from '@angular/material';
+import { SearchPipe } from 'src/app/common/shared/pipes/search.pipe';
+@Component({
+ selector: 'app-search-from-database',
+ templateUrl: './search-from-database.component.html',
+ styleUrls: ['./search-from-database.component.scss']
+})
+export class SearchFromDatabaseComponent implements OnInit {
+
+ myControl: FormGroup;
+ @Output() resourcesData = new EventEmitter();
+ options: any[] = [];
+ @ViewChild('resourceSelect', { read: MatAutocompleteTrigger }) resourceSelect: MatAutocompleteTrigger;
+
+ searchText: string = '';
+ constructor(private _formBuilder: FormBuilder,
+ private existingModelService: SearchTemplateService) { }
+
+ ngOnInit() {
+ this.myControl = this._formBuilder.group({
+ search_input: ['', Validators.required]
+ });
+ }
+ selected(value){
+ this.resourcesData.emit(value);
+ }
+
+ fetchResourceByName() {
+ this.existingModelService.searchByTags("/searchByTags/",this.searchText)
+ .subscribe(data=>{
+ console.log(data);
+ data.forEach(element => {
+ this.options.push(element)
+ });
+ this.resourceSelect.openPanel();
+ }, error=>{
+ window.alert('error' + error);
+ })
+ }
+
+}
</div>
</div>
<div *ngIf="optionSelected==2">
- <form class="search-form" [formGroup]="myControl">
- <mat-form-field class="search-full-width">
- <input #resourceSelect type="text" [(ngModel)]="searchText" placeholder="Search Resources" matInput [matAutocomplete]="auto" formControlName="search_input">
- <button matSuffix mat-icon-button (click)="fetchResourceByName()"><mat-icon>search</mat-icon></button>
- <!-- <mat-autocomplete #auto="matAutocomplete">
- <mat-option (click)="selected(option)" *ngFor="let option of options | search : searchText" [value]="option.tags">
- {{option.tags}}
- </mat-option>
- </mat-autocomplete> -->
- </mat-form-field>
- </form>
+ <app-search-from-database></app-search-from-database>
</div>
\ No newline at end of file
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { MatAutocompleteTrigger } from '@angular/material';
+
@Component({
selector: 'app-search-template',
templateUrl: './search-template.component.html',
--- /dev/null
+/*
+============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 { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { SearchFromDatabaseComponent } from './search-from-database/search-from-database.component';
+import { SearchTemplateComponent } from './search-template.component';
+import { ReactiveFormsModule } from '@angular/forms';
+import { AppMaterialModule } from 'src/app/common/modules/app-material.module';
+import { SharedModule} from 'src/app/common/shared/shared.module';
+@NgModule({
+ declarations: [
+ SearchTemplateComponent,
+ SearchFromDatabaseComponent],
+ imports: [
+ CommonModule,
+ ReactiveFormsModule,
+ AppMaterialModule,
+ SharedModule
+ ],
+ exports:[
+ SearchTemplateComponent,
+ SearchFromDatabaseComponent
+ ]
+})
+export class SearchTemplateModule { }
import { SelectTemplateComponent } from './select-template.component';
import { SelectTemplateRoutingModule } from './select-template-routing.module';
import { AppMaterialModule } from 'src/app/common/modules/app-material.module';
+import { SearchTemplateModule} from './search-template/search-template.module';
@NgModule({
declarations: [
TemplateOptionsComponent,
- SearchTemplateComponent,
- MetadataComponent,
- SelectTemplateComponent
+ MetadataComponent,
+ SelectTemplateComponent
],
exports: [
TemplateOptionsComponent,
CommonModule,
SelectTemplateRoutingModule,
ReactiveFormsModule,
- AppMaterialModule
+ AppMaterialModule,
+ SearchTemplateModule
]
})
export class SelectTemplateModule { }
*/-->
-<button disabled style="opacity: 0.5;" (click) ="changeView()" class="toggle-view-btn">{{viewText}}</button>
+<button (click) ="changeView()" class="toggle-view-btn">{{viewText}}</button>
<br><br>
-<div *ngIf="designerMode">
+<!-- <div *ngIf="designerMode"> -->
+<div [hidden] = "!designerMode">
<mat-card class="metadata-card">
<mat-card-header>
<mat-card-title>Resource Metadata</mat-card-title>
</mat-card>
</div>
-<div *ngIf="editorMode">
+<!-- <div *ngIf="editorMode"> -->
+<div [hidden] = "!editorMode">
<json-editor class="jsoneditor" *ngIf="editorMode" [options]="options" [data]="resources" on-change="onChange($event)"></json-editor>
</div>
saveResource(resource) {
return this.api.post(ResourceDictionaryURLs.saveResourceDictionary, resource);
}
+
+ getSources() {
+ // to do
+ return this.api.get('ResourceDictionaryURLs.getSources');
+ }
+
+ getModelType(name) {
+ // to do
+ return this.api.get("ResourceDictionaryURLs.getModelType + '/' + name");
+ }
}
\ No newline at end of file
class="sources-list"
(cdkDropListDropped)="drop($event)">
<div class="sources-box" *ngFor="let item of sourcesOptions;let i = index" cdkDrag>
- <mat-expansion-panel class="expansion-panel">
+ <mat-expansion-panel class="expansion-panel" (opened)="selected(item)">
<mat-expansion-panel-header>
<mat-panel-title>
- {{item}}
+ {{item.name}}
</mat-panel-title>
</mat-expansion-panel-header>
- <json-editor [options]="options" [data]="selected(item)" on-change="onChange(item,$event)"></json-editor>
+ <json-editor [options]="options" [data]="item.data" on-change="onChange(item,$event)"></json-editor>
</mat-expansion-panel>
<button matSuffix mat-icon-button (click)="delete(item,i)"><mat-icon class="icon">delete</mat-icon></button>
</div>
<h3>Source Options</h3>
<mat-form-field>
<input [(ngModel)]="searchText" type="input" matInput placeholder="search sources">
- <button matSuffix mat-icon-button><mat-icon>search</mat-icon></button>
+ <button matSuffix mat-icon-button (click)="getResources()"><mat-icon>search</mat-icon></button>
<mat-hint>db,mdsal,input,default,..</mat-hint>
</mat-form-field>
<br><br>
[cdkDropListData]="option"
class="options-list"
(cdkDropListDropped)="drop($event)">
- <div class="options-box" *ngFor="let item of option | search :searchText" cdkDrag>{{item}}</div>
+ <div class="options-box" *ngFor="let item of option | search :searchText" cdkDrag>{{item.name}}</div>
</div>
</div>
<div>
import { LoadResourcesSuccess } from 'src/app/common/core/store/actions/resources.action';
import { ISourcesData } from 'src/app/common/core/store/models/sourcesData.model';
import { JsonEditorComponent, JsonEditorOptions } from 'ang-jsoneditor';
+import { ResourceEditService } from '../resource-edit.service';
@Component({
selector: 'app-sources-template',
options = new JsonEditorOptions();
rdState: Observable<IResourcesState>;
resources: IResources;
- option = ['mdsal','default'];
+ option = [];
sources:ISourcesData;
sourcesOptions = [];
- sourcesData = [];
+ sourcesData = {};
@Output() resourcesData = new EventEmitter();
- constructor(private store: Store<IAppState>) {
+ constructor(private store: Store<IAppState>, private apiService: ResourceEditService) {
this.rdState = this.store.select('resources');
this.options.mode = 'text';
this.options.modes = [ 'text', 'tree', 'view'];
this.resources.sources = Object.assign({},originalSources);
};
- selected(value){
- this.sourcesData=this.sources[value];
- return this.sourcesData;
- }
+ selected(sourceValue){
+ this.sourcesData= [];//this.sources[value];
+ this.apiService.getModelType(sourceValue.value)
+ .subscribe(data=>{
+ console.log(data);
+ data.forEach(item =>{
+ if(typeof(item)== "object") {
+ for (let key1 in item) {
+ if(key1 == 'properties') {
+ let newPropOnj = {}
+ for (let key2 in item[key1]) {
+ console.log(item[key1][key2]);
+ let varType = item[key1][key2].type
+ // let property : varType =
+ newPropOnj[key2] = item[key1][key2];
+ }
+ }
+ }
+ }
+ });
+ this.sourcesData = data;
+ this.sourcesOptions.forEach(item=>{
+ if(item.name == sourceValue.name) {
+ item.data = data;
+ }
+ })
+ return this.sourcesData;
+ })
+}
delete(item,i){
if(confirm("Are sure you want to delete this source ?")) {
}) resourceDictionaryList: JSON): Promise<any> {
return await this.rdservice.searchbyNames(resourceDictionaryList);
}
+
+ @get('/resourcedictionary/model-type/{source}', {
+ responses: {
+ '200': {
+ content: { 'application/json': {} },
+ },
+ },
+ })
+ async getmodelType(@param.path.string('source') source: string) {
+ return await this.rdservice.getModelType(source);
+ }
}
"functions": {
"searchbyNames": ["resourceDictionaryList"]
+ }
+ },
+ ,
+ {
+ "template": {
+ "method": "GET",
+ "url": controllerApiConfig.http.url + "/model-type/{source}",
+ "headers": {
+ "accepts": "application/json",
+ "content-type": "application/json",
+ "authorization": controllerApiConfig.http.authToken
+ },
+ "responsePath": "$.*"
+ },
+ "functions": {
+ "getModelType": ["source"]
+
}
}
]
getSourceMapping(): Promise<JSON>;
getByTags(tags: string): Promise<JSON>;
save(resourceDictionary: JSON): Promise<JSON>;
- searchbyNames(resourceDictionaryList: JSON): Promise<JSON>;
+ searchbyNames(resourceDictionaryList: JSON): Promise<JSON>;
+ getModelType(source: string): Promise<JSON>;
}
export class ResourceDictionaryServiceProvider implements Provider<ResourceDictionaryService> {
# Copyright (c) 2019 Bell Canada.
+# Modifications Copyright (c) 2018 - 2019 IBM, Bell Canada.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
self.component_function = component_function
def resolve_and_generate_message_from_template_prefix(self, artifact_prefix):
- return self.component_function.resolveAndGenerateMessage(artifact_prefix)
+ return self.component_function.contentFromResolvedArtifact(artifact_prefix)
def resolve_and_generate_message(self, artifact_mapping, artifact_template):
return self.component_function.resolveAndGenerateMessage(artifact_mapping,
artifact_template)
def retrieve_resolved_template_from_database(self, key, artifact_template):
- return self.component_function.resolveFromDatabase(key, artifact_template)
+ return self.component_function.storedContentFromResolvedArtifact(key, artifact_template)
.. toctree::
:maxdepth: 1
-resourceDefintionCode
+ resourcedefinitioncodesnip
Resource source:
.. _Resource: https://wiki.onap.org/display/DW/Modeling+Concepts#ModelingConcepts-NodeResourceSource
-.. |image0| image:: media/mandatory.jpg
+.. |image0| image:: media/mandatory.JPG
:width: 7.88889in
:height: 4.43750in
-.. |image1| image:: media/optional.jpg
+.. |image1| image:: media/optional.JPG
:width: 7.88889in
:height: 4.43750in
\ No newline at end of file
source-input:
+.. code: json
+print("
"description": "This is Input Resource Source Node Type",
"version": "1.0.0",
"properties": {},
"derived_from": "tosca.nodes.ResourceSource"
+")
Default:
|image0|
-.. |image0| image:: media/sqltable.jpg
+.. |image0| image:: media/sqltable.JPG
:width: 7.88889in
:height: 4.43750in
.. toctree::
:maxdepth: 1
-sourceprimarydbcode
+ sourceprimarydbcode
Connection to a specific database can be expressed through the endpoint-selector property, which refers to a macro defining the information about the database the connect to. Understand TOSCA Macro in the context of CDS.
.. toctree::
:maxdepth: 1
-dbsystemcode
+ dbsystemcode
REST:
|image1|
-.. |image1| image:: media/resttable.jpg
+.. |image1| image:: media/resttable.JPG
:width: 7.88889in
:height: 4.43750in
|image2|
-.. |image2| image:: media/capabilitytable.jpg
+.. |image2| image:: media/capabilitytable.JPG
:width: 7.88889in
:height: 4.43750in
.. toctree::
:maxdepth: 1
- sourcecapabilitycode
+ sourcecapabilitycode
Complex Type:
=============
.. toctree::
:maxdepth: 1
- complexResponse
+ complexResponse
What is of interest is the address and id fields. For the process to return these two values, we need to create a custom data-type, as bellow
.. toctree::
:maxdepth: 1
- dt-netbox-ip
+ dt-netbox-ip
The type of the data dictionary will be dt-netbox-ip.
.. toctree::
:maxdepth: 1
-create_netbox_ip_address
\ No newline at end of file
+ create_netbox_ip_address
\ No newline at end of file
This microservice is used to deploy Controller Blueprint Archive file in Run time database. This also helps to test the Valid Blueprint.
Architecture:
-==============
+-------------
|image0|
:width: 800px
Running Blueprints Processor Microservice Locally:
-==================================================
+--------------------------------------------------
The purpose of this page is to show how to run the Blueprints Processor microservice locally, using the docker-compose.yaml file provided in the project.
mvn clean install -Pdocker
Start Docker containers using docker-composer:
-==============================================
+----------------------------------------------
Navigate to the docker-compose file in the distribution module:
Testing the environment:
-========================
+------------------------
Point your browser to http://localhost:8000/api/v1/execution-service/ping (please note that the port is 8000, not 8080)
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.
Then the content within this element is fully based on the workflow input and output.
+.. toctree::
+ :maxdepth: 1
+
+ dynamicapi
Enrichment:
-===========
+-----------
Helps to generate complete valid CBA file.
-
+.. toctree::
+ :maxdepth: 1
+
+ enrichment
\ No newline at end of file
--- /dev/null
+.. This work is licensed under a Creative Commons Attribution 4.0
+.. International License. http://creativecommons.org/licenses/by/4.0
+.. Copyright (C) 2019 IBM.
+
+Expression
+==========
+
+TOSCA provides for a set of functions to reference elements within the template or to retrieve runtime values.
+
+Below is a list of supported expressions
+
+get_input
+---------
+
+The get_input function is used to retrieve the values of properties declared within the inputs section of a TOSCA Service Template.
+
+http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454178
+
+get_property
+------------
+
+The get_property function is used to retrieve property values between modelable entities defined in the same service template.
+
+http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454178
+
+get_attribute
+-------------
+
+The get_attribute function is used to retrieve the values of named attributes declared by the referenced node or relationship template name.
+
+http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454179
+
+get_operation_output
+--------------------
+
+The get_operation_output function is used to retrieve the values of variables exposed / exported from an interface operation.
+
+http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454180
+
+get_artifact
+------------
+
+The get_artifact function is used to retrieve artifact location between modelable entities defined in the same service template.
+
+http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454182
--- /dev/null
+.. This work is licensed under a Creative Commons Attribution 4.0
+.. International License. http://creativecommons.org/licenses/by/4.0
+.. Copyright (C) 2019 IBM.
+
+Workflow
+========
+
+A workflow defines an overall action to be taken on the service, hence is an entry-point for the run-time execution of the CBA package.
+
+A workflow also defines inputs and outputs that will defined the payload contract of the request and response (see Dynamic API)
+
+A workflow can be composed of one or multiple sub-actions to execute.
+
+A CBA package can have as many workflows as needed.
+
+Single action
+-------------
+
+The workflow is directly backed by a node_template of type tosca.nodes.Component
+
+Multiple sub-actions
+--------------------
+The workflow is backed by Directed Graph engine, node_template of type dg-generic, and are imperative workflows.
+
+A DG used as workflow for CDS is composed of multiple execute nodes; each individual execute node refers to a plugin, that is a node_template of type tosca.nodes.Component.
+
+Below the properties of a workflow:
+
+
+
+Workflow Example
+----------------
+
+.. code:: json
+
+print("
+{
+ "workflow": {
+ "resource-assignment": { <- workflow-name
+ "inputs": {
+ "vnf-id": { <- static inputs
+ "required": true,
+ "type": "string"
+ },
+ "resource-assignment-properties": { <- dynamic inputs
+ "required": true,
+ "type": "dt-resource-assignment-properties"
+ }
+ },
+ "steps": {
+ "call-resource-assignment": { <- step-name
+ "description": "Resource Assignment Workflow",
+ "target": "resource-assignment-process" <- node_template targeted by the step
+ }
+ },
+ "outputs": {
+ "template-properties": { <- output
+ "type": "json", <- complex type
+ "value": {
+ "get_attribute": [ <- uses expression to retrieve attribute from context
+ "resource-assignment",
+ "assignment-params"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
+")
+
+
+TOSCA definition: http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454203
\ No newline at end of file
/*
* Copyright © 2019 IBM.
+ * Modifications Copyright © 2018 - 2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
private fun AbstractComponentFunction.netconfDeviceInfo(capabilityProperty: MutableMap<String, JsonNode>): DeviceInfo {
return JacksonUtils.getInstanceFromMap(capabilityProperty, DeviceInfo::class.java)
-}
\ No newline at end of file
+}
+
+/**
+ * Blocking Methods called from Jython Scripts
+ */
\ No newline at end of file
package org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution
+import com.fasterxml.jackson.databind.JsonNode
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.db.TemplateResolutionService
import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.processor.ResourceAssignmentProcessor
import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
-import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty
+import org.onap.ccsdk.cds.controllerblueprints.core.*
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeService
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintTemplateService
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
resolutionKey: String): String
suspend fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String,
- artifactNames: List<String>, properties: Map<String, Any>): MutableMap<String, String>
+ artifactNames: List<String>, properties: Map<String, Any>): MutableMap<String, JsonNode>
suspend fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String,
artifactPrefix: String, properties: Map<String, Any>): String
override suspend fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String,
artifactNames: List<String>,
- properties: Map<String, Any>): MutableMap<String, String> {
+ properties: Map<String, Any>): MutableMap<String, JsonNode> {
val resourceAssignmentRuntimeService =
ResourceAssignmentUtils.transformToRARuntimeService(bluePrintRuntimeService, artifactNames.toString())
- val resolvedParams: MutableMap<String, String> = hashMapOf()
+ val resolvedParams: MutableMap<String, JsonNode> = hashMapOf()
artifactNames.forEach { artifactName ->
val resolvedContent = resolveResources(resourceAssignmentRuntimeService, nodeTemplateName,
artifactName, properties)
- resolvedParams[artifactName] = resolvedContent
+
+ resolvedParams[artifactName] = resolvedContent.asJsonType()
+
}
return resolvedParams
}
import org.onap.ccsdk.cds.controllerblueprints.core.config.BluePrintPathConfiguration
import org.onap.ccsdk.cds.controllerblueprints.core.data.ErrorCode
import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintValidatorService
+import org.onap.ccsdk.cds.controllerblueprints.core.scripts.BluePrintCompileCache
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintFileUtils
import org.onap.ccsdk.cds.controllerblueprints.db.resources.BlueprintCatalogServiceImpl
import org.slf4j.LoggerFactory
import org.springframework.dao.DataIntegrityViolationException
private val log = LoggerFactory.getLogger(BlueprintProcessorCatalogServiceImpl::class.toString())
override suspend fun delete(name: String, version: String) {
+ // Clean blueprint script cache
+ val cacheKey = BluePrintFileUtils
+ .compileCacheKey(normalizedPathName(bluePrintPathConfiguration.blueprintDeployPath, name, version))
+ BluePrintCompileCache.cleanClassLoader(cacheKey)
+ log.info("removed cba file name($name), version($version) from cache")
// Cleaning Deployed Blueprint
deleteNBDir(bluePrintPathConfiguration.blueprintDeployPath, name, version)
log.info("removed cba file name($name), version($version) from deploy location")
// Cleaning Data Base
blueprintModelRepository
- .deleteByArtifactNameAndArtifactVersion(name, version)
+ .deleteByArtifactNameAndArtifactVersion(name, version)
log.info("removed cba file name($name), version($version) from database")
}
val deployFile = normalizedFile(bluePrintPathConfiguration.blueprintDeployPath, name, version)
val cbaFile = normalizedFile(bluePrintPathConfiguration.blueprintArchivePath,
- UUID.randomUUID().toString(), "cba.zip")
+ UUID.randomUUID().toString(), "cba.zip")
if (extract && deployFile.exists()) {
log.info("cba file name($name), version($version) already present(${deployFile.absolutePath})")
log.info("Overwriting blueprint model :$artifactName::$artifactVersion")
blueprintModelRepository.deleteByArtifactNameAndArtifactVersion(artifactName, artifactVersion)
val deployFile =
- normalizedPathName(bluePrintPathConfiguration.blueprintDeployPath, artifactName, artifactVersion)
+ normalizedPathName(bluePrintPathConfiguration.blueprintDeployPath, artifactName, artifactVersion)
deleteNBDir(deployFile).let {
if (it) log.info("Deleted deployed blueprint model :$artifactName::$artifactVersion")
else log.info("Fail to delete deployed blueprint model :$artifactName::$artifactVersion")
}
BluePrintConstants.SCRIPT_KOTLIN -> {
val bluePrintScriptsService: BluePrintScriptsService = BluePrintScriptsServiceImpl()
- scriptComponent = bluePrintScriptsService.scriptInstance<T>(bluePrintContext, scriptClassReference, false)
+ scriptComponent = bluePrintScriptsService.scriptInstance<T>(bluePrintContext.rootPath,
+ bluePrintContext.name(), bluePrintContext.version(), scriptClassReference, false)
}
BluePrintConstants.SCRIPT_JYTHON -> {
scriptComponent = blueprintJythonService.jythonComponentInstance(bluePrintContext, scriptClassReference) as T
<repository>
<id>spring-libs-milestone</id>
<name>Spring Milestone Maven Repository</name>
+ <url>http://oss.jfrog.org/artifactory/oss-release-local/</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>spring-libs-milestone-snapshot</id>
+ <name>Spring Milestone Maven Repository - snapshots</name>
<url>http://oss.jfrog.org/artifactory/oss-snapshot-local/</url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
</repository>
</repositories>
import com.fasterxml.jackson.databind.node.*
import org.apache.commons.lang3.ObjectUtils
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+import org.slf4j.LoggerFactory
import org.slf4j.helpers.MessageFormatter
import kotlin.reflect.KClass
* @author Brinda Santh
*/
+fun <T : Any> logger(clazz: T) = LoggerFactory.getLogger(clazz.javaClass)!!
+
+fun <T : KClass<*>> logger(clazz: T) = LoggerFactory.getLogger(clazz.java)!!
+
+
fun <T : Any> T.bpClone(): T {
return ObjectUtils.clone(this)
}
return if (isNotEmpty(value)) value!! else ""
}
+inline fun <reified T : JsonNode> T.isComplexType(): Boolean {
+ return this is ObjectNode || this is ArrayNode
+}
+
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Modifications Copyright © 2018 - 2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
val modelableEntityName: String = "SELF",
val interfaceName: String,
val operationName: String,
- val propertyName: String
+ val propertyName: String,
+ var subPropertyName: String? = null
)
data class DSLExpression(
lateinit var csarVersion: String
lateinit var createdBy: String
lateinit var entityDefinitions: String
+ var templateName: String? = null
+ var templateVersion: String? = null
var templateTags: String? = null
}
--- /dev/null
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file 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.
+ */
+
+package org.onap.ccsdk.cds.controllerblueprints.core.interfaces
+
+import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate
+
+interface BluePrintDefinitions {
+
+ /** Define the service Template Model */
+ fun serviceTemplate(): ServiceTemplate
+
+ /** Load Custom Definitions that may used during runtime **/
+ fun loadOtherDefinitions()
+
+ /** Utility Method to add the definition */
+ fun addOtherDefinition(key: String, definition: Any)
+
+ /** Utility method to get the definition */
+ fun <T : Any> otherDefinition(key: String): T
+
+ fun otherDefinitions(): MutableMap<String, Any>
+}
+
+abstract class AbstractBluePrintDefinitions : BluePrintDefinitions {
+
+ private val otherDefinitionMap: MutableMap<String, Any> = hashMapOf()
+
+ constructor() {
+ loadOtherDefinitions()
+ }
+
+ override fun loadOtherDefinitions() {
+ }
+
+ override fun <T : Any> otherDefinition(key: String): T {
+ return otherDefinitionMap[key] as T
+ }
+
+ override fun addOtherDefinition(key: String, definition: Any) {
+ otherDefinitionMap[key] = definition
+ }
+
+ override fun otherDefinitions(): MutableMap<String, Any> {
+ return otherDefinitionMap
+ }
+
+}
\ No newline at end of file
package org.onap.ccsdk.cds.controllerblueprints.core.interfaces
-import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
+import org.onap.ccsdk.cds.controllerblueprints.core.scripts.BluePrintSourceCode
interface BluePrintScriptsService {
- suspend fun <T> scriptInstance(blueprintContext: BluePrintContext, scriptClassName: String,
- reCompile: Boolean): T
+ suspend fun <T> scriptInstance(bluePrintSourceCode: BluePrintSourceCode, scriptClassName: String): T
+
+ suspend fun <T> scriptInstance(blueprintBasePath: String, artifactName: String, artifactVersion: String,
+ scriptClassName: String, reCompile: Boolean): T
+
+ suspend fun <T> scriptInstance(blueprintBasePath: String, scriptClassName: String, reCompile: Boolean): T
+
+ suspend fun <T> scriptInstance(cacheKey: String, scriptClassName: String): T
suspend fun <T> scriptInstance(scriptClassName: String): T
}
\ No newline at end of file
package org.onap.ccsdk.cds.controllerblueprints.core.scripts
-import java.io.File
import java.io.Serializable
-import java.net.URL
-import java.net.URLClassLoader
import kotlin.reflect.KClass
import kotlin.script.experimental.api.*
-open class BluePrintCompiledScript<out JarFile : File>(
- private val scriptCompilationConfiguration: ScriptCompilationConfiguration,
- private val compiledJar: File) :
- CompiledScript<JarFile>, Serializable {
+open class BluePrintCompiledScript<out BCS : String>(
+ val cacheKey: String,
+ val scriptCompilationConfiguration: ScriptCompilationConfiguration) :
+ CompiledScript<BCS>, Serializable {
lateinit var scriptClassFQName: String
override val compilationConfiguration: ScriptCompilationConfiguration
get() = scriptCompilationConfiguration
- override suspend fun getClass(scriptEvaluationConfiguration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<KClass<*>> = try {
+ override suspend fun getClass(scriptEvaluationConfiguration: ScriptEvaluationConfiguration?)
+ : ResultWithDiagnostics<KClass<*>> = try {
- val baseClassLoader = Thread.currentThread().contextClassLoader
-
- val urls = arrayListOf<URL>()
- urls.add(compiledJar.toURI().toURL())
- val classLoaderWithDependencies = URLClassLoader(urls.toTypedArray(), baseClassLoader)
+ /** Get the class loader from the cache */
+ val classLoaderWithDependencies = BluePrintCompileCache.classLoader(cacheKey)
val clazz = classLoaderWithDependencies.loadClass(scriptClassFQName).kotlin
clazz.asSuccess()
--- /dev/null
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file 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.
+ */
+
+package org.onap.ccsdk.cds.controllerblueprints.core.scripts
+
+import com.google.common.cache.CacheBuilder
+import com.google.common.cache.CacheLoader
+import com.google.common.cache.LoadingCache
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
+import org.onap.ccsdk.cds.controllerblueprints.core.logger
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedFile
+import java.net.URL
+import java.net.URLClassLoader
+
+
+object BluePrintCompileCache {
+ val log = logger(BluePrintCompileCache::class)
+
+ private val classLoaderCache: LoadingCache<String, URLClassLoader> = CacheBuilder.newBuilder()
+ .maximumSize(10)
+ .build(BluePrintClassLoader)
+
+ fun classLoader(key: String): URLClassLoader {
+ return classLoaderCache.get(key)
+ }
+
+ fun cleanClassLoader(key: String) {
+ classLoaderCache.invalidate(key)
+ log.info("Cleaned script cache($key)")
+ }
+
+ fun hasClassLoader(key: String): Boolean {
+ return classLoaderCache.asMap().containsKey(key)
+ }
+}
+
+object BluePrintClassLoader : CacheLoader<String, URLClassLoader>() {
+
+ val log = logger(BluePrintClassLoader::class)
+
+ override fun load(key: String): URLClassLoader {
+ log.info("loading cache key($key)")
+ val keyPath = normalizedFile(key)
+ if (!keyPath.exists()) {
+ throw BluePrintException("failed to load cache($key), missing files.")
+ }
+ val urls = arrayListOf<URL>()
+ keyPath.walkTopDown()
+ .filter { it.name.endsWith("cba-kts.jar") }
+ .forEach {
+ log.debug("Adding (${it.absolutePath}) to cache key($key)")
+ urls.add(it.toURI().toURL())
+ }
+ return URLClassLoader(urls.toTypedArray(), this.javaClass.classLoader)
+ }
+}
\ No newline at end of file
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.config.*
+import org.onap.ccsdk.cds.controllerblueprints.core.checkFileExists
import org.slf4j.LoggerFactory
-import java.io.File
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
val compiledJarFile = blueprintSourceCode.targetJarFile
- if (!compiledJarFile.exists() || blueprintSourceCode.regenerate) {
+ /** Check cache is present for the blueprint scripts */
+ val hasCompiledCache = BluePrintCompileCache.hasClassLoader(blueprintSourceCode.cacheKey)
+
+ if (!compiledJarFile.exists() || blueprintSourceCode.regenerate || !hasCompiledCache) {
+ log.info("compiling for cache key(${blueprintSourceCode.cacheKey})")
var environment: KotlinCoreEnvironment? = null
try {
+ // Clean the cache, if present
+ if (hasCompiledCache) {
+ BluePrintCompileCache.cleanClassLoader(blueprintSourceCode.cacheKey)
+ }
+
val compilerConfiguration = CompilerConfiguration().apply {
put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
// Add all Kotlin Sources
addKotlinSourceRoots(blueprintSourceCode.blueprintKotlinSources)
+ // for Kotlin 1.3.30 greater
+ //add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ScriptingCompilerConfigurationComponentRegistrar())
languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, mapOf(AnalysisFlags.skipMetadataVersionCheck to true)
}
}
- val res = BluePrintCompiledScript<File>(scriptCompilationConfiguration, compiledJarFile)
+ checkFileExists(compiledJarFile) { "couldn't generate compiled jar(${compiledJarFile.absolutePath})" }
+
+ val compiledScript = BluePrintCompiledScript<String>(blueprintSourceCode.cacheKey, scriptCompilationConfiguration)
- return ResultWithDiagnostics.Success(res, messageCollector.diagnostics)
+ return compiledScript.asSuccess()
} catch (ex: Throwable) {
return failure(ex.asDiagnostics())
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
import org.slf4j.LoggerFactory
import java.util.*
+import kotlin.reflect.full.createInstance
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.BasicScriptingHost
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
open class BlueprintScriptingHost(evaluator: ScriptEvaluator) : BasicScriptingHost(blueprintScriptCompiler, evaluator) {
- override fun eval(
- script: SourceCode,
- scriptCompilationConfiguration: ScriptCompilationConfiguration,
- configuration: ScriptEvaluationConfiguration?
- ): ResultWithDiagnostics<EvaluationResult> =
+ override fun eval(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration,
+ configuration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<EvaluationResult> =
runInCoroutineContext {
- compiler(script, scriptCompilationConfiguration)
+ blueprintScriptCompiler(script, scriptCompilationConfiguration)
.onSuccess {
evaluator(it, configuration)
}.onFailure { failedResult ->
- val messages = failedResult.reports?.joinToString("\n")
+ val messages = failedResult.reports.joinToString("\n")
throw BluePrintProcessorException(messages)
}
}
private val log = LoggerFactory.getLogger(BluePrintScriptEvaluator::class.java)!!
- override suspend operator fun invoke(
- compiledScript: CompiledScript<*>,
- scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
+ override suspend operator fun invoke(compiledScript: CompiledScript<*>,
+ scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
): ResultWithDiagnostics<EvaluationResult> =
try {
log.debug("Getting script class name($scriptClassName) from the compiled sources ")
+
val bluePrintCompiledScript = compiledScript as BluePrintCompiledScript
bluePrintCompiledScript.scriptClassFQName = scriptClassName
- val res = compiledScript.getClass(scriptEvaluationConfiguration)
- when (res) {
- is ResultWithDiagnostics.Failure -> res
+ val classResult = compiledScript.getClass(scriptEvaluationConfiguration)
+ when (classResult) {
+ is ResultWithDiagnostics.Failure -> classResult
is ResultWithDiagnostics.Success -> {
- val scriptClass = res.value
+ val scriptClass = classResult.value
val args = ArrayList<Any?>()
scriptEvaluationConfiguration?.get(ScriptEvaluationConfiguration.providedProperties)?.forEach {
args.add(it.value)
args.addAll(it)
}
- val instance = scriptClass.java.constructors.single().newInstance(*args.toArray())
- ?: throw BluePrintProcessorException("failed to create instance from the script")
+ val instance = if (args.isNotEmpty()) {
+ scriptClass.java.constructors.single().newInstance(*args.toArray())
+ ?: throw BluePrintProcessorException("failed to create instance from the script")
+ } else {
+ scriptClass.createInstance()
+ }
- log.info("Created script instance of type ${instance.javaClass}")
+ log.debug("Created script instance of type ${instance.javaClass}")
ResultWithDiagnostics.Success(EvaluationResult(ResultValue.Value(scriptClass.qualifiedName!!,
instance, "", instance),
//classpathFromClassloader(BluePrintScripCompilationConfiguration::class.java.classLoader)
classpathFromClasspathProperty()
}
- ide{
+ ide {
acceptedLocations(ScriptAcceptedLocation.Everywhere)
}
lateinit var blueprintKotlinSources: MutableList<String>
lateinit var moduleName: String
lateinit var targetJarFile: File
+ lateinit var cacheKey: String
var regenerate: Boolean = false
override val text: String
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintScriptsService
-import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
-import java.io.File
+import org.onap.ccsdk.cds.controllerblueprints.core.logger
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintFileUtils
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
import java.util.*
import kotlin.script.experimental.api.ResultValue
import kotlin.script.experimental.api.resultOrNull
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
+
open class BluePrintScriptsServiceImpl : BluePrintScriptsService {
- override suspend fun <T> scriptInstance(blueprintContext: BluePrintContext, scriptClassName: String,
- reCompile: Boolean): T {
+ val log = logger(BluePrintScriptsServiceImpl::class)
- val kotlinScriptPath = blueprintContext.rootPath.plus(File.separator)
- .plus(BluePrintConstants.TOSCA_SCRIPTS_KOTLIN_DIR)
+ override suspend fun <T> scriptInstance(bluePrintSourceCode: BluePrintSourceCode, scriptClassName: String): T {
+ val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
+ val scriptEvaluator = BluePrintScriptEvaluator(scriptClassName)
- val compiledJar = kotlinScriptPath.plus(File.separator)
- .plus(bluePrintScriptsJarName(blueprintContext))
+ val compiledResponse = BlueprintScriptingHost(scriptEvaluator)
+ .eval(bluePrintSourceCode, compilationConfiguration, null)
- val scriptSource = BluePrintSourceCode()
+ val returnValue = compiledResponse.resultOrNull()?.returnValue as? ResultValue.Value
+ return returnValue?.value!! as T
+ }
+
+ override suspend fun <T> scriptInstance(blueprintBasePath: String, artifactName: String, artifactVersion: String,
+ scriptClassName: String, reCompile: Boolean): T {
val sources: MutableList<String> = arrayListOf()
- sources.add(kotlinScriptPath)
+ sources.add(normalizedPathName(blueprintBasePath, BluePrintConstants.TOSCA_SCRIPTS_KOTLIN_DIR))
+
+ val scriptSource = BluePrintSourceCode()
scriptSource.blueprintKotlinSources = sources
- scriptSource.moduleName = "${blueprintContext.name()}-${blueprintContext.version()}-cba-kts"
- scriptSource.targetJarFile = File(compiledJar)
+ scriptSource.moduleName = "$artifactName-$artifactVersion-cba-kts"
+ scriptSource.cacheKey = BluePrintFileUtils.compileCacheKey(blueprintBasePath)
+ scriptSource.targetJarFile = BluePrintFileUtils.compileJarFile(blueprintBasePath, artifactName, artifactVersion)
scriptSource.regenerate = reCompile
+ return scriptInstance(scriptSource, scriptClassName)
+ }
- val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
- val scriptEvaluator = BluePrintScriptEvaluator(scriptClassName)
-
- val compiledResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource, compilationConfiguration,
- null)
-
- val returnValue = compiledResponse.resultOrNull()?.returnValue as? ResultValue.Value
+ override suspend fun <T> scriptInstance(blueprintBasePath: String, scriptClassName: String,
+ reCompile: Boolean): T {
+ val toscaMetaData = BluePrintMetadataUtils.toscaMetaData(blueprintBasePath)
+ checkNotNull(toscaMetaData.templateName) { "couldn't find 'Template-Name' key in TOSCA.meta" }
+ checkNotNull(toscaMetaData.templateVersion) { "couldn't find 'Template-Version' key in TOSCA.meta" }
+ return scriptInstance(blueprintBasePath, toscaMetaData.templateName!!, toscaMetaData.templateVersion!!,
+ scriptClassName, reCompile)
+ }
- return returnValue?.value!! as T
+ override suspend fun <T> scriptInstance(cacheKey: String, scriptClassName: String): T {
+ val args = ArrayList<Any?>()
+ return BluePrintCompileCache.classLoader(cacheKey).loadClass(scriptClassName).constructors
+ .single().newInstance(*args.toArray()) as T
}
override suspend fun <T> scriptInstance(scriptClassName: String): T {
return Thread.currentThread().contextClassLoader.loadClass(scriptClassName).constructors
.single().newInstance(*args.toArray()) as T
}
-
- private fun bluePrintScriptsJarName(blueprintContext: BluePrintContext): String {
- return "${blueprintContext.name()}-${blueprintContext.version()}-cba-kts.jar"
- }
}
\ No newline at end of file
package org.onap.ccsdk.cds.controllerblueprints.core.service
-import org.slf4j.LoggerFactory
import com.fasterxml.jackson.databind.JsonNode
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
import org.onap.ccsdk.cds.controllerblueprints.core.data.*
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+import org.slf4j.LoggerFactory
/**
*
*/
class BluePrintContext(val serviceTemplate: ServiceTemplate) {
- private val log= LoggerFactory.getLogger(this::class.toString())
+ private val log = LoggerFactory.getLogger(this::class.toString())
/**
* Blueprint CBA extracted file location
*/
var entryDefinition = ""
+ /** Other definitions along with model, It may Resource Definition, Resource Assignments, Configurations etc..*/
+ var otherDefinitions: MutableMap<String, Any> = hashMapOf()
+
+ fun <T> otherDefinition(key: String) = otherDefinitions[key] as T
+
+ fun checkOtherDefinition(key: String) = otherDefinitions.containsKey(key)
+
fun imports(): List<ImportDefinition>? = serviceTemplate.imports
fun dslDefinitions() = serviceTemplate.dslDefinitions
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Modifications Copyright © 2018 - 2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
throw BluePrintException(String.format("missing operation output expression, " +
"it should be (<modelable_entity_name>, <interface_name>, <operation_name>, <output_variable_name>) , but present {}", jsonNode))
}
+
+ var subPropertyName: String? = null
+ if (arrayNode.size() == 5)
+ subPropertyName = arrayNode[4].asText()
+
return OperationOutputExpression(modelableEntityName = arrayNode[0].asText(),
interfaceName = arrayNode[1].asText(),
operationName = arrayNode[2].asText(),
- propertyName = arrayNode[3].asText()
+ propertyName = arrayNode[3].asText(),
+ subPropertyName = subPropertyName
)
}
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018-2019 IBM.
+ * Modifications Copyright © 2018-2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
override fun loadEnvironments(type: String, fileName: String) {
BluePrintMetadataUtils.environmentFileProperties(fileName).forEach { key, value ->
- setNodeTemplateAttributeValue(type, key.toString(), value.toString()
- .asJsonPrimitive())
+ setNodeTemplateAttributeValue(type, key.toString(), value.asJsonType())
}
}
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Modifications Copyright © 2018 - 2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.slf4j.LoggerFactory
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.NullNode
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
+import org.onap.ccsdk.cds.controllerblueprints.core.*
import org.onap.ccsdk.cds.controllerblueprints.core.data.*
-import org.onap.ccsdk.cds.controllerblueprints.core.format
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JsonParserUtils
import org.onap.ccsdk.cds.controllerblueprints.core.utils.ResourceResolverUtils
}
if (subAttributeName != null) {
- if (valueNode.isObject || valueNode.isArray)
- valueNode = JsonParserUtils.parse(valueNode, subAttributeName)
+ if (valueNode.isComplexType())
+ valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subAttributeName)
}
return valueNode
}
valueNode = resolveAssignmentExpression(propertyNodeTemplateName, propertyName, nodeTemplatePropertyExpression)
if (subPropertyName != null) {
- if (valueNode.isObject || valueNode.isArray)
- valueNode = JsonParserUtils.parse(valueNode, subPropertyName)
+ if (valueNode.isComplexType())
+ valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subPropertyName)
}
return valueNode
}
if (!operationOutputExpression.modelableEntityName.equals("SELF", true)) {
outputNodeTemplateName = operationOutputExpression.modelableEntityName
}
- return bluePrintRuntimeService.getNodeTemplateOperationOutputValue(outputNodeTemplateName,
+
+ var valueNode = bluePrintRuntimeService.getNodeTemplateOperationOutputValue(outputNodeTemplateName,
operationOutputExpression.interfaceName, operationOutputExpression.operationName,
operationOutputExpression.propertyName)
+
+ val subPropertyName: String? = operationOutputExpression.subPropertyName
+ if (subPropertyName != null) {
+ if (valueNode.isComplexType())
+ valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subPropertyName)
+ }
+ return valueNode
}
/*
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
* Modifications Copyright © 2019 Bell Canada.
+ * Modifications Copyright © 2019 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.ccsdk.cds.controllerblueprints.core.utils
-import org.slf4j.LoggerFactory
import kotlinx.coroutines.runBlocking
import org.apache.commons.io.FileUtils
import org.apache.commons.lang3.StringUtils
import org.onap.ccsdk.cds.controllerblueprints.core.data.ErrorCode
import org.onap.ccsdk.cds.controllerblueprints.core.data.ImportDefinition
import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedFile
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
+import org.slf4j.LoggerFactory
import java.io.File
import java.io.FileFilter
import java.nio.file.Files
class BluePrintFileUtils {
companion object {
- private val log= LoggerFactory.getLogger(this::class.toString())
+ private val log = LoggerFactory.getLogger(this::class.toString())
fun createEmptyBluePrint(basePath: String) {
"\nCSAR-Version: <VERSION>" +
"\nCreated-By: <AUTHOR NAME>" +
"\nEntry-Definitions: Definitions/<BLUEPRINT_NAME>.json" +
+ "\nTemplate-Name: <BLUEPRINT_NAME>"+
+ "\nTemplate-Tags: <BLUEPRINT_VERSION>"+
"\nTemplate-Tags: <TAGS>"
}
-
- fun getBluePrintFile(fileName: String, targetPath: Path) : File {
+
+ fun getBluePrintFile(fileName: String, targetPath: Path): File {
val filePath = targetPath.resolve(fileName).toString()
val file = File(filePath)
check(file.exists()) {
return fileStorageLocation
}
+ fun compileCacheKey(basePath: String): String {
+ return normalizedPathName(basePath)
+ }
+
+ private fun compileJarFileName(artifactName: String, artifactVersion: String): String {
+ return "$artifactName-$artifactVersion-cba-kts.jar"
+ }
+
+ fun compileJarFilePathName(basePath: String, artifactName: String, artifactVersion: String): String {
+ return normalizedPathName(basePath, BluePrintConstants.TOSCA_SCRIPTS_KOTLIN_DIR,
+ compileJarFileName(artifactName, artifactVersion))
+ }
+
+ fun compileJarFile(basePath: String, artifactName: String, artifactVersion: String): File {
+ return normalizedFile(compileJarFilePathName(basePath,
+ artifactName, artifactVersion))
+ }
+
fun stripFileExtension(fileName: String): String {
val dotIndexe = fileName.lastIndexOf('.')
import kotlinx.coroutines.runBlocking
import org.onap.ccsdk.cds.controllerblueprints.core.*
import org.onap.ccsdk.cds.controllerblueprints.core.data.ToscaMetaData
+import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintDefinitions
+import org.onap.ccsdk.cds.controllerblueprints.core.scripts.BluePrintScriptsServiceImpl
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintImportService
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeService
"CSAR-Version" -> toscaMetaData.csarVersion = value
"Created-By" -> toscaMetaData.createdBy = value
"Entry-Definitions" -> toscaMetaData.entityDefinitions = value
+ "Template-Name" -> toscaMetaData.templateName = value
+ "Template-Version" -> toscaMetaData.templateVersion = value
"Template-Tags" -> toscaMetaData.templateTags = value
}
}
log.info("Reading blueprint path($blueprintBasePath) and entry definition file (${toscaMetaData.entityDefinitions})")
- readBlueprintFile(toscaMetaData.entityDefinitions, blueprintBasePath)
+ // If the EntryDefinition is Kotlin file, compile and get Service Template
+ if (toscaMetaData.entityDefinitions.endsWith("kt")) {
+ readBlueprintKotlinFile(toscaMetaData, blueprintBasePath)
+ } else {
+ readBlueprintFile(toscaMetaData.entityDefinitions, blueprintBasePath)
+ }
}
private suspend fun getBaseEnhancementBluePrintContext(blueprintBasePath: String): BluePrintContext {
}
private suspend fun readBlueprintFile(entityDefinitions: String, basePath: String): BluePrintContext {
- val rootFilePath: String = basePath.plus(File.separator).plus(entityDefinitions)
+ val normalizedBasePath = normalizedPathName(basePath)
+ val rootFilePath = normalizedPathName(normalizedBasePath, entityDefinitions)
val rootServiceTemplate = ServiceTemplateUtils.getServiceTemplate(rootFilePath)
// Recursively Import Template files
- val schemaImportResolverUtils = BluePrintImportService(rootServiceTemplate, basePath)
+ val schemaImportResolverUtils = BluePrintImportService(rootServiceTemplate, normalizedBasePath)
val completeServiceTemplate = schemaImportResolverUtils.getImportResolvedServiceTemplate()
val blueprintContext = BluePrintContext(completeServiceTemplate)
- blueprintContext.rootPath = basePath
+ blueprintContext.rootPath = normalizedBasePath
blueprintContext.entryDefinition = entityDefinitions
return blueprintContext
}
+
+ /** Reade the Service Template Definitions from the Kotlin file */
+ private suspend fun readBlueprintKotlinFile(toscaMetaData: ToscaMetaData, basePath: String): BluePrintContext {
+
+ checkNotNull(toscaMetaData.templateName) { "couldn't find 'Template-Name' key in TOSCA.meta" }
+ checkNotNull(toscaMetaData.templateVersion) { "couldn't find 'Template-Version' key in TOSCA.meta" }
+
+ val definitionClassName = toscaMetaData.entityDefinitions.removeSuffix(".kt")
+ val normalizedBasePath = normalizedPathName(basePath)
+
+ val bluePrintScriptsService = BluePrintScriptsServiceImpl()
+ val bluePrintDefinitions = bluePrintScriptsService
+ .scriptInstance<BluePrintDefinitions>(normalizedBasePath, toscaMetaData.templateName!!,
+ toscaMetaData.templateVersion!!, definitionClassName, true)
+ // Get the Service Template
+ val serviceTemplate = bluePrintDefinitions.serviceTemplate()
+
+ // Clean the Default type import Definitions
+ BluePrintFileUtils.cleanImportTypes(serviceTemplate)
+
+ val blueprintContext = BluePrintContext(serviceTemplate)
+ blueprintContext.rootPath = normalizedBasePath
+ blueprintContext.entryDefinition = toscaMetaData.entityDefinitions
+ blueprintContext.otherDefinitions = bluePrintDefinitions.otherDefinitions()
+ return blueprintContext
+ }
}
}
\ No newline at end of file
else -> getJsonNode(value)
}
}
-
}
}
\ No newline at end of file
/*
* Copyright © 2018 IBM.
+ * Modifications Copyright © 2018 - 2019 IBM, Bell Canada.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
}
fun paths(jsonNode: JsonNode, expression: String): List<String> {
- return paths(jsonNode.toString(), expression)
+ return paths(jsonNode, expression)
}
fun parse(jsonContent: String, expression: String): JsonNode {
}
fun parseNSet(jsonNode: JsonNode, expression: String, valueNode: JsonNode): JsonNode {
- return parseNSet(jsonNode.toString(), expression, valueNode)
+
+ return parseNSet(jsonNode, expression, valueNode)
}
}
}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file 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.
+ */
+
+package org.onap.ccsdk.cds.controllerblueprints.core.scripts
+
+
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.onap.ccsdk.cds.controllerblueprints.core.data.DataType
+import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintDefinitions
+import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintFunctionNode
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName
+import kotlin.script.experimental.jvm.util.classpathFromClass
+import kotlin.script.experimental.jvm.util.classpathFromClassloader
+import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
+import kotlin.test.assertNotNull
+
+class BluePrintScriptsServiceImplTest {
+
+ private fun viewClassPathInfo() {
+
+ println(" *********** classpathFromClass *********** ")
+ classpathFromClass(BluePrintScriptsServiceImplTest::class.java.classLoader,
+ BluePrintScriptsServiceImplTest::class)!!
+ .forEach(::println)
+
+ println(" *********** classpathFromClassloader *********** ")
+ classpathFromClassloader(BluePrintScriptsServiceImplTest::class.java.classLoader)!!
+ .forEach(::println)
+
+ println(" *********** classpathFromClasspathProperty *********** ")
+ classpathFromClasspathProperty()!!
+ .forEach(::println)
+ }
+
+ @Test
+ fun testCachedService() {
+ runBlocking {
+
+ val bluePrintScriptsService = BluePrintScriptsServiceImpl()
+
+ val basePath = normalizedPathName("src/test/resources/compile")
+ /** Load the Definitions */
+ val bluePrintDefinitions = bluePrintScriptsService
+ .scriptInstance<BluePrintDefinitions>(basePath,
+ "cba.scripts.ActivateBlueprintDefinitions", true)
+ assertNotNull(bluePrintDefinitions, "failed to get blueprint definitions")
+
+ val serviceTemplate = bluePrintDefinitions.serviceTemplate()
+ assertNotNull(serviceTemplate, "failed to get service template")
+
+ val customDataType = bluePrintDefinitions.otherDefinition<DataType>("datatype-custom-datatype")
+ assertNotNull(customDataType, "failed to get custom definitions")
+
+ val instance = bluePrintScriptsService
+ .scriptInstance<BlueprintFunctionNode<String, String>>(basePath,
+ "cba.scripts.SampleBlueprintFunctionNode", false)
+ assertNotNull(instance, "failed to get compiled instance")
+
+ val cachedInstance = bluePrintScriptsService
+ .scriptInstance<BlueprintFunctionNode<String, String>>(basePath,
+ "cba.scripts.SampleBlueprintFunctionNode", false)
+ assertNotNull(cachedInstance, "failed to get cached compile instance")
+ }
+ }
+
+}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file 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.
- */
-
-package org.onap.ccsdk.cds.controllerblueprints.core.scripts
-
-
-import org.apache.commons.io.FileUtils
-import org.junit.Test
-import java.io.File
-import kotlin.script.experimental.jvm.util.classpathFromClass
-import kotlin.script.experimental.jvm.util.classpathFromClassloader
-import kotlin.script.experimental.jvm.util.classpathFromClasspathProperty
-import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
-
-class BlueprintScriptingHostTest {
-
- private fun viewClassPathInfo() {
-
- println(" *********** classpathFromClass *********** ")
- classpathFromClass(BlueprintScriptingHostTest::class.java.classLoader,
- BlueprintScriptingHostTest::class)!!
- .forEach(::println)
-
- println(" *********** classpathFromClassloader *********** ")
- classpathFromClassloader(BlueprintScriptingHostTest::class.java.classLoader)!!
- .forEach(::println)
-
- println(" *********** classpathFromClasspathProperty *********** ")
- classpathFromClasspathProperty()!!
- .forEach(::println)
- }
-
- @Test
- fun `test same script two folders`() {
-
- FileUtils.forceMkdir(File("target/scripts1/"))
- FileUtils.forceMkdir(File("target/scripts2/"))
-
- val scriptSource1 = BluePrintSourceCode()
- scriptSource1.moduleName = "blueprint-test-script"
-
- scriptSource1.targetJarFile = File("target/scripts1/blueprint-script-generated.jar")
- val sources1: MutableList<String> = arrayListOf()
- sources1.add("src/test/resources/scripts1")
- scriptSource1.blueprintKotlinSources = sources1
-
- val scriptClassName = "Simple_cba\$SampleComponentFunction"
-
- val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<BluePrintKotlinScript>()
-
- val scriptEvaluator = BluePrintScriptEvaluator(scriptClassName)
-
- val scriptSource2 = BluePrintSourceCode()
- scriptSource2.moduleName = "blueprint-test-script"
-
- scriptSource2.targetJarFile = File("target/scripts2/blueprint-script-generated.jar")
- val sources2: MutableList<String> = arrayListOf()
- sources2.add("src/test/resources/scripts2")
- scriptSource2.blueprintKotlinSources = sources2
-
- for (i in 1..2) {
- val evalResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource1, compilationConfiguration,
- null)
- }
-
- for (i in 1..2) {
- val evalResponse = BlueprintScriptingHost(scriptEvaluator).eval(scriptSource2, compilationConfiguration,
- null)
- }
- }
-}
\ No newline at end of file
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.onap.ccsdk.cds.controllerblueprints.core.data.ToscaMetaData
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName
+import org.onap.ccsdk.cds.controllerblueprints.core.scripts.BluePrintCompileCache
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
+import kotlin.test.assertTrue
class BluePrintMetadataUtilsTest {
}
+ @Test
+ fun testKotlinBluePrintContext() {
+ val path = normalizedPathName("src/test/resources/compile")
+ val blueprintContext = BluePrintMetadataUtils.getBluePrintContext(path)
+ assertNotNull(blueprintContext, "failed to get blueprint context")
+ assertNotNull(blueprintContext.serviceTemplate, "failed to get blueprint context service template")
+ assertNotNull(blueprintContext.serviceTemplate, "failed to get blueprint context service template")
+ assertNotNull(blueprintContext.otherDefinitions, "failed to get blueprint contextother definitions")
+
+ var cachePresent = BluePrintCompileCache.hasClassLoader(path)
+ assertTrue(cachePresent, "failed to generate cache key ($path)")
+
+ /** Cleaning Cache */
+ BluePrintCompileCache.cleanClassLoader(path)
+ cachePresent = BluePrintCompileCache.hasClassLoader(path)
+ assertTrue(!cachePresent, "failed to remove cache key ($path)")
+ }
+
@Test
fun environmentDataTest() {
val environmentPath = "./src/test/resources/environments"
--- /dev/null
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file 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.
+ */
+
+package cba.scripts
+
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.dataType
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.serviceTemplate
+import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.AbstractBluePrintDefinitions
+
+class ActivateBlueprintDefinitions : AbstractBluePrintDefinitions() {
+
+ override fun serviceTemplate(): ServiceTemplate {
+
+ return serviceTemplate("sample-blue-print", "1.0.0",
+ "brindasanth@onap.com", "sample, blueprints") {
+ topologyTemplate {
+ workflowNodeTemplate("activate", "component-resource-resolution", "") {
+ operation("ResourceResolutionExecutor", "") {
+ inputs {
+ property("string-value", "sample")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ override fun loadOtherDefinitions() {
+ /** Sample Definitions */
+ val customDataType = dataType("custom-datatype", "1.0.0",
+ BluePrintConstants.MODEL_TYPE_DATATYPES_ROOT, "") {
+ property("name", BluePrintConstants.DATA_TYPE_STRING, true, "")
+ property("value", BluePrintConstants.DATA_TYPE_STRING, true, "")
+ }
+ /** Loading to definitions */
+ addOtherDefinition("datatype-custom-datatype", customDataType)
+ }
+}
\ No newline at end of file
* limitations under the License.
*/
+package cba.scripts
+
import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintFunctionNode
-open class SampleBlueprintFunctionNode : BlueprintFunctionNode<String, String>{
+open class SampleBlueprintFunctionNode : BlueprintFunctionNode<String, String> {
override fun getName(): String {
return "Kotlin-Script-Function-Node"
override fun apply(t: String): String {
return "$t-status"
}
+
+ override suspend fun prepareRequestNB(executionRequest: String): String {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override suspend fun processNB(executionRequest: String) {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: String) {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override suspend fun prepareResponseNB(): String {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override suspend fun applyNB(t: String): String {
+ TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
}
\ No newline at end of file
--- /dev/null
+TOSCA-Meta-File-Version: 1.0.0
+CSAR-Version: 1.0
+Created-By: Brinda Santh <brindasanth@in.ibm.com>
+Entry-Definitions: cba.scripts.ActivateBlueprintDefinitions.kt
+Template-Tags: Brinda Santh, activation-blueprint
+Template-Name: activate-blueprint
+Template-Version: 1.0.0
+++ /dev/null
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2019 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file 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.
- */
-
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
-import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate
-import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintFunctionNode
-import org.springframework.stereotype.Service
-
-@Service
-open class SampleComponentFunction : BlueprintFunctionNode<String, String> {
-
- override fun getName(): String {
- println("Printing Name....." + "sample".asJsonPrimitive())
- return "my Name"
- }
-
- override suspend fun prepareRequestNB(executionRequest: String): String {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun processNB(executionRequest: String) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: String) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun prepareResponseNB(): String {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun applyNB(t: String): String {
- return "Script 1 response - $t"
- }
-}
-
-val blueprintFunction = SampleComponentFunction()
-
-val serviceTemplate = ServiceTemplate()
-
-println("Simple script printing....")
+++ /dev/null
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2019 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file 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.
- */
-
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
-import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate
-import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintFunctionNode
-import org.springframework.stereotype.Service
-
-@Service
-open class SampleComponentFunction : BlueprintFunctionNode<String, String> {
-
- override fun getName(): String {
- println("Printing Name....." + "sample".asJsonPrimitive())
- return "my Name"
- }
-
- override suspend fun prepareRequestNB(executionRequest: String): String {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun processNB(executionRequest: String) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: String) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun prepareResponseNB(): String {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override suspend fun applyNB(t: String): String {
- return "Script 2 response - $t"
- }
-}
-
-val blueprintFunction = SampleComponentFunction()
-
-val serviceTemplate = ServiceTemplate()
-
-println("Simple script printing....")