2 Copyright 2020 TATA ELXSI
4 Licensed under the Apache License, Version 2.0 (the 'License');
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
16 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
19 * @file NS Instance Primitive Component
21 import { Component, Injector, Input, OnInit } from '@angular/core';
22 import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
23 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
24 import { TranslateService } from '@ngx-translate/core';
25 import { NotifierService } from 'angular-notifier';
26 import { APIURLHEADER, ERRORDATA, PRIMITIVEDATA, PRIMITIVETYPES, URLPARAMS } from 'CommonModel';
27 import { DataService } from 'DataService';
28 import { environment } from 'environment';
29 import { KDUPRIMITIVELEVEL, NSData, VDUPRIMITIVELEVEL, VNFPROFILE } from 'NSDModel';
30 import { NSPrimitiveParams } from 'NSInstanceModel';
31 import { RestService } from 'RestService';
32 import { SharedService } from 'SharedService';
33 import { isNullOrUndefined } from 'util';
34 import { CONFIGPRIMITIVE, DF, VDUCONFIG, VDUPROFILE, VNFCONFIG, VNFD } from 'VNFDModel';
38 * @Component takes NSPrimitiveComponent.html as template url
41 templateUrl: './NSPrimitiveComponent.html',
42 styleUrls: ['./NSPrimitiveComponent.scss']
44 /** Exporting a class @exports NSPrimitiveComponent */
45 export class NSPrimitiveComponent implements OnInit {
46 /** Form valid on submit trigger @public */
47 public submitted: boolean = false;
49 /** To inject services @public */
50 public injector: Injector;
52 /** Instance for active modal service @public */
53 public activeModal: NgbActiveModal;
55 /** FormGroup instance added to the form @ html @public */
56 public primitiveForm: FormGroup;
58 /** Primitive params array @public */
59 public primitiveParams: FormArray;
61 /** Variable set for twoway binding @public */
64 /** Check the loading results @public */
65 public isLoadingResults: boolean = false;
67 /** Give the message for the loading @public */
68 public message: string = 'PLEASEWAIT';
70 /** Contains list of primitive parameter @public */
71 public primitiveParameter: {}[] = [];
73 /** Input contains component objects @public */
74 @Input() public params: URLPARAMS;
76 /** Contains list of primitive actions @public */
77 public primitiveList: {}[];
79 /** Contains objects that is used to hold types of primitive @public */
80 public primitiveTypeList: PRIMITIVETYPES[] = [];
82 /** Model value used to hold selected primitive type @public */
83 public primitiveType: string;
85 /** Contains list of VDU primitive lists @public */
86 public vduList: VDUPROFILE[];
88 /** Contains list of KDU primitive lists @public */
91 /** FormBuilder instance added to the formBuilder @private */
92 private formBuilder: FormBuilder;
94 /** Utilizes rest service for any CRUD operations @private */
95 private restService: RestService;
97 /** packages data service collections @private */
98 private dataService: DataService;
100 /** Contains tranlsate instance @private */
101 private translateService: TranslateService;
103 /** Notifier service to popup notification @private */
104 private notifierService: NotifierService;
106 /** Contains all methods related to shared @private */
107 private sharedService: SharedService;
109 /** Contains objects that is used to convert key/value pair @private */
110 private objectPrimitiveParams: {} = {};
112 constructor(injector: Injector) {
113 this.injector = injector;
114 this.restService = this.injector.get(RestService);
115 this.dataService = this.injector.get(DataService);
116 this.translateService = this.injector.get(TranslateService);
117 this.notifierService = this.injector.get(NotifierService);
118 this.sharedService = this.injector.get(SharedService);
119 this.activeModal = this.injector.get(NgbActiveModal);
120 this.formBuilder = this.injector.get(FormBuilder);
121 this.primitiveTypeList = [
123 title: this.translateService.instant('NSPRIMITIVE'),
124 value: 'NS_Primitive'
127 title: this.translateService.instant('VNFPRIMITIVE'),
128 value: 'VNF_Primitive'
131 title: this.translateService.instant('VDUPRIMITIVE'),
132 value: 'VDU_Primitive'
135 title: this.translateService.instant('KDUPRIMITIVE'),
136 value: 'KDU_Primitive'
141 /** convenience getter for easy access to form fields */
142 get f(): FormGroup['controls'] { return this.primitiveForm.controls; }
145 * Lifecyle Hooks the trigger before component is instantiate
147 public ngOnInit(): void {
148 /** Setting up initial value for NSD */
149 this.dataService.currentMessage.subscribe((event: NSData): void => {
150 if (event.identifier !== undefined || event.identifier !== '' || event.identifier !== null) {
151 this.nsdId = event.identifier;
154 this.initializeForm();
157 /** initialize Forms @public */
158 public initializeForm(): void {
159 this.primitiveForm = this.formBuilder.group({
160 primitive: [null, [Validators.required]],
161 member_vnf_index: [null, [Validators.required]],
162 vdu_id: [null, [Validators.required]],
163 kdu_name: [null, [Validators.required]],
164 primitive_params: this.formBuilder.array([this.primitiveParamsBuilder()])
168 /** Generate primitive params @public */
169 public primitiveParamsBuilder(): FormGroup {
170 return this.formBuilder.group({
171 primitive_params_name: [null, [Validators.required]],
172 primitive_params_value: ['', [Validators.required]]
176 /** Handle FormArray Controls @public */
177 public getControls(): AbstractControl[] {
178 return (this.getFormControl('primitive_params') as FormArray).controls;
181 /** Push all primitive params on user's action @public */
182 public createPrimitiveParams(): void {
183 this.primitiveParams = this.getFormControl('primitive_params') as FormArray;
184 this.primitiveParams.push(this.primitiveParamsBuilder());
187 /** Remove primitive params on user's action @public */
188 public removePrimitiveParams(index: number): void {
189 this.primitiveParams.removeAt(index);
192 /** Execute Primitive @public */
193 public execPrimitive(): void {
194 this.submitted = true;
195 this.objectPrimitiveParams = {};
196 this.sharedService.cleanForm(this.primitiveForm);
197 if (this.primitiveForm.invalid) { return; } // Proceed, onces form is valid
198 this.primitiveForm.value.primitive_params.forEach((params: NSPrimitiveParams): void => {
199 if (params.primitive_params_name !== null && params.primitive_params_value !== '') {
200 this.objectPrimitiveParams[params.primitive_params_name] = params.primitive_params_value;
203 //Prepare primitive params
204 const primitiveParamsPayLoads: {} = {
205 primitive: this.primitiveForm.value.primitive,
206 primitive_params: this.objectPrimitiveParams
208 if (this.primitiveType === 'VNF_Primitive') {
209 // tslint:disable-next-line: no-string-literal
210 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
212 if (this.primitiveType === 'VDU_Primitive') {
213 // tslint:disable-next-line: no-string-literal
214 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
215 // tslint:disable-next-line: no-string-literal
216 primitiveParamsPayLoads['vdu_id'] = this.primitiveForm.value.vdu_id;
218 if (this.primitiveType === 'KDU_Primitive') {
219 // tslint:disable-next-line: no-string-literal
220 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
221 // tslint:disable-next-line: no-string-literal
222 primitiveParamsPayLoads['kdu_name'] = this.primitiveForm.value.kdu_name;
224 const apiURLHeader: APIURLHEADER = {
225 url: environment.NSDINSTANCES_URL + '/' + this.nsdId + '/action'
227 this.isLoadingResults = true;
228 this.restService.postResource(apiURLHeader, primitiveParamsPayLoads).subscribe((result: {}): void => {
229 this.activeModal.dismiss();
230 this.notifierService.notify('success', this.translateService.instant('PAGE.NSPRIMITIVE.EXECUTEDSUCCESSFULLY'));
231 this.isLoadingResults = false;
232 }, (error: ERRORDATA): void => {
233 this.isLoadingResults = false;
234 this.restService.handleError(error, 'post');
237 /** Primitive type change event @public */
238 public primitiveTypeChange(data: PRIMITIVETYPES): void {
239 this.primitiveList = [];
240 this.primitiveParameter = [];
241 this.initializeForm();
242 if (data.value === 'NS_Primitive') {
243 this.getNSInfo(this.params.name);
244 this.setUpdateValueandValidation('member_vnf_index');
246 if (data.value === 'VNF_Primitive' || data.value === 'KDU_Primitive' || data.value === 'NS_Primitive') {
247 this.setUpdateValueandValidation('vdu_id');
249 if (data.value === 'VDU_Primitive' || data.value === 'VNF_Primitive' || data.value === 'NS_Primitive') {
250 this.setUpdateValueandValidation('kdu_name');
253 /** Member index change event */
254 public indexChange(data: VNFPROFILE, getType?: string): void {
255 this.getFormControl('vdu_id').setValue(null);
256 this.getFormControl('kdu_name').setValue(null);
257 if (data['vnfd-id'] !== null) {
258 this.getVnfdInfo(data['vnfd-id'], getType);
260 this.primitiveList = [];
261 this.getFormControl('primitive').setValue(null);
262 this.primitiveParameter = [];
265 /** Get VDU/KDU primitive List for the selected event @public */
266 public getPrimitiveList(data: {}, selectedType: string): void {
267 this.primitiveList = data[selectedType + '-configuration']['config-primitive'];
269 /** Primivtive change event */
270 public primitiveChange(data: PRIMITIVEDATA): void {
271 this.primitiveParameter = [];
272 const formArr: FormArray = this.getFormControl('primitive_params') as FormArray;
273 formArr.controls = [];
274 this.createPrimitiveParams();
276 this.updatePrimitive(data);
279 /** Generate vdu section @public */
280 public generateVDUData(vduData: VDUPROFILE, vduConfig: VDUCONFIG[]): VDUPROFILE {
281 const getVDUConfig: VDUCONFIG = vduConfig.filter((itemData: VDUCONFIG): boolean =>
282 itemData.id === vduData['vdu-configuration-id'])[0];
286 'vdu-configuration': getVDUConfig
289 /** Generate kdu section @public */
290 public generateKDUData(kduData: KDUPRIMITIVELEVEL): KDUPRIMITIVELEVEL {
293 'juju-bundle': kduData['juju-bundle'],
294 'kdu-configuration': kduData['kdu-configuration']
297 /** Used to set the validation and value and update the validation and value @public */
298 public setUpdateValueandValidation(formName: string): void {
299 this.getFormControl(formName).setValidators([]);
300 this.getFormControl(formName).updateValueAndValidity();
302 /** Update primitive value based on parameter */
303 private updatePrimitive(primitive: PRIMITIVEDATA): void {
304 if (primitive.parameter) {
305 this.primitiveParameter = primitive.parameter;
307 this.primitiveParameter = [];
308 const formArr: AbstractControl[] = this.getControls();
309 formArr.forEach((formGp: FormGroup): void => {
310 formGp.controls.primitive_params_name.setValidators([]);
311 formGp.controls.primitive_params_name.updateValueAndValidity();
312 formGp.controls.primitive_params_value.setValidators([]);
313 formGp.controls.primitive_params_value.updateValueAndValidity();
317 /** Get primivitive actions from vnfd data */
318 private getVnfdInfo(vnfdRef: string, getType?: string): void {
319 this.primitiveList = [];
320 this.primitiveParameter = [];
321 this.getFormControl('primitive').setValue(null);
322 const apiUrl: string = environment.VNFPACKAGES_URL + '?product-name=' + vnfdRef;
323 this.isLoadingResults = true;
324 this.restService.getResource(apiUrl)
325 .subscribe((vnfdInfo: VNFD[]): void => {
326 const vnfInstances: VNFD = vnfdInfo[0];
327 if (!isNullOrUndefined(vnfInstances.df) && !isNullOrUndefined(vnfInstances['vnf-configuration'])) {
328 this.getFormControl('vdu_id').setValidators([]);
329 this.getFormControl('kdu_name').setValidators([]);
330 vnfInstances.df.forEach((df: DF): void => {
331 if (df['vnf-configuration-id'] !== undefined) {
332 const vnfprimitiveList: VNFCONFIG = vnfInstances['vnf-configuration']
333 .filter((itemData: VNFCONFIG): boolean => itemData.id === df['vnf-configuration-id'])[0];
334 this.primitiveList = vnfprimitiveList['config-primitive'];
338 if (getType === 'VDU_Primitive') {
341 this.primitiveList = [];
342 if (!isNullOrUndefined(vnfInstances.df) && !isNullOrUndefined(vnfInstances['vdu-configuration'])) {
343 vnfInstances.df.forEach((df: DF): void => {
344 if (df['vdu-profile'] !== undefined) {
345 df['vdu-profile'].forEach((element: VDUPROFILE): void => {
346 const vduDataObj: VDUPROFILE = this.generateVDUData(element, vnfInstances['vdu-configuration']);
347 this.vduList.push(vduDataObj);
353 if (getType === 'KDU_Primitive') {
356 this.primitiveList = [];
357 if (!isNullOrUndefined(vnfInstances.kdu)) {
358 vnfInstances.kdu.forEach((kduData: KDUPRIMITIVELEVEL): void => {
359 if (kduData['kdu-configuration']) {
360 const kduDataObj: KDUPRIMITIVELEVEL = this.generateKDUData(kduData);
361 this.kduList.push(kduDataObj);
366 this.isLoadingResults = false;
367 }, (error: ERRORDATA): void => {
368 this.isLoadingResults = false;
369 this.restService.handleError(error, 'get');
372 /** Get primivitive actions from NSD data */
373 private getNSInfo(nsdRef: string): void {
374 this.primitiveList = [];
375 this.primitiveParameter = [];
376 this.getFormControl('primitive').setValue(null);
377 const apiUrl: string = environment.NSDESCRIPTORS_URL + '?name=' + nsdRef;
378 this.isLoadingResults = true;
379 this.restService.getResource(apiUrl)
380 .subscribe((nsdInfo: {}): void => {
381 if (!isNullOrUndefined(nsdInfo[0]['ns-configuration'])) {
382 this.primitiveList = !isNullOrUndefined(nsdInfo[0]['ns-configuration']['config-primitive']) ?
383 nsdInfo[0]['ns-configuration']['config-primitive'] : [];
385 this.primitiveList = [];
387 this.isLoadingResults = false;
388 }, (error: ERRORDATA): void => {
389 this.isLoadingResults = false;
390 this.restService.handleError(error, 'get');
393 /** Used to get the AbstractControl of controlName passed @private */
394 private getFormControl(controlName: string): AbstractControl {
395 return this.primitiveForm.controls[controlName];