Modify CDS-UI server to allow communicating with external blueprint mS 50/87550/1
authorNirvan Ramjuttun <nirvan.ramjuttun@amdocs.com>
Tue, 7 May 2019 16:39:19 +0000 (12:39 -0400)
committerDan Timoney <dtimoney@att.com>
Mon, 13 May 2019 12:52:51 +0000 (12:52 +0000)
Issue-ID: CCSDK-1292

Change-Id: I3536437bad334841d7c7ecd577c092cd13f42a9b
Signed-off-by: Nirvan Ramjuttun <nirvan.ramjuttun@amdocs.com>
(cherry picked from commit 087d4b667a9c5517ac7d014c2bbdad994b927147)

16 files changed:
.gitignore
cds-ui/client/src/app/common/constants/app-constants.ts
cds-ui/client/src/app/common/core/services/api.service.ts
cds-ui/client/src/app/feature-modules/blueprint/modify-template/editor/editor.service.ts
cds-ui/client/src/app/feature-modules/blueprint/test-template/test-template.service.ts
cds-ui/client/src/app/feature-modules/resource-definition/resource-creation/existing-model/exsisting-model.service.ts
cds-ui/client/src/app/feature-modules/resource-definition/resource-edit/resource-edit.service.ts
cds-ui/server/config/app-config.ts [new file with mode: 0644]
cds-ui/server/src/controllers/blueprint-rest.controller.ts
cds-ui/server/src/controllers/data-dictionary.controller.ts
cds-ui/server/src/datasources/blueprint.datasource-template.ts [moved from cds-ui/server/src/datasources/blueprint.datasource.json with 56% similarity]
cds-ui/server/src/datasources/blueprint.datasource.ts
cds-ui/server/src/datasources/resource-dictionary.datasource-template.ts [moved from cds-ui/server/src/datasources/resource-dictionary.datasource.json with 63% similarity]
cds-ui/server/src/datasources/resource-dictionary.datasource.ts
cds-ui/server/src/services/blueprint.service.ts
cds-ui/server/src/services/resource-dictionary.service.ts

index a2661f0..29bf5d4 100644 (file)
@@ -43,6 +43,7 @@ build/Release
 node_modules/
 jspm_packages/
 dist/
+dist10/
 
 # TypeScript v1 declaration files
 typings/
index d4e8989..283ce73 100644 (file)
@@ -92,10 +92,6 @@ export const GlobalContants = {
 
     }
 };
-export const LoopbackConfig = {
-    url: "http://127.0.0.1:3000",
-    authtoken: "ccsdkapps"
-}
 
 export const ResourceDictionaryURLs = {
     saveResourceDictionary: '/resourcedictionary/save',
index 463ef38..addf51c 100644 (file)
@@ -24,7 +24,6 @@ limitations under the License.
 import { Injectable } from '@angular/core';
 import { HttpClient, HttpHeaders, HttpResponse, HttpHeaderResponse } from '@angular/common/http';
 import { Observable } from 'rxjs';
-import { LoopbackConfig } from '../../constants/app-constants';
 
 @Injectable()
 export class ApiService {
index 63c8019..ec25244 100644 (file)
@@ -24,7 +24,6 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { Observable, observable } from 'rxjs';
 import { ApiService } from '../../../../common/core/services/api.service';
-import { LoopbackConfig } from '../../../../common/constants/app-constants';
 import { saveAs } from 'file-saver';
 
 @Injectable()
@@ -35,10 +34,10 @@ export class EditorService {
     }
 
     enrich(uri: string, body: FormData): Observable<any> {
-        return this.api.post(LoopbackConfig.url + uri, body, { responseType: 'blob' });
+        return this.api.post(uri, body, { responseType: 'blob' });
     }
     downloadCBA(uri: string): string {
-        this.api.get(LoopbackConfig.url + uri, { responseType: 'blob' })
+        this.api.get(uri, { responseType: 'blob' })
             .subscribe(response => {
                 let blob = new Blob([response], { 'type': "application/octet-stream" });
                 saveAs(blob, "CBA.zip");
@@ -49,11 +48,11 @@ export class EditorService {
     }
     post(uri: string, body: any | null, options?: any): Observable<any> {
 
-        return this.api.post(LoopbackConfig.url + uri, body, options);
+        return this.api.post(uri, body, options);
     }
 
     deployPost(uri: string, body: any | null, options?: any): Observable<any> {
 
-        return this.api.post(LoopbackConfig.url + uri, body, { responseType: 'text' });
+        return this.api.post(uri, body, { responseType: 'text' });
     }
 }
\ No newline at end of file
index 8df8e78..3896265 100644 (file)
@@ -24,7 +24,6 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { Observable, observable } from 'rxjs';
 import { ApiService } from '../../../common/core/services/api.service';
-import { LoopbackConfig } from '../../../common/constants/app-constants';
 
 @Injectable()
 export class TestTemplateService {
index 7c3bf54..a4177c1 100644 (file)
@@ -24,7 +24,7 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { Observable, observable } from 'rxjs';
 import { ApiService } from  '../../../../common/core/services/api.service';
-import { LoopbackConfig, ResourceDictionaryURLs } from '../../../../common/constants/app-constants';
+import { ResourceDictionaryURLs } from '../../../../common/constants/app-constants';
 
 @Injectable()
 export class ExsistingModelService {
@@ -34,6 +34,6 @@ export class ExsistingModelService {
     }
 
     searchByTags(tag) {
-       return this.api.get(LoopbackConfig.url+ ResourceDictionaryURLs.searchResourceDictionaryByTags + '/' + tag);
+       return this.api.get(ResourceDictionaryURLs.searchResourceDictionaryByTags + '/' + tag);
     }
 }
\ No newline at end of file
index 982d71d..bd06abb 100644 (file)
@@ -24,7 +24,7 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { Observable, observable } from 'rxjs';
 import { ApiService } from  '../../../common/core/services/api.service';
-import { LoopbackConfig, ResourceDictionaryURLs } from '../../../common/constants/app-constants';
+import { ResourceDictionaryURLs } from '../../../common/constants/app-constants';
 
 @Injectable()
 export class ResourceEditService {
@@ -34,6 +34,6 @@ export class ResourceEditService {
     }
 
     saveResource(resource) {
-       return this.api.post(LoopbackConfig.url+ ResourceDictionaryURLs.saveResourceDictionary, resource);
+       return this.api.post(ResourceDictionaryURLs.saveResourceDictionary, resource);
     }
 }
\ No newline at end of file
diff --git a/cds-ui/server/config/app-config.ts b/cds-ui/server/config/app-config.ts
new file mode 100644 (file)
index 0000000..80f2464
--- /dev/null
@@ -0,0 +1,9 @@
+export const controllerApiConfig = Object.freeze({
+    url: process.env.API_BLUEPRINT_CONTROLLER_BASE_URL || "http://localhost:8080/api/v1",
+    authToken: process.env.API_BLUEPRINT_CONTROLLER_AUTH_TOKEN || "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw=="
+});
+
+export const processorApiConfig = Object.freeze({
+    url: process.env.API_BLUEPRINT_PROCESSOR_BASE_URL || "http://localhost:8081/api/v1",
+    authToken: process.env.API_BLUEPRINT_PROCESSOR_AUTH_TOKEN || "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw=="
+});
\ No newline at end of file
index 38abad8..877fa02 100644 (file)
@@ -48,11 +48,7 @@ import { BlueprintService } from '../services';
 import * as fs from 'fs';
 import * as multiparty from 'multiparty';
 import * as request_lib from 'request';
-
-const REST_BLUEPRINT_CONTROLLER_BASE_URL = process.env.REST_BLUEPRINT_CONTROLLER_BASE_URL || "http://localhost:8080/api/v1";
-const REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER = process.env.REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER || "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==";
-const REST_BLUEPRINT_PROCESSOR_BASE_URL= process.env.REST_BLUEPRINT_PROCESSOR_BASE_URL ||"http://localhost:8081/api/v1";
-const MULTIPART_FORM_UPLOAD_DIR = process.env.MULTIPART_FORM_UPLOAD_DIR || "/tmp";
+import {controllerApiConfig, processorApiConfig} from '../../config/app-config';
 
 export class BlueprintRestController {
   constructor(
@@ -69,7 +65,7 @@ export class BlueprintRestController {
     },
   })
   async getall() {
-    return await this.bpservice.getAllblueprints(REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER);
+    return await this.bpservice.getAllblueprints();
   }
 
   @post('/create-blueprint')
@@ -90,7 +86,7 @@ export class BlueprintRestController {
   ): Promise<Response> {
     return new Promise((resolve, reject) => { 
        this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, REST_BLUEPRINT_CONTROLLER_BASE_URL+"/blueprint-model/", response).then(resp=>{
+         this.uploadFileToBlueprintController(file, "/blueprint-model/", response).then(resp=>{
           resolve(resp);
          }, err=>{
            reject(err);
@@ -100,6 +96,7 @@ export class BlueprintRestController {
       });
     });
   }
+
   @post('/publish')
   async publish(
     @requestBody({
@@ -118,7 +115,7 @@ export class BlueprintRestController {
   ): Promise<Response> {
     return new Promise((resolve, reject) => { 
        this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, REST_BLUEPRINT_CONTROLLER_BASE_URL+"/blueprint-model/publish/", response).then(resp=>{
+         this.uploadFileToBlueprintController(file, "/blueprint-model/publish/", response).then(resp=>{
           resolve(resp);
          }, err=>{
            reject(err);
@@ -128,6 +125,7 @@ export class BlueprintRestController {
       });
     });
   }
+
   @post('/enrich-blueprint')
   async enrich(
     @requestBody({
@@ -146,7 +144,7 @@ export class BlueprintRestController {
   ): Promise<Response> {
     return new Promise((resolve, reject) => { 
        this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, REST_BLUEPRINT_CONTROLLER_BASE_URL+"/blueprint-model/enrich/", response).then(resp=>{
+         this.uploadFileToBlueprintController(file, "/blueprint-model/enrich/", response).then(resp=>{
            resolve(resp);
          }, err=>{
            reject(err);
@@ -163,7 +161,7 @@ export class BlueprintRestController {
     @param.path.string('version') version:string,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return this.downloadFileFromBlueprintController(REST_BLUEPRINT_CONTROLLER_BASE_URL+"/blueprint-model/download/by-name/"+name+"/version/"+version, response);
+    return this.downloadFileFromBlueprintController("/blueprint-model/download/by-name/"+name+"/version/"+version, response);
   }
 
   async getFileFromMultiPartForm(request: Request): Promise<multiparty.File>{
@@ -199,7 +197,7 @@ export class BlueprintRestController {
   ): Promise<Response> {
     return new Promise((resolve, reject) => { 
        this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, REST_BLUEPRINT_PROCESSOR_BASE_URL+"/execution-service/upload/", response).then(resp=>{
+         this.uploadFileToBlueprintProcessor(file, "/execution-service/upload/", response).then(resp=>{
           resolve(resp);
          }, err=>{
            reject(err);
@@ -209,12 +207,20 @@ export class BlueprintRestController {
       });
     });
   }
+
   async uploadFileToBlueprintController(file: multiparty.File, uri: string, response: Response): Promise<Response>{
+    return this.uploadFileToBlueprintService(file, controllerApiConfig.url + uri, controllerApiConfig.authToken, response);
+  }
+
+  async uploadFileToBlueprintProcessor(file: multiparty.File, uri: string, response: Response): Promise<Response>{
+    return this.uploadFileToBlueprintService(file, processorApiConfig.url + uri, processorApiConfig.authToken, response);
+  }
+
+  async uploadFileToBlueprintService(file: multiparty.File, url: string, authToken: string, response: Response): Promise<Response>{
     let options = {
-      // url: REST_BLUEPRINT_CONTROLLER_BASE_URL + uri,
-      url:uri,
+      url: url,
       headers: {
-        Authorization: REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER,
+        Authorization: authToken,
         'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
       },
       formData: {
@@ -248,12 +254,16 @@ export class BlueprintRestController {
         });
     })
   }
+
   async downloadFileFromBlueprintController(uri: string, response: Response): Promise<Response> {
+    return this.downloadFileFromBlueprintService(controllerApiConfig.url + uri, controllerApiConfig.authToken, response);
+  }
+
+  async downloadFileFromBlueprintService(url: string, authToken: string, response: Response): Promise<Response> {
     let options = {
-      url: uri,
-      // REST_BLUEPRINT_CONTROLLER_BASE_URL + uri,
+      url: url,
       headers: {
-        Authorization: REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER,
+        Authorization: authToken,
       }
     };
     return new Promise((resolve, reject) => {
index d535e27..486c286 100644 (file)
@@ -18,7 +18,6 @@ import {
 import { inject } from '@loopback/core';
 import { ResourceDictionaryService } from '../services';
 
-const REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER = process.env.REST_BLUEPRINT_CONTROLLER_BASIC_AUTH_HEADER || "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==";
 export class DataDictionaryController {
   constructor(
     @inject('services.ResourceDictionaryService')
@@ -33,8 +32,9 @@ export class DataDictionaryController {
     },
   })
   async getByName(@param.path.string('name') name: string) {
-    return await this.rdservice.getByName(name, REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER);
+    return await this.rdservice.getByName(name);
   }
+
   @get('/resourcedictionary/search/{tags}', {
     responses: {
       '200': {
@@ -43,7 +43,7 @@ export class DataDictionaryController {
     },
   })
   async getByTags(@param.path.string('tags') tags: string) {
-    return await this.rdservice.getByTags(tags, REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER);
+    return await this.rdservice.getByTags(tags);
   }
 
   @get('/resourcedictionary/source-mapping', {
@@ -54,8 +54,9 @@ export class DataDictionaryController {
     },
   })
   async getSourceMapping() {
-    return await this.rdservice.getSourceMapping(REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER);
+    return await this.rdservice.getSourceMapping();
   }
+
   @post('/resourcedictionary/save', {
     responses: {
       '200': {
@@ -67,8 +68,9 @@ export class DataDictionaryController {
     content: { 'application/json': { schema: { 'x-ts-type': JSON } } },
     accepts: { 'application/json': { schema: { 'x-ts-type': JSON } } }
   }) resourceDictionary: JSON): Promise<any> {
-    return await this.rdservice.save(REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER, resourceDictionary);
+    return await this.rdservice.save(resourceDictionary);
   }
+  
   @post('/resourcedictionary/search/by-names', {
     responses: {
       '200': {
@@ -80,6 +82,6 @@ export class DataDictionaryController {
     content: { 'application/json': { schema: { 'x-ts-type': JSON } } },
     accepts: { 'application/json': { schema: { 'x-ts-type': JSON } } }
   }) resourceDictionaryList: JSON): Promise<any> {
-    return await this.rdservice.searchbyNames(REST_RESOURCE_DICTIONARY_BASIC_AUTH_HEADER, resourceDictionaryList);
+    return await this.rdservice.searchbyNames(resourceDictionaryList);
   }
 }
@@ -1,22 +1,24 @@
-{
+import {controllerApiConfig} from '../../config/app-config';
+
+export default {
     "name": "blueprint",
     "connector": "rest",
-    "baseURL": "http://localhost:8080/api/v1/",
+    "baseURL": controllerApiConfig.url,
     "crud": false,
     "operations": [{
         "template": {
             "method": "GET",
-            "url": "http://localhost:8080/api/v1/blueprint-model/",
+            "url": controllerApiConfig.url + "/blueprint-model/",
             "headers": {
                 "accepts": "application/json",
                 "content-type": "application/json",
-                "authorization": "{authtoken}"
+                "authorization": controllerApiConfig.authToken
             },
             "responsePath": "$.*"
         },
         "functions": {
-            "getAllblueprints": ["authtoken"]
+            "getAllblueprints": []
 
         }
     }]
-}
\ No newline at end of file
+};
\ No newline at end of file
index 0086126..ce901b6 100644 (file)
@@ -1,6 +1,6 @@
 import {inject} from '@loopback/core';
 import {juggler} from '@loopback/repository';
-import * as config from './blueprint.datasource.json';
+import config from './blueprint.datasource-template';
 
 export class BlueprintDataSource extends juggler.DataSource {
   static dataSourceName = 'blueprint';
@@ -1,89 +1,91 @@
-{
+import {controllerApiConfig} from '../../config/app-config';
+
+export default {
     "name": "resourceDictionary",
     "connector": "rest",
-    "baseURL": "http://localhost:8080/api/v1/dictionary",
+    "baseURL": controllerApiConfig.url + "/dictionary",
     "crud": false,
     "operations": [{
             "template": {
                 "method": "GET",
-                "url": "http://localhost:8080/api/v1/dictionary/{name}",
+                "url": controllerApiConfig.url + "/dictionary/{name}",
                 "headers": {
                     "accepts": "application/json",
                     "content-type": "application/json",
-                    "authorization": "{authtoken}"
+                    "authorization": controllerApiConfig.authToken
                 },
                 "responsePath": "$.*"
             },
             "functions": {
-                "getByName": ["name", "authtoken"]
+                "getByName": ["name"]
 
             }
         },
         {
             "template": {
                 "method": "GET",
-                "url": "http://localhost:8080/api/v1/dictionary/source-mapping",
+                "url": controllerApiConfig.url + "/dictionary/source-mapping",
                 "headers": {
                     "accepts": "application/json",
                     "content-type": "application/json",
-                    "authorization": "{authtoken}"
+                    "authorization": controllerApiConfig.authToken
                 },
                 "responsePath": "$.*"
             },
             "functions": {
-                "getSourceMapping": ["authtoken"]
+                "getSourceMapping": []
 
             }
         },
         {
             "template": {
                 "method": "GET",
-                "url": "http://localhost:8080/api/v1/dictionary/search/{tags}",
+                "url": controllerApiConfig.url + "/dictionary/search/{tags}",
                 "headers": {
                     "accepts": "application/json",
                     "content-type": "application/json",
-                    "authorization": "{authtoken}"
+                    "authorization": controllerApiConfig.authToken
                 },
                 "responsePath": "$.*"
             },
             "functions": {
-                "getByTags": ["tags", "authtoken"]
+                "getByTags": ["tags"]
 
             }
         },
         {
             "template": {
                 "method": "POST",
-                "url": "http://localhost:8080/api/v1/dictionary",
+                "url": controllerApiConfig.url + "/dictionary",
                 "headers": {
                     "accepts": "application/json",
                     "content-type": "application/json",
-                    "authorization": "{authtoken}"
+                    "authorization": controllerApiConfig.authToken
                 },
                 "body": "{resourceDictionary}",
                 "responsePath": "$.*"
             },
             "functions": {
-                "save": ["authtoken", "resourceDictionary"]
+                "save": ["resourceDictionary"]
 
             }
         },
         {
             "template": {
                 "method": "POST",
-                "url": "http://localhost:8080/api/v1/dictionary/by-names",
+                "url": controllerApiConfig.url + "/dictionary/by-names",
                 "headers": {
                     "accepts": "application/json",
                     "content-type": "application/json",
-                    "authorization": "{authtoken}"
+                    "authorization": controllerApiConfig.authToken
                 },
                 "body": "{resourceDictionaryList}",
                 "responsePath": "$.*"
             },
             "functions": {
-                "searchbyNames": ["authtoken", "resourceDictionaryList"]
+                "searchbyNames": ["resourceDictionaryList"]
 
             }
         }
     ]
-}
\ No newline at end of file
+};
\ No newline at end of file
index 381ab9a..ba12c78 100644 (file)
@@ -1,6 +1,6 @@
 import {inject} from '@loopback/core';
 import {juggler} from '@loopback/repository';
-import * as config from './resource-dictionary.datasource.json';
+import config from './resource-dictionary.datasource-template';
 
 export class ResourceDictionaryDataSource extends juggler.DataSource {
   static dataSourceName = 'resourceDictionary';
index f482536..970b2af 100644 (file)
@@ -3,7 +3,7 @@ import {inject, Provider} from '@loopback/core';
 import {BlueprintDataSource} from '../datasources';
 
 export interface BlueprintService {
-   getAllblueprints(authtoken: string): Promise<any>;
+   getAllblueprints(): Promise<any>;
 }
 
 export class BlueprintServiceProvider implements Provider<BlueprintService> {
index 44ba1a3..8bc61fa 100644 (file)
@@ -3,11 +3,11 @@ import {inject, Provider} from '@loopback/core';
 import {ResourceDictionaryDataSource} from '../datasources';
 
 export interface ResourceDictionaryService {
-  getByName(name: string, authtoken: string): Promise<JSON>;
-  getSourceMapping(authtoken: string): Promise<JSON>;
-  getByTags(tags: string, authtoken: string): Promise<JSON>;
-  save(authtoken: string, resourceDictionary: JSON): Promise<JSON>;
-  searchbyNames(authtoken: string, resourceDictionaryList: JSON): Promise<JSON>;
+  getByName(name: string): Promise<JSON>;
+  getSourceMapping(): Promise<JSON>;
+  getByTags(tags: string): Promise<JSON>;
+  save(resourceDictionary: JSON): Promise<JSON>;
+  searchbyNames(resourceDictionaryList: JSON): Promise<JSON>;
 }
 
 export class ResourceDictionaryServiceProvider implements Provider<ResourceDictionaryService> {