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