2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
6 Copyright (C) 2018 IBM.
7 ===================================================================
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
14 http://www.apache.org/licenses/LICENSE-2.0
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============================================
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';
36 let YAML = require('yamljs');
41 export class ParameterDefinitionService {
43 public vnfcTypeData: string = '';
44 public selectedUploadType: string;
45 @ViewChild(ModalComponent) modalComponent: ModalComponent;
47 public parameterDefinitionMap: { [index: string]: string; } = {};
48 public parameterNameValues = {};
49 public displayParamObjects;
50 public modelParamDefinitionObjects;
54 public refNameObj = {};
58 public appDataObject: any;
59 public downloadDataObject: any;
60 public artifact_fileName;
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) {
78 public setValues(vnfType, vnfcType, protocol, action, artifactName) {
79 this.vnfType = vnfType;
80 this.vnfcType = vnfcType;
81 this.protocol = protocol;
83 this.artifact_fileName = artifactName;
86 public afterInit(artifactName, displayParamObjects) {
90 //========================== End of saveChanges() Method============================================
91 /* Saves pd to appc */
92 public sendPD(yamlString: String) {
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 + '}';
98 'request-id': this.apiToken,
99 'action': 'uploadArtifact',
104 this.appDataObject.pd = input;
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'];
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;
128 parameter.showFilterFields = false;
131 } else if (parameter.source == 'Manual') {
132 parameter.ruleTypeValues = [null];
135 parameter.ruleTypeValues = [parameter['rule-type']];
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);
154 return this.displayParamObjects;
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]);
165 //========================== End of formatResponseForKey() Method============================================
166 /* Formats for responsekeys of each object */
167 formatKeys(parameterDefinitionObject: any) {
168 if (null == parameterDefinitionObject || undefined === parameterDefinitionObject)
170 if (null == parameterDefinitionObject['response-keys'])
171 parameterDefinitionObject['response-keys'] = [{}];
172 for (var j = 0; j < 5; j++) {
177 if (undefined == parameterDefinitionObject['response-keys'][j] || null == parameterDefinitionObject['response-keys'][j]) {
178 parameterDefinitionObject['response-keys'].push(keysObj);
180 if (undefined == parameterDefinitionObject['response-keys'][j]['key-name']) {
181 parameterDefinitionObject['response-keys'][j]['key-name'] = null;
183 if (undefined == parameterDefinitionObject['response-keys'][j]['key-value']) {
184 parameterDefinitionObject['response-keys'][j]['key-value'] = null;
187 if (null == parameterDefinitionObject['request-keys'])
188 parameterDefinitionObject['request-keys'] = [{}];
189 for (var k = 0; k < 3; k++) {
194 if (undefined == parameterDefinitionObject['request-keys'][k] || null == parameterDefinitionObject['request-keys'][k]) {
195 parameterDefinitionObject['request-keys'].push(keysObj);
197 if (undefined == parameterDefinitionObject['request-keys'][k]['key-name']) {
198 parameterDefinitionObject['request-keys'][k]['key-name'] = null;
200 if (undefined == parameterDefinitionObject['request-keys'][k]['key-value']) {
201 parameterDefinitionObject['request-keys'][k]['key-value'] = null;
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;
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'];
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'];
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'];
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'];
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'];
246 saveModel[i]['response-keys-new'] = null;
248 delete saveModel[i]['response-keys'];
249 saveModel[i]['response-keys'] = saveModel[i]['response-keys-new'];
250 delete saveModel[i]['response-keys-new'];
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'];
262 fileModel[i]['response-keys-new'] = [{}];
263 for (var prop in testObj[0]) {
264 if (testObj[0].hasOwnProperty(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];
272 delete fileModel[i]['response-keys'];
273 fileModel[i]['response-keys'] = fileModel[i]['response-keys-new'];
274 delete fileModel[i]['response-keys=new'];
280 //========================== End of openModal() Method============================================
281 getCorrectParameterDefinitionObject(paramName: string) {
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;
294 var parameterDefinitionObject = {
302 'response-keys': [{}],
305 result.obj = parameterDefinitionObject;
306 result.present = false;
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;
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);
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);
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);
344 'kind': 'Property Definition',
346 'vnf-parameter-list': []
348 yamlObject['vnf-parameter-list'] = pdFileObject;
349 yamlObject = this.removeUnwantedvalues(yamlObject);
350 let yamlStringTemp = YAML.stringify(yamlObject, 6, 1);
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], {
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;
365 this.sendPD(JSON.stringify(yamlString));
368 //Restore Keys for display
369 for (var i = 0; i < this.modelParamDefinitionObjects.length; i++) {
370 this.formatKeys(this.modelParamDefinitionObjects[i]);
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
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)) {
394 pValue = this.parameterNameValues[key];
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
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];
413 parameterDefinitionObject['source'] = fields[0];
414 parameterDefinitionObject['rule-type'] = fields[1];
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);
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';
426 this.displayParamObjects = this.modelParamDefinitionObjects.slice(0);
427 this.paramShareService.setDisplayData(this.displayParamObjects);
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);
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;
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);
458 this.displayParamObjects = this.modelParamDefinitionObjects = [];
460 this.populateDataUponSource(this.displayParamObjects);
461 return this.displayParamObjects;
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);
469 var pdObject = YAML.parse(result);
470 let fileModel = pdObject['vnf-parameter-list'];
471 this.populatePD(fileModel);
472 return this.displayParamObjects;