parameter-definition.service:removed hardcoded val
[appc/cdt.git] / src / app / vnfs / build-artifacts / parameter-definitions / parameter-definition.service.ts
1 /*
2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
5
6 Copyright (C) 2018 IBM.
7 ===================================================================
8
9 Unless otherwise specified, all software contained herein is licensed
10 under the Apache License, Version 2.0 (the License);
11 you may not use this software except in compliance with the License.
12 You may obtain a copy of the License at
13
14     http://www.apache.org/licenses/LICENSE-2.0
15
16 Unless required by applicable law or agreed to in writing, software
17 distributed under the License is distributed on an "AS IS" BASIS,
18 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 See the License for the specific language governing permissions and
20 limitations under the License.
21 ============LICENSE_END============================================
22 */
23
24
25 import {Injectable, ViewChild} from '@angular/core';
26 import {saveAs} from 'file-saver';
27 import {ParamShareService} from '../../../shared/services/paramShare.service';
28 import {MappingEditorService} from '../../../shared/services/mapping-editor.service';
29 import {ModalComponent} from '../../../shared/modal/modal.component';
30 import {HttpUtilService} from '../../../shared/services/httpUtil/http-util.service';
31 import {UtilityService} from '../../../shared/services/utilityService/utility.service';
32 import {NotificationsService} from 'angular2-notifications';
33 import 'rxjs/add/operator/map';
34 import { appConstants } from '../../../../constants/app-constants';
35
36 let YAML = require('yamljs');
37
38 declare var $: any;
39
40 @Injectable()
41 export class ParameterDefinitionService {
42
43     public vnfcTypeData: string = '';
44     public selectedUploadType: string;
45     @ViewChild(ModalComponent) modalComponent: ModalComponent;
46     public title: string;
47     public parameterDefinitionMap: { [index: string]: string; } = {};
48     public parameterNameValues = {};
49     public displayParamObjects;
50     public modelParamDefinitionObjects;
51     public vnfType: any;
52     vnfcType: any;
53     protocol: any;
54     public refNameObj = {};
55     public action;
56     public artifactName;
57     public type;
58     public appDataObject: any;
59     public downloadDataObject: any;
60     public artifact_fileName;
61     identifier: any;
62     public myKeyFileName = null;
63     public myPdFileName = null;
64     private selectedActionReference: any;
65     private apiToken = localStorage['apiToken'];
66     private userId = localStorage['userId'];
67     constructor(private mappingEditorService: MappingEditorService,
68                 private paramShareService: ParamShareService,
69                 private nService: NotificationsService,
70                 private httpService: HttpUtilService,
71                 private utilService: UtilityService) {
72     }
73
74     public initialize() {
75
76     }
77
78     public setValues(vnfType, vnfcType, protocol, action, artifactName) {
79         this.vnfType = vnfType;
80         this.vnfcType = vnfcType;
81         this.protocol = protocol;
82         this.action = action;
83         this.artifact_fileName = artifactName;
84     }
85
86     public afterInit(artifactName, displayParamObjects) {
87
88     }
89
90     //========================== End of saveChanges() Method============================================
91     /* Saves pd to appc */
92     public sendPD(yamlString: String) {
93         let result: any;
94         let payload = '{"userID": "' + this.userId + '","vnf-type" : "' + this.vnfType + '","action" : "' + this.action + '","artifact-name" : "' + this.artifact_fileName + '","artifact-type" : "APPC-CONFIG","artifact-version" : "0.0.1","artifact-contents" : ' + yamlString + '}';
95         let input = {
96             'input': {
97                 'design-request': {
98                     'request-id': this.apiToken,
99                     'action': 'uploadArtifact',
100                     'payload': payload
101                 }
102             }
103         };
104         this.appDataObject.pd = input;
105     }
106
107
108     //========================== End of filetrByFieldChanged() Method============================================
109     removeUnwantedvalues(obj) {
110         let result = Object.assign({}, obj);
111         result['vnf-parameter-list'].forEach(obj => {
112             delete obj['ruleTypeValues'];
113             delete obj['showFilterFields'];
114             delete obj['enableFilterByValue'];
115         });
116         return result;
117     }
118
119     //========================== End of removeUnwantedvalues() Method============================================
120     populateDataUponSource(displayParamObjects) {
121         displayParamObjects.forEach(parameter => {
122             if (parameter.source == 'A&AI') {
123                 parameter.ruleTypeValues = [null, 'vnf-name', 'vm-name-list', 'vnfc-name-list', 'vnf-oam-ipv4-address', 'vnfc-oam-ipv4-address-list'];
124                 if (parameter['rule-type'] == 'vm-name-list' || parameter['rule-type'] == 'vnfc-name-list' || parameter['rule-type'] == 'vnfc-oam-ipv4-address-list') {
125                     parameter.showFilterFields = true;
126                     parameter.enableFilterByValue = false;
127                 } else {
128                     parameter.showFilterFields = false;
129                 }
130
131             } else if (parameter.source == 'Manual') {
132                 parameter.ruleTypeValues = [null];
133             }
134             else {
135                 parameter.ruleTypeValues = [parameter['rule-type']];
136             }
137         });
138
139     }
140
141     //========================== End of getPD() Method============================================
142     populatePD(result: any) {
143         let fileContent = JSON.stringify(result);
144         //Added code to deserialize, serialize and format the response keys for display purposes ??May be unneessary?? To Do: - Check 
145         let fileObj = JSON.parse(fileContent);
146         this.displayParamObjects = this.formatFileContentForDisplay(fileObj);
147         this.populateDataUponSource(this.displayParamObjects);
148         this.formatResponseForKey(this.displayParamObjects);
149         if (undefined !== this.displayParamObjects)
150             this.modelParamDefinitionObjects = this.displayParamObjects;
151         if (this.displayParamObjects !== undefined && this.displayParamObjects.length > 0) {
152             this.paramShareService.setSessionParamData(this.displayParamObjects);
153         }
154         return this.displayParamObjects;
155     }
156
157     //========================== End of populatePD() Method============================================
158     /* Formats each object read from YAML file as per page expectations */
159     formatResponseForKey(param: any[]) {
160         for (var i = 0; i < param.length; i++) {
161             this.formatKeys(param[i]);
162         }
163     }
164
165     //========================== End of formatResponseForKey() Method============================================
166     /* Formats for responsekeys of each object */
167     formatKeys(parameterDefinitionObject: any) {
168         if (null == parameterDefinitionObject || undefined === parameterDefinitionObject)
169             return;
170         if (null == parameterDefinitionObject['response-keys'])
171             parameterDefinitionObject['response-keys'] = [{}];
172         for (var j = 0; j < 5; j++) {
173             var keysObj = {
174                 'key-name': null,
175                 'key-value': null
176             };
177             if (undefined == parameterDefinitionObject['response-keys'][j] || null == parameterDefinitionObject['response-keys'][j]) {
178                 parameterDefinitionObject['response-keys'].push(keysObj);
179             }
180             if (undefined == parameterDefinitionObject['response-keys'][j]['key-name']) {
181                 parameterDefinitionObject['response-keys'][j]['key-name'] = null;
182             }
183             if (undefined == parameterDefinitionObject['response-keys'][j]['key-value']) {
184                 parameterDefinitionObject['response-keys'][j]['key-value'] = null;
185             }
186         }
187         if (null == parameterDefinitionObject['request-keys'])
188             parameterDefinitionObject['request-keys'] = [{}];
189         for (var k = 0; k < 3; k++) {
190             var keysObj = {
191                 'key-name': null,
192                 'key-value': null
193             };
194             if (undefined == parameterDefinitionObject['request-keys'][k] || null == parameterDefinitionObject['request-keys'][k]) {
195                 parameterDefinitionObject['request-keys'].push(keysObj);
196             }
197             if (undefined == parameterDefinitionObject['request-keys'][k]['key-name']) {
198                 parameterDefinitionObject['request-keys'][k]['key-name'] = null;
199             }
200             if (undefined == parameterDefinitionObject['request-keys'][k]['key-value']) {
201                 parameterDefinitionObject['request-keys'][k]['key-value'] = null;
202             }
203         }
204     }
205
206     //========================== End of formatKeys() Method============================================
207     //Send null if there are no keys present - Check with key names being absent
208     formatKeysForFileGeneration() {
209         for (var i = 0; i < this.modelParamDefinitionObjects.length; i++) {
210             if (this.modelParamDefinitionObjects[i]['response-keys'][0]['key-name'] == null && this.modelParamDefinitionObjects[i]['response-keys'][1]['key-name'] == null && this.modelParamDefinitionObjects[i]['response-keys'][2]['key-name'] == null)
211                 this.modelParamDefinitionObjects[i]['response-keys'] = null;
212             if (this.modelParamDefinitionObjects[i]['request-keys'][0]['key-name'] == null && this.modelParamDefinitionObjects[i]['request-keys'][1]['key-name'] == null && this.modelParamDefinitionObjects[i]['request-keys'][2]['key-name'] == null)
213                 this.modelParamDefinitionObjects[i]['request-keys'] = null;
214         }
215     }
216
217     //========================== End of formatKeysForFileGeneration() Method============================================
218     /* Fn to restore response keys in desired format per backend consumption*/
219     processResponseKeys(saveModel: any[]) {
220         for (var i = 0; i < saveModel.length; i++) {
221             if (saveModel[i]['response-keys'] != null) {
222                 saveModel[i]['response-keys-new'] = [{}];
223                 saveModel[i]['response-keys-new'][0] = {};//An array of objects ?? so accessing first element
224                 if (undefined != saveModel[i]['response-keys'][0]['key-name'] && undefined != saveModel[i]['response-keys'][0]['key-value']) {
225                     let keyName1 = saveModel[i]['response-keys'][0]['key-name'];
226                     saveModel[i]['response-keys-new'][0][keyName1] = saveModel[i]['response-keys'][0]['key-value'];
227                 }
228                 if (undefined != saveModel[i]['response-keys'][1]['key-name'] && undefined != saveModel[i]['response-keys'][1]['key-value']) {
229                     let keyName2 = saveModel[i]['response-keys'][1]['key-name'];
230                     saveModel[i]['response-keys-new'][0][keyName2] = saveModel[i]['response-keys'][1]['key-value'];
231                 }
232                 if (undefined != saveModel[i]['response-keys'][2]['key-name'] && undefined != saveModel[i]['response-keys'][2]['key-value']) {
233                     let keyName3 = saveModel[i]['response-keys'][2]['key-name'];
234                     saveModel[i]['response-keys-new'][0][keyName3] = saveModel[i]['response-keys'][2]['key-value'];
235                 }
236                 if (saveModel[i]['response-keys'][3]['key-value'] != undefined && saveModel[i]['response-keys'][3]['key-value'] != null) {
237                     let keyName4 = saveModel[i]['response-keys'][3]['key-name'];
238                     saveModel[i]['response-keys-new'][0]['filter-by-key'] = saveModel[i]['response-keys'][3]['key-value'];
239                 }
240                 if (saveModel[i]['response-keys'][4]['key-value'] != undefined && saveModel[i]['response-keys'][4]['key-value'] != null) {
241                     let keyName4 = saveModel[i]['response-keys'][4]['key-name'];
242                     saveModel[i]['response-keys-new'][0]['filter-by-value'] = saveModel[i]['response-keys'][4]['key-value'];
243                 }
244             }
245             else {
246                 saveModel[i]['response-keys-new'] = null;
247             }
248             delete saveModel[i]['response-keys'];
249             saveModel[i]['response-keys'] = saveModel[i]['response-keys-new'];
250             delete saveModel[i]['response-keys-new'];
251         }
252         return saveModel;
253     }
254
255     //========================== End of processResponseKeys() Method============================================
256     /*Fn to format response keys for front end display */
257     formatFileContentForDisplay(fileModel: any[]) {
258         for (var i = 0; i < fileModel.length; i++) {
259             if (undefined != fileModel[i]['response-keys']) {
260                 let testObj = fileModel[i]['response-keys'];
261                 let keyNum = 0;
262                 fileModel[i]['response-keys-new'] = [{}];
263                 for (var prop in testObj[0]) {
264                     if (testObj[0].hasOwnProperty(prop)) {
265                         let key = prop;
266                         fileModel[i]['response-keys-new'][keyNum] = {};
267                         fileModel[i]['response-keys-new'][keyNum]['key-name'] = key;
268                         fileModel[i]['response-keys-new'][keyNum]['key-value'] = testObj[0][key];
269                     }
270                     keyNum++;
271                 }
272                 delete fileModel[i]['response-keys'];
273                 fileModel[i]['response-keys'] = fileModel[i]['response-keys-new'];
274                 delete fileModel[i]['response-keys=new'];
275             }
276         }
277         return fileModel;
278     }
279
280     //========================== End of openModal() Method============================================
281     getCorrectParameterDefinitionObject(paramName: string) {
282         var result = {
283             'obj': {},
284             'present': false
285         };
286         for (var i = 0; i < this.modelParamDefinitionObjects.length; i++) {
287             var paramObj = this.modelParamDefinitionObjects[i];
288             if (paramObj.name === paramName) {
289                 result.obj = this.modelParamDefinitionObjects[i];
290                 result.present = true;
291                 return result;
292             }
293         }
294         var parameterDefinitionObject = {
295             'name': paramName,
296             'type': null,
297             'description': null,
298             'required': null,
299             'default': null,
300             'source': null,
301             'rule-type': null,
302             'response-keys': [{}],
303             'request-keys': [{}]
304         };
305         result.obj = parameterDefinitionObject;
306         result.present = false;
307         return result;
308     }
309
310    
311     public prepareFileName(): any {
312         let fileNameObject: any = this.mappingEditorService.latestAction;
313         this.appDataObject = this.mappingEditorService.appDataObject;
314         this.downloadDataObject = this.mappingEditorService.downloadDataObject;
315         return fileNameObject;
316     }
317
318     public destroy(displayParamObjects) {
319         this.displayParamObjects = displayParamObjects;
320         if (this.mappingEditorService.referenceNameObjects) {
321             this.saveChanges('send');
322             this.saveChanges('download');
323             this.mappingEditorService.changeNavAppData(this.appDataObject);
324             this.mappingEditorService.changeNavDownloadData(this.downloadDataObject);
325         }
326     }
327
328     //========================== End of fileChangeEvent() Method============================================
329     /* Saves pd file in YAML format */
330     public saveChanges(downLoadOrSend: String) {
331         if (undefined != this.displayParamObjects && null != this.displayParamObjects && this.displayParamObjects.length > 0) {
332             this.paramShareService.setSessionParamData(this.displayParamObjects);
333
334             //Generate File Name per given rules - if not, return without saving
335             this.modelParamDefinitionObjects = this.displayParamObjects.slice(0);
336             this.paramShareService.setDisplayData(this.displayParamObjects);
337             this.formatKeysForFileGeneration();
338             //Added code to serialize, deserialize and then make changes needed to save response keys as needed in pd file
339             let jsonString = JSON.stringify(this.modelParamDefinitionObjects, null, '\t');
340             jsonString = jsonString.replace(/"null"/g, 'null');
341             let saveModel = JSON.parse(jsonString);
342             let pdFileObject = this.processResponseKeys(saveModel);
343                 let yamlObject = {
344                     'kind': 'Property Definition',
345                     'version': 'V1',
346                     'vnf-parameter-list': []
347                 };
348                 yamlObject['vnf-parameter-list'] = pdFileObject;
349                 yamlObject = this.removeUnwantedvalues(yamlObject);
350                 let yamlStringTemp = YAML.stringify(yamlObject, 6, 1);
351                 var re = /\'/gi;
352                 var newYamlStringTemp = yamlStringTemp.replace(re, '"');
353                 var re2 = / -\n  +/gi;
354                 var newYamlStringTemp2 = newYamlStringTemp.replace(re2, '- ');
355                 let yamlString = '---\n' + newYamlStringTemp2;
356                 if (downLoadOrSend === 'download') {
357                     var blob = new Blob([yamlString], {
358                         type: 'text/plain'
359                     });
360                     //let fileName = "pd_" + this.action + "_" + this.type + "_0.0.1V.yaml"
361                     this.downloadDataObject.pd.pdData = yamlString;
362                     this.downloadDataObject.pd.pdFileName = this.artifact_fileName;
363                 }
364                 else {
365                     this.sendPD(JSON.stringify(yamlString));
366                 }
367             
368             //Restore Keys for display
369             for (var i = 0; i < this.modelParamDefinitionObjects.length; i++) {
370                 this.formatKeys(this.modelParamDefinitionObjects[i]);
371             }
372         }
373
374     }
375
376
377     //This method will create parameter definitions as an array of objects from template name-value pairs and associative array for value from external key file if present
378     createOrUpdateParameterDefinitionData(usecase) {
379         this.parameterNameValues = JSON.parse(localStorage['paramsContent']);
380         this.parameterDefinitionMap = this.paramShareService.getData();
381         //Return if there are no name-value pairs or send some alert notification
382         if (undefined != this.modelParamDefinitionObjects && this.modelParamDefinitionObjects.length > 0 && usecase == 'create') {
383             //Do not recreate if object is already created
384             return;
385         }
386         else {
387         }
388         this.parameterDefinitionMap = this.paramShareService.getData();
389         //To Do:: Add Check for empty parameterDefinitionmap
390         var nameValueObj = {}, pName, pValue;
391         for (var key in this.parameterNameValues) {
392             if (this.parameterNameValues.hasOwnProperty(key)) {
393                 pName = key;
394                 pValue = this.parameterNameValues[key];
395             }
396
397             if (this.parameterDefinitionMap !== undefined)
398             //Check if parameter exists - if so, just update the keys, else create new object
399                 var result = this.getCorrectParameterDefinitionObject(pName);
400             var parameterDefinitionObject = result.obj;
401             if (parameterDefinitionObject['source'] != 'A&AI' && (undefined !== this.parameterDefinitionMap) && (undefined !== this.parameterDefinitionMap[pValue.toUpperCase()])) {
402                 var fields = this.parameterDefinitionMap[pValue.toUpperCase()].split('|');
403                 //Starts with 2, first vallue is source, second is rule-type
404                 let respInd = 0;
405                 for (var i = 2; i < fields.length; i += 2) {
406                     parameterDefinitionObject['response-keys'][respInd] = {};
407                     parameterDefinitionObject['response-keys'][respInd]['key-name'] = fields[i];
408                     if ((i + 1) < fields.length) {
409                         parameterDefinitionObject['response-keys'][respInd]['key-value'] = fields[i + 1];
410                     }
411                     respInd++;
412                 }
413                 parameterDefinitionObject['source'] = fields[0];
414                 parameterDefinitionObject['rule-type'] = fields[1];
415             } 
416             this.formatKeys(parameterDefinitionObject); //Ensure there are 3 elements for response-keys, request-keys for display purposes
417             if (!result.present) { //only push if not present
418                 this.modelParamDefinitionObjects.push(parameterDefinitionObject);
419             }
420         }
421         for (var indx in this.modelParamDefinitionObjects) {
422             if (this.modelParamDefinitionObjects[indx] != undefined && (this.modelParamDefinitionObjects[indx].source == undefined || this.modelParamDefinitionObjects[indx].source == null || this.modelParamDefinitionObjects[indx].source == '')) {
423                 this.modelParamDefinitionObjects[indx].source = 'Manual';
424             }
425         }
426         this.displayParamObjects = this.modelParamDefinitionObjects.slice(0);
427         this.paramShareService.setDisplayData(this.displayParamObjects);
428     }
429
430     public processKeyFile(fileName, result) {
431         this.myKeyFileName = fileName;
432         if (!this.myKeyFileName.endsWith('.txt')) {
433             this.nService.error(appConstants.notifications.titles.error, appConstants.errors.notTxtFileError);
434         }
435         this.parameterDefinitionMap = {};
436         var rows = result.split(/\r\n|\r|\n/g);
437         for (var i = 1; i < rows.length; i++) { //Omit headings, so start from 1
438             let ind = rows[i].indexOf('|');
439             let key = rows[i].slice(0, ind);
440             let value = rows[i].slice(ind + 1);
441             this.parameterDefinitionMap[key.toUpperCase()] = value;
442         }
443         this.paramShareService.setData(this.parameterDefinitionMap);
444         //this.notificationService.notifySuccessMessage('External Key file successfully uploaded..');
445         let sessionVar = [{}];
446         sessionVar = this.paramShareService.getSessionParamData();
447         if (sessionVar !== undefined && sessionVar != null && sessionVar.length > 0) {
448             if (undefined == this.displayParamObjects)
449                 this.displayParamObjects = this.modelParamDefinitionObjects = [];
450             this.displayParamObjects = sessionVar;
451             this.modelParamDefinitionObjects = this.displayParamObjects;
452             if (localStorage['paramsContent'] && (undefined !== this.displayParamObjects) && (this.displayParamObjects.length > 0)) {
453                 this.createOrUpdateParameterDefinitionData('update');
454                 //update the session variable with the updated data
455                 this.paramShareService.setSessionParamData(this.displayParamObjects);
456             }
457         } else {
458             this.displayParamObjects = this.modelParamDefinitionObjects = [];
459         }
460         this.populateDataUponSource(this.displayParamObjects);
461         return this.displayParamObjects;
462     }
463
464     public processPDfile(fileName, result) {
465         this.myPdFileName = fileName;
466         if (!this.myPdFileName.endsWith('.yaml')) {
467             this.nService.error(appConstants.notifications.titles.error, appConstants.errors.notYAMLFileError);
468         }
469         var pdObject = YAML.parse(result);
470         let fileModel = pdObject['vnf-parameter-list'];
471         this.populatePD(fileModel);
472         return this.displayParamObjects;
473     }
474 }