Merge "Improve service template access through cache."
authorDan Timoney <dtimoney@att.com>
Tue, 23 Jul 2019 18:43:07 +0000 (18:43 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 23 Jul 2019 18:43:07 +0000 (18:43 +0000)
30 files changed:
cds-ui/client/src/app/common/constants/app-constants.ts
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.html [new file with mode: 0644]
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.scss [new file with mode: 0644]
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.spec.ts [new file with mode: 0644]
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.ts [new file with mode: 0644]
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.component.html
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.component.ts
cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.module.ts [new file with mode: 0644]
cds-ui/client/src/app/feature-modules/blueprint/select-template/select-template.module.ts
cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.component.html
cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts
cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.html
cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/sources-template/sources-template.component.ts
cds-ui/server/src/controllers/data-dictionary.controller.ts
cds-ui/server/src/datasources/resource-dictionary.datasource-template.ts
cds-ui/server/src/services/resource-dictionary.service.ts
components/scripts/python/ccsdk_netconf/common.py
docs/microservices/bluePrintsProcessorMS.rst
docs/microservices/controllerBlueprintStudioProcessorMS.rst
docs/microservices/images/blueprintprocessor.jpg [moved from docs/media/blueprintprocessor.jpg with 100% similarity]
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ScriptComponentExtensions.kt
ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt
ms/blueprintsprocessor/parent/pom.xml
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/data/BluePrintExpressionData.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintExpressionService.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintRuntimeService.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JacksonUtils.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt

index 283ce73..bcfcc4e 100644 (file)
@@ -96,5 +96,7 @@ export const GlobalContants = {
 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
diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.html b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.html
new file mode 100644 (file)
index 0000000..11c2ff0
--- /dev/null
@@ -0,0 +1,31 @@
+<!--
+============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
diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.scss b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.scss
new file mode 100644 (file)
index 0000000..93f5c9d
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+============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
diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.spec.ts b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.spec.ts
new file mode 100644 (file)
index 0000000..431eea7
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+============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();
+  });
+});
diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.ts b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-from-database/search-from-database.component.ts
new file mode 100644 (file)
index 0000000..a145086
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+============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);
+      })
+   }
+
+}
index 491c5e0..6a4a88c 100644 (file)
@@ -27,15 +27,5 @@ limitations under the License.
     </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
index 64352b2..ce7d5aa 100644 (file)
@@ -34,6 +34,7 @@ import { LoaderService } from '../../../../common/core/services/loader.service';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatAutocompleteTrigger } from '@angular/material';
 
+
 @Component({
   selector: 'app-search-template',
   templateUrl: './search-template.component.html',
diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.module.ts b/cds-ui/client/src/app/feature-modules/blueprint/select-template/search-template/search-template.module.ts
new file mode 100644 (file)
index 0000000..1102966
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+============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 { }
index 16947d4..f66b78c 100644 (file)
@@ -27,13 +27,13 @@ import { MetadataComponent } from './metadata/metadata.component';
 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,
@@ -45,7 +45,8 @@ import { AppMaterialModule } from 'src/app/common/modules/app-material.module';
     CommonModule,
     SelectTemplateRoutingModule,
     ReactiveFormsModule,
-    AppMaterialModule
+    AppMaterialModule,
+    SearchTemplateModule
   ]
 })
 export class SelectTemplateModule { }
index 5be2a14..19db82c 100644 (file)
 */-->
 
 
-<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>
@@ -45,7 +46,8 @@
     </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>
  
index bd06abb..417f6ed 100644 (file)
@@ -36,4 +36,14 @@ export class ResourceEditService {
     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
index b1474d2..b179f01 100644 (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>
@@ -44,7 +44,7 @@
     <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>
@@ -53,7 +53,7 @@
       [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> 
index 52b19f7..c4ad83d 100644 (file)
@@ -31,6 +31,7 @@ import { A11yModule } from '@angular/cdk/a11y';
 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',
@@ -43,13 +44,13 @@ export class SourcesTemplateComponent implements OnInit {
     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'];
@@ -79,10 +80,35 @@ export class SourcesTemplateComponent implements OnInit {
      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 ?")) {
index 486c286..63587e6 100644 (file)
@@ -84,4 +84,15 @@ export class DataDictionaryController {
   }) 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);
+  }
 }
index c749eee..af96aca 100644 (file)
@@ -86,6 +86,23 @@ export default {
             "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"]
+
             }
         }
     ]
index 8bc61fa..9a781d6 100644 (file)
@@ -7,7 +7,8 @@ export interface ResourceDictionaryService {
   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> {
index f161e29..896fb91 100644 (file)
@@ -1,4 +1,5 @@
 #  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.
@@ -18,11 +19,11 @@ class ResolutionHelper:
     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)
index 911f999..3f30813 100644 (file)
@@ -14,7 +14,7 @@ Micro service to Manage Controller Blueprint Models, such as Resource Dictionary
 This microservice is used to deploy Controller Blueprint Archive file in Run time database. This also helps to test the Valid Blueprint.
 
 Architecture:
-==============
+-------------
 
 |image0|
 
@@ -23,7 +23,7 @@ Architecture:
    :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.
 
@@ -48,7 +48,7 @@ Build it using the Maven profile called Docker:
     mvn clean install -Pdocker
        
 Start Docker containers using docker-composer:
-==============================================
+----------------------------------------------
 
 Navigate to the docker-compose file in the distribution module:
 
@@ -66,7 +66,7 @@ To verify the logs generated by docker-composer, type:
        
        
 Testing the environment:
-========================
+------------------------
 
 Point your browser to http://localhost:8000/api/v1/execution-service/ping (please note that the port is 8000, not 8080)
 
index 5c67d6c..683b694 100644 (file)
@@ -10,7 +10,7 @@ The Controller Blueprint Archive is the overall service design, fully model-driv
 The CBA is .zip file which is saved in Controller Blueprint Database.
 
 Dynamic API:
-===========
+------------
 
 The nature of the API request and response is meant to be model driven and dynamic. They both share the same definition.
 
@@ -22,11 +22,18 @@ The first top level element will always be either $actionName-request for a requ
 
 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
index bac211a..510621b 100644 (file)
@@ -1,5 +1,6 @@
 /*
  *  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.
@@ -50,4 +51,8 @@ fun AbstractComponentFunction.netconfDeviceInfo(requirementName: String): Device
 
 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
index 0e97267..938affc 100644 (file)
@@ -17,6 +17,7 @@
 
 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
@@ -25,10 +26,7 @@ import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.db.R
 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
@@ -47,7 +45,7 @@ interface ResourceResolutionService {
                                     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
@@ -85,17 +83,19 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
 
     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
     }
index 4d05550..b03c7b4 100755 (executable)
         <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>
 
index 15b3e22..d301340 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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.
@@ -67,7 +67,8 @@ data class OperationOutputExpression(
         val modelableEntityName: String = "SELF",
         val interfaceName: String,
         val operationName: String,
-        val propertyName: String
+        val propertyName: String,
+        var subPropertyName: String? = null
 )
 
 data class DSLExpression(
index 32cb6ac..fbf9116 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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.
@@ -170,10 +170,16 @@ object BluePrintExpressionService {
             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
         )
     }
 
index e6f3f71..ba210df 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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.
@@ -213,8 +213,7 @@ open class DefaultBluePrintRuntimeService(private var id: String, private var bl
 
     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())
         }
     }
 
index 931d31e..30bd75f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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.
@@ -21,11 +21,8 @@ package org.onap.ccsdk.cds.controllerblueprints.core.service
 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
@@ -143,8 +140,8 @@ If Property Assignment is Expression.
 
         }
         if (subAttributeName != null) {
-            if (valueNode.isObject || valueNode.isArray)
-                valueNode = JsonParserUtils.parse(valueNode, subAttributeName)
+            if (valueNode.isComplexType())
+                valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subAttributeName)
         }
         return valueNode
     }
@@ -176,8 +173,8 @@ If Property Assignment is Expression.
         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
     }
@@ -190,9 +187,17 @@ If Property Assignment is Expression.
         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
     }
 
     /*
index 342ff76..e5eef5a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  *  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.
@@ -38,7 +39,7 @@ class JsonParserUtils {
         }
 
         fun paths(jsonNode: JsonNode, expression: String): List<String> {
-            return paths(jsonNode.toString(), expression)
+            return paths(jsonNode, expression)
         }
 
         fun parse(jsonContent: String, expression: String): JsonNode {
@@ -54,7 +55,8 @@ class JsonParserUtils {
         }
 
         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