blob: 50f7707cd615bb052eaa534f8be81ba1b6aa1610 [file] [log] [blame]
kumaran.m3b4814a2020-05-01 19:48:54 +05301/*
2 Copyright 2020 TATA ELXSI
3
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
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
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.
15
16 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
17 */
18/**
19 * @file NS Instance Primitive Component
20 */
21import { Component, Injector, Input, OnInit } from '@angular/core';
22import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
23import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
24import { TranslateService } from '@ngx-translate/core';
25import { NotifierService } from 'angular-notifier';
Barath Kumar R063a3f12020-12-29 16:35:09 +053026import { APIURLHEADER, ERRORDATA, PRIMITIVEDATA, PRIMITIVETYPES, URLPARAMS } from 'CommonModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053027import { DataService } from 'DataService';
28import { environment } from 'environment';
Barath Kumar R063a3f12020-12-29 16:35:09 +053029import { KDUPRIMITIVELEVEL, NSData, VDUPRIMITIVELEVEL, VNFPROFILE } from 'NSDModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053030import { NSPrimitiveParams } from 'NSInstanceModel';
31import { RestService } from 'RestService';
32import { SharedService } from 'SharedService';
33import { isNullOrUndefined } from 'util';
Barath Kumar R063a3f12020-12-29 16:35:09 +053034import { CONFIGPRIMITIVE, DF, VDUCONFIG, VDUPROFILE, VNFCONFIG, VNFD } from 'VNFDModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053035
36/**
37 * Creating component
38 * @Component takes NSPrimitiveComponent.html as template url
39 */
40@Component({
41 templateUrl: './NSPrimitiveComponent.html',
42 styleUrls: ['./NSPrimitiveComponent.scss']
43})
44/** Exporting a class @exports NSPrimitiveComponent */
45export class NSPrimitiveComponent implements OnInit {
46 /** Form valid on submit trigger @public */
47 public submitted: boolean = false;
48
49 /** To inject services @public */
50 public injector: Injector;
51
52 /** Instance for active modal service @public */
53 public activeModal: NgbActiveModal;
54
55 /** FormGroup instance added to the form @ html @public */
56 public primitiveForm: FormGroup;
57
58 /** Primitive params array @public */
59 public primitiveParams: FormArray;
60
61 /** Variable set for twoway binding @public */
62 public nsdId: string;
63
64 /** Check the loading results @public */
65 public isLoadingResults: boolean = false;
66
67 /** Give the message for the loading @public */
68 public message: string = 'PLEASEWAIT';
69
70 /** Contains list of primitive parameter @public */
71 public primitiveParameter: {}[] = [];
72
73 /** Input contains component objects @public */
74 @Input() public params: URLPARAMS;
75
76 /** Contains list of primitive actions @public */
77 public primitiveList: {}[];
78
79 /** Contains objects that is used to hold types of primitive @public */
Barath Kumar R063a3f12020-12-29 16:35:09 +053080 public primitiveTypeList: PRIMITIVETYPES[] = [];
kumaran.m3b4814a2020-05-01 19:48:54 +053081
82 /** Model value used to hold selected primitive type @public */
83 public primitiveType: string;
84
Barath Kumar R6e96d1b2020-07-10 12:10:15 +053085 /** Contains list of VDU primitive lists @public */
Barath Kumar R063a3f12020-12-29 16:35:09 +053086 public vduList: VDUPROFILE[];
Barath Kumar R6e96d1b2020-07-10 12:10:15 +053087
Barath Kumar R5d75d512020-09-02 17:00:07 +053088 /** Contains list of KDU primitive lists @public */
89 public kduList: {}[];
90
kumaran.m3b4814a2020-05-01 19:48:54 +053091 /** FormBuilder instance added to the formBuilder @private */
92 private formBuilder: FormBuilder;
93
94 /** Utilizes rest service for any CRUD operations @private */
95 private restService: RestService;
96
97 /** packages data service collections @private */
98 private dataService: DataService;
99
100 /** Contains tranlsate instance @private */
101 private translateService: TranslateService;
102
103 /** Notifier service to popup notification @private */
104 private notifierService: NotifierService;
105
106 /** Contains all methods related to shared @private */
107 private sharedService: SharedService;
108
109 /** Contains objects that is used to convert key/value pair @private */
110 private objectPrimitiveParams: {} = {};
111
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);
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530121 this.primitiveTypeList = [
122 {
Barath Kumar R54d693c2020-07-13 20:54:13 +0530123 title: this.translateService.instant('NSPRIMITIVE'),
124 value: 'NS_Primitive'
125 },
126 {
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530127 title: this.translateService.instant('VNFPRIMITIVE'),
128 value: 'VNF_Primitive'
129 },
130 {
131 title: this.translateService.instant('VDUPRIMITIVE'),
132 value: 'VDU_Primitive'
Barath Kumar R5d75d512020-09-02 17:00:07 +0530133 },
134 {
135 title: this.translateService.instant('KDUPRIMITIVE'),
136 value: 'KDU_Primitive'
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530137 }
138 ];
kumaran.m3b4814a2020-05-01 19:48:54 +0530139 }
140
Barath Kumar R063a3f12020-12-29 16:35:09 +0530141 /** convenience getter for easy access to form fields */
142 get f(): FormGroup['controls'] { return this.primitiveForm.controls; }
143
kumaran.m3b4814a2020-05-01 19:48:54 +0530144 /**
145 * Lifecyle Hooks the trigger before component is instantiate
146 */
147 public ngOnInit(): void {
148 /** Setting up initial value for NSD */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530149 this.dataService.currentMessage.subscribe((event: NSData): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530150 if (event.identifier !== undefined || event.identifier !== '' || event.identifier !== null) {
151 this.nsdId = event.identifier;
152 }
153 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530154 this.initializeForm();
155 }
156
kumaran.m3b4814a2020-05-01 19:48:54 +0530157 /** initialize Forms @public */
158 public initializeForm(): void {
159 this.primitiveForm = this.formBuilder.group({
160 primitive: [null, [Validators.required]],
Barath Kumar R063a3f12020-12-29 16:35:09 +0530161 member_vnf_index: [null, [Validators.required]],
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530162 vdu_id: [null, [Validators.required]],
Barath Kumar R5d75d512020-09-02 17:00:07 +0530163 kdu_name: [null, [Validators.required]],
kumaran.m3b4814a2020-05-01 19:48:54 +0530164 primitive_params: this.formBuilder.array([this.primitiveParamsBuilder()])
165 });
166 }
167
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]]
173 });
174 }
175
176 /** Handle FormArray Controls @public */
177 public getControls(): AbstractControl[] {
178 return (this.getFormControl('primitive_params') as FormArray).controls;
179 }
180
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());
185 }
186
187 /** Remove primitive params on user's action @public */
188 public removePrimitiveParams(index: number): void {
189 this.primitiveParams.removeAt(index);
190 }
191
Barath Kumar R5d75d512020-09-02 17:00:07 +0530192 /** Execute Primitive @public */
193 public execPrimitive(): void {
kumaran.m3b4814a2020-05-01 19:48:54 +0530194 this.submitted = true;
195 this.objectPrimitiveParams = {};
196 this.sharedService.cleanForm(this.primitiveForm);
197 if (this.primitiveForm.invalid) { return; } // Proceed, onces form is valid
Barath Kumar R063a3f12020-12-29 16:35:09 +0530198 this.primitiveForm.value.primitive_params.forEach((params: NSPrimitiveParams): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530199 if (params.primitive_params_name !== null && params.primitive_params_value !== '') {
200 this.objectPrimitiveParams[params.primitive_params_name] = params.primitive_params_value;
201 }
202 });
203 //Prepare primitive params
204 const primitiveParamsPayLoads: {} = {
205 primitive: this.primitiveForm.value.primitive,
206 primitive_params: this.objectPrimitiveParams
207 };
208 if (this.primitiveType === 'VNF_Primitive') {
209 // tslint:disable-next-line: no-string-literal
Barath Kumar R063a3f12020-12-29 16:35:09 +0530210 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
kumaran.m3b4814a2020-05-01 19:48:54 +0530211 }
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530212 if (this.primitiveType === 'VDU_Primitive') {
213 // tslint:disable-next-line: no-string-literal
Barath Kumar R063a3f12020-12-29 16:35:09 +0530214 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530215 // tslint:disable-next-line: no-string-literal
216 primitiveParamsPayLoads['vdu_id'] = this.primitiveForm.value.vdu_id;
217 }
Barath Kumar R5d75d512020-09-02 17:00:07 +0530218 if (this.primitiveType === 'KDU_Primitive') {
219 // tslint:disable-next-line: no-string-literal
Barath Kumar R063a3f12020-12-29 16:35:09 +0530220 primitiveParamsPayLoads['member_vnf_index'] = this.primitiveForm.value.member_vnf_index;
Barath Kumar R5d75d512020-09-02 17:00:07 +0530221 // tslint:disable-next-line: no-string-literal
222 primitiveParamsPayLoads['kdu_name'] = this.primitiveForm.value.kdu_name;
223 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530224 const apiURLHeader: APIURLHEADER = {
225 url: environment.NSDINSTANCES_URL + '/' + this.nsdId + '/action'
226 };
227 this.isLoadingResults = true;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530228 this.restService.postResource(apiURLHeader, primitiveParamsPayLoads).subscribe((result: {}): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530229 this.activeModal.dismiss();
230 this.notifierService.notify('success', this.translateService.instant('PAGE.NSPRIMITIVE.EXECUTEDSUCCESSFULLY'));
231 this.isLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530232 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530233 this.isLoadingResults = false;
234 this.restService.handleError(error, 'post');
235 });
236 }
237 /** Primitive type change event @public */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530238 public primitiveTypeChange(data: PRIMITIVETYPES): void {
kumaran.m3b4814a2020-05-01 19:48:54 +0530239 this.primitiveList = [];
240 this.primitiveParameter = [];
241 this.initializeForm();
242 if (data.value === 'NS_Primitive') {
Barath Kumar R54d693c2020-07-13 20:54:13 +0530243 this.getNSInfo(this.params.name);
Barath Kumar R063a3f12020-12-29 16:35:09 +0530244 this.setUpdateValueandValidation('member_vnf_index');
Barath Kumar R5d75d512020-09-02 17:00:07 +0530245 }
246 if (data.value === 'VNF_Primitive' || data.value === 'KDU_Primitive' || data.value === 'NS_Primitive') {
247 this.setUpdateValueandValidation('vdu_id');
248 }
249 if (data.value === 'VDU_Primitive' || data.value === 'VNF_Primitive' || data.value === 'NS_Primitive') {
250 this.setUpdateValueandValidation('kdu_name');
kumaran.m3b4814a2020-05-01 19:48:54 +0530251 }
252 }
253 /** Member index change event */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530254 public indexChange(data: VNFPROFILE, getType?: string): void {
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530255 this.getFormControl('vdu_id').setValue(null);
Barath Kumar R5d75d512020-09-02 17:00:07 +0530256 this.getFormControl('kdu_name').setValue(null);
Barath Kumar R063a3f12020-12-29 16:35:09 +0530257 if (data['vnfd-id'] !== null) {
258 this.getVnfdInfo(data['vnfd-id'], getType);
kumaran.m3b4814a2020-05-01 19:48:54 +0530259 } else {
260 this.primitiveList = [];
261 this.getFormControl('primitive').setValue(null);
262 this.primitiveParameter = [];
263 }
264 }
Barath Kumar R5d75d512020-09-02 17:00:07 +0530265 /** 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'];
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530268 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530269 /** Primivtive change event */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530270 public primitiveChange(data: PRIMITIVEDATA): void {
kumaran.m3b4814a2020-05-01 19:48:54 +0530271 this.primitiveParameter = [];
272 const formArr: FormArray = this.getFormControl('primitive_params') as FormArray;
273 formArr.controls = [];
274 this.createPrimitiveParams();
275 if (data) {
276 this.updatePrimitive(data);
277 }
278 }
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530279 /** Generate vdu section @public */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530280 public generateVDUData(vduData: VDUPROFILE, vduConfig: VDUCONFIG[]): VDUPROFILE {
281 const getVDUConfig: VDUCONFIG = vduConfig.filter((itemData: VDUCONFIG): boolean =>
282 itemData.id === vduData['vdu-configuration-id'])[0];
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530283 return {
284 id: vduData.id,
Barath Kumar R063a3f12020-12-29 16:35:09 +0530285 name: vduData.id,
286 'vdu-configuration': getVDUConfig
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530287 };
288 }
Barath Kumar R5d75d512020-09-02 17:00:07 +0530289 /** Generate kdu section @public */
290 public generateKDUData(kduData: KDUPRIMITIVELEVEL): KDUPRIMITIVELEVEL {
291 return {
292 name: kduData.name,
293 'juju-bundle': kduData['juju-bundle'],
294 'kdu-configuration': kduData['kdu-configuration']
295 };
296 }
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();
301 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530302 /** Update primitive value based on parameter */
Barath Kumar R063a3f12020-12-29 16:35:09 +0530303 private updatePrimitive(primitive: PRIMITIVEDATA): void {
kumaran.m3b4814a2020-05-01 19:48:54 +0530304 if (primitive.parameter) {
305 this.primitiveParameter = primitive.parameter;
306 } else {
307 this.primitiveParameter = [];
308 const formArr: AbstractControl[] = this.getControls();
Barath Kumar R063a3f12020-12-29 16:35:09 +0530309 formArr.forEach((formGp: FormGroup): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530310 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();
314 });
315 }
316 }
317 /** Get primivitive actions from vnfd data */
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530318 private getVnfdInfo(vnfdRef: string, getType?: string): void {
kumaran.m3b4814a2020-05-01 19:48:54 +0530319 this.primitiveList = [];
320 this.primitiveParameter = [];
321 this.getFormControl('primitive').setValue(null);
Barath Kumar R063a3f12020-12-29 16:35:09 +0530322 const apiUrl: string = environment.VNFPACKAGES_URL + '?product-name=' + vnfdRef;
kumaran.m3b4814a2020-05-01 19:48:54 +0530323 this.isLoadingResults = true;
324 this.restService.getResource(apiUrl)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530325 .subscribe((vnfdInfo: VNFD[]): void => {
326 const vnfInstances: VNFD = vnfdInfo[0];
327 if (!isNullOrUndefined(vnfInstances.df) && !isNullOrUndefined(vnfInstances['vnf-configuration'])) {
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530328 this.getFormControl('vdu_id').setValidators([]);
Barath Kumar R5d75d512020-09-02 17:00:07 +0530329 this.getFormControl('kdu_name').setValidators([]);
Barath Kumar R063a3f12020-12-29 16:35:09 +0530330 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'];
335 }
336 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530337 }
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530338 if (getType === 'VDU_Primitive') {
Barath Kumar R5d75d512020-09-02 17:00:07 +0530339 this.kduList = [];
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530340 this.vduList = [];
Barath Kumar Rd3ce0c52020-08-13 11:44:01 +0530341 this.primitiveList = [];
Barath Kumar R063a3f12020-12-29 16:35:09 +0530342 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);
348 });
Barath Kumar R5d75d512020-09-02 17:00:07 +0530349 }
350 });
351 }
352 }
353 if (getType === 'KDU_Primitive') {
354 this.kduList = [];
355 this.vduList = [];
356 this.primitiveList = [];
Barath Kumar R063a3f12020-12-29 16:35:09 +0530357 if (!isNullOrUndefined(vnfInstances.kdu)) {
358 vnfInstances.kdu.forEach((kduData: KDUPRIMITIVELEVEL): void => {
Barath Kumar R5d75d512020-09-02 17:00:07 +0530359 if (kduData['kdu-configuration']) {
360 const kduDataObj: KDUPRIMITIVELEVEL = this.generateKDUData(kduData);
361 this.kduList.push(kduDataObj);
362 }
363 });
364 }
Barath Kumar R6e96d1b2020-07-10 12:10:15 +0530365 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530366 this.isLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530367 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530368 this.isLoadingResults = false;
369 this.restService.handleError(error, 'get');
370 });
371 }
Barath Kumar R54d693c2020-07-13 20:54:13 +0530372 /** Get primivitive actions from NSD data */
373 private getNSInfo(nsdRef: string): void {
374 this.primitiveList = [];
375 this.primitiveParameter = [];
376 this.getFormControl('primitive').setValue(null);
Barath Kumar R063a3f12020-12-29 16:35:09 +0530377 const apiUrl: string = environment.NSDESCRIPTORS_URL + '?name=' + nsdRef;
Barath Kumar R54d693c2020-07-13 20:54:13 +0530378 this.isLoadingResults = true;
379 this.restService.getResource(apiUrl)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530380 .subscribe((nsdInfo: {}): void => {
Barath Kumar Rd3ce0c52020-08-13 11:44:01 +0530381 if (!isNullOrUndefined(nsdInfo[0]['ns-configuration'])) {
382 this.primitiveList = !isNullOrUndefined(nsdInfo[0]['ns-configuration']['config-primitive']) ?
Barath Kumar R5d75d512020-09-02 17:00:07 +0530383 nsdInfo[0]['ns-configuration']['config-primitive'] : [];
Barath Kumar Rd3ce0c52020-08-13 11:44:01 +0530384 } else {
385 this.primitiveList = [];
386 }
Barath Kumar R54d693c2020-07-13 20:54:13 +0530387 this.isLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530388 }, (error: ERRORDATA): void => {
Barath Kumar R54d693c2020-07-13 20:54:13 +0530389 this.isLoadingResults = false;
390 this.restService.handleError(error, 'get');
391 });
392 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530393 /** Used to get the AbstractControl of controlName passed @private */
394 private getFormControl(controlName: string): AbstractControl {
395 return this.primitiveForm.controls[controlName];
396 }
397}