2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
5 ===================================================================
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
12 http://www.apache.org/licenses/LICENSE-2.0
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.
20 ECOMP is a trademark and service mark of AT&T Intellectual Property.
21 ============LICENSE_END============================================
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';
35 let YAML = require('yamljs');
40 export class ParameterDefinitionService {
42 public vnfcTypeData: string = '';
43 public selectedUploadType: string;
44 @ViewChild(ModalComponent) modalComponent: ModalComponent;
46 public parameterDefinitionMap: { [index: string]: string; } = {};
47 public parameterNameValues = {};
48 public displayParamObjects;
49 public modelParamDefinitionObjects;
53 public refNameObj = {};
57 public appDataObject: any;
58 public downloadDataObject: any;
59 public artifact_fileName;
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) {
77 public setValues(vnfType, vnfcType, protocol, action, artifactName) {
78 this.vnfType = vnfType;
79 this.vnfcType = vnfcType;
80 this.protocol = protocol;
82 this.artifact_fileName = artifactName;
85 public afterInit(artifactName, displayParamObjects) {
89 //========================== End of saveChanges() Method============================================
90 /* Saves pd to appc */
91 public sendPD(yamlString: String) {
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 + '}';
97 'request-id': this.apiToken,
98 'action': 'uploadArtifact',
103 this.appDataObject.pd = input;
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'];
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;
127 parameter.showFilterFields = false;
130 } else if (parameter.source == 'Manual') {
131 parameter.ruleTypeValues = [null];
134 parameter.ruleTypeValues = [parameter['rule-type']];
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);
153 return this.displayParamObjects;
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]);
164 //========================== End of formatResponseForKey() Method============================================
165 /* Formats for responsekeys of each object */
166 formatKeys(parameterDefinitionObject: any) {
167 if (null == parameterDefinitionObject || undefined === parameterDefinitionObject)
169 if (null == parameterDefinitionObject['response-keys'])
170 parameterDefinitionObject['response-keys'] = [{}];
171 for (var j = 0; j < 5; j++) {
176 if (undefined == parameterDefinitionObject['response-keys'][j] || null == parameterDefinitionObject['response-keys'][j]) {
177 parameterDefinitionObject['response-keys'].push(keysObj);
179 if (undefined == parameterDefinitionObject['response-keys'][j]['key-name']) {
180 parameterDefinitionObject['response-keys'][j]['key-name'] = null;
182 if (undefined == parameterDefinitionObject['response-keys'][j]['key-value']) {
183 parameterDefinitionObject['response-keys'][j]['key-value'] = null;
186 if (null == parameterDefinitionObject['request-keys'])
187 parameterDefinitionObject['request-keys'] = [{}];
188 for (var k = 0; k < 3; k++) {
193 if (undefined == parameterDefinitionObject['request-keys'][k] || null == parameterDefinitionObject['request-keys'][k]) {
194 parameterDefinitionObject['request-keys'].push(keysObj);
196 if (undefined == parameterDefinitionObject['request-keys'][k]['key-name']) {
197 parameterDefinitionObject['request-keys'][k]['key-name'] = null;
199 if (undefined == parameterDefinitionObject['request-keys'][k]['key-value']) {
200 parameterDefinitionObject['request-keys'][k]['key-value'] = null;
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;
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'];
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'];
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'];
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'];
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'];
245 saveModel[i]['response-keys-new'] = null;
247 delete saveModel[i]['response-keys'];
248 saveModel[i]['response-keys'] = saveModel[i]['response-keys-new'];
249 delete saveModel[i]['response-keys-new'];
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'];
261 fileModel[i]['response-keys-new'] = [{}];
262 for (var prop in testObj[0]) {
263 if (testObj[0].hasOwnProperty(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];
271 delete fileModel[i]['response-keys'];
272 fileModel[i]['response-keys'] = fileModel[i]['response-keys-new'];
273 delete fileModel[i]['response-keys=new'];
279 //========================== End of openModal() Method============================================
280 getCorrectParameterDefinitionObject(paramName: string) {
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;
293 var parameterDefinitionObject = {
301 'response-keys': [{}],
304 result.obj = parameterDefinitionObject;
305 result.present = false;
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;
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);
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);
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);
343 'kind': 'Property Definition',
345 'vnf-parameter-list': []
347 yamlObject['vnf-parameter-list'] = pdFileObject;
348 yamlObject = this.removeUnwantedvalues(yamlObject);
349 let yamlStringTemp = YAML.stringify(yamlObject, 6, 1);
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], {
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;
364 this.sendPD(JSON.stringify(yamlString));
367 //Restore Keys for display
368 for (var i = 0; i < this.modelParamDefinitionObjects.length; i++) {
369 this.formatKeys(this.modelParamDefinitionObjects[i]);
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
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)) {
393 pValue = this.parameterNameValues[key];
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
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];
412 parameterDefinitionObject['source'] = fields[0];
413 parameterDefinitionObject['rule-type'] = fields[1];
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);
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';
425 this.displayParamObjects = this.modelParamDefinitionObjects.slice(0);
426 this.paramShareService.setDisplayData(this.displayParamObjects);
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');
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;
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);
457 this.displayParamObjects = this.modelParamDefinitionObjects = [];
459 this.populateDataUponSource(this.displayParamObjects);
460 return this.displayParamObjects;
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');
468 var pdObject = YAML.parse(result);
469 let fileModel = pdObject['vnf-parameter-list'];
470 this.populatePD(fileModel);
471 return this.displayParamObjects;