ea7fa616cf1f789e35d4077e6f5e795542328457
[osm/NG-UI.git] / src / app / utilities / ns-instances-action / NSInstancesActionComponent.ts
1 /*
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 InstancesAction Component
20  */
21 import { isNullOrUndefined } from 'util';
22 import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core';
23 import { Router } from '@angular/router';
24 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
25 import { TranslateService } from '@ngx-translate/core';
26 import { NotifierService } from 'angular-notifier';
27 import { ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
28 import { DeleteComponent } from 'DeleteComponent';
29 import { environment } from 'environment';
30 import { NSDDetails } from 'NSDModel';
31 import { NSDInstanceData } from 'NSInstanceModel';
32 import { NSPrimitiveComponent } from 'NSPrimitiveComponent';
33 import { NsUpdateComponent } from 'NsUpdateComponent';
34 import { RestService } from 'RestService';
35 import { forkJoin, Observable } from 'rxjs';
36 import { ScalingComponent } from 'ScalingComponent';
37 import { SharedService } from 'SharedService';
38 import { ShowInfoComponent } from 'ShowInfoComponent';
39 import { StartStopRebuildComponent } from 'StartStopRebuildComponent';
40 import { VerticalScalingComponent } from 'VerticalScalingComponent';
41 import { VmMigrationComponent } from 'VmMigrationComponent';
42 import { DF, VDU, VNFD } from 'VNFDModel';
43 /**
44  * Creating component
45  * @Component takes NSInstancesActionComponent.html as template url
46  */
47 @Component({
48   templateUrl: './NSInstancesActionComponent.html',
49   styleUrls: ['./NSInstancesActionComponent.scss'],
50   changeDetection: ChangeDetectionStrategy.OnPush
51 })
52 /** Exporting a class @exports NSInstancesActionComponent */
53 export class NSInstancesActionComponent {
54   /** To get the value from the nspackage via valuePrepareFunction default Property of ng-smarttable @public */
55   public value: NSDInstanceData;
56
57   /** Invoke service injectors @public */
58   public injector: Injector;
59
60   /** Instance of the modal service @public */
61   public restService: RestService;
62
63   /** Config Status Check @public */
64   public configStatus: string;
65
66   /** Operational Status Check @public */
67   public operationalStatus: string;
68
69   /** CNF Status Check @public */
70   public k8sStatus: boolean = false;
71
72   /** get Admin Details @public */
73   public getAdminDetails: {};
74
75   /** Scaling is accepted @public */
76   public isScalingPresent: boolean = false;
77
78   /** Check the loading results for loader status @public */
79   public isLoadingNSInstanceAction: boolean = false;
80
81   /** Give the message for the loading @public */
82   public message: string = 'PLEASEWAIT';
83
84   /** Assign the VNF Details @public */
85   public vnfDetails: VNFD[] = [];
86
87   /** Contains instance ID @public */
88   public instanceID: string;
89
90   /** Contains operational dashboard view @public */
91   public isShowOperationalDashboard: boolean = false;
92
93   /** Instance of the modal service @private */
94   private modalService: NgbModal;
95
96   /** Holds teh instance of AuthService class of type AuthService @private */
97   private router: Router;
98
99   /** Contains all methods related to shared @private */
100   private sharedService: SharedService;
101
102   /** Notifier service to popup notification @private */
103   private notifierService: NotifierService;
104
105   /** Contains tranlsate instance @private */
106   private translateService: TranslateService;
107
108   /** Detect changes for the User Input */
109   private cd: ChangeDetectorRef;
110
111   /** Set timeout @private */
112   // eslint-disable-next-line @typescript-eslint/no-magic-numbers
113   private timeOut: number = 100;
114
115   constructor(injector: Injector) {
116     this.injector = injector;
117     this.modalService = this.injector.get(NgbModal);
118     this.restService = this.injector.get(RestService);
119     this.router = this.injector.get(Router);
120     this.sharedService = this.injector.get(SharedService);
121     this.notifierService = this.injector.get(NotifierService);
122     this.translateService = this.injector.get(TranslateService);
123     this.cd = this.injector.get(ChangeDetectorRef);
124   }
125
126   /**
127    * Lifecyle Hooks the trigger before component is instantiate
128    */
129   public ngOnInit(): void {
130     this.configStatus = this.value.ConfigStatus;
131     this.operationalStatus = this.value.OperationalStatus;
132     this.instanceID = this.value.identifier;
133     this.getAdminDetails = this.value.adminDetails;
134     for (const key of Object.keys(this.getAdminDetails)) {
135       if (key === 'deployed') {
136         // eslint-disable-next-line security/detect-object-injection
137         const adminData: {} = this.getAdminDetails[key];
138         for (const k8sData of Object.keys(adminData)) {
139           if (k8sData === 'K8s') {
140             // eslint-disable-next-line security/detect-object-injection
141             if (adminData[k8sData].length !== 0) {
142               this.k8sStatus = true;
143             }
144           }
145         }
146       }
147     }
148     this.isShowOperationalDashboard = !isNullOrUndefined(this.value.vcaStatus) ?
149       Object.keys(this.value.vcaStatus).length === 0 && typeof this.value.vcaStatus === 'object' : true;
150   }
151
152   /** Shows information using modalservice @public */
153   public infoNs(): void {
154     // eslint-disable-next-line security/detect-non-literal-fs-filename
155     this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = {
156       id: this.instanceID,
157       page: 'ns-instance',
158       titleName: 'INSTANCEDETAILS'
159     };
160   }
161
162   /** Delete NS Instanace @public */
163   public deleteNSInstance(forceAction: boolean): void {
164     // eslint-disable-next-line security/detect-non-literal-fs-filename
165     const modalRef: NgbModalRef = this.modalService.open(DeleteComponent, { backdrop: 'static' });
166     modalRef.componentInstance.params = { forceDeleteType: forceAction };
167     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
168       if (result) {
169         this.sharedService.callData();
170       }
171     }).catch((): void => {
172       // Catch Navigation Error
173   });
174   }
175
176   /** History of operations for an Instanace @public */
177   public historyOfOperations(): void {
178     this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch((): void => {
179       // Catch Navigation Error
180     });
181   }
182
183   /** NS Topology */
184   public nsTopology(): void {
185     this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
186       // Catch Navigation Error
187     });
188   }
189
190   /** Exec NS Primitive @public */
191   public execNSPrimitiveModal(): void {
192     // eslint-disable-next-line security/detect-non-literal-fs-filename
193     this.modalService.open(NSPrimitiveComponent, { backdrop: 'static' }).componentInstance.params = {
194       memberIndex: this.value.memberIndex,
195       nsConfig: this.value.nsConfig,
196       name: this.value.NsdName,
197       id: this.value.constituent
198     };
199   }
200
201   /** Redirect to Grafana Metrics @public */
202   public metrics(): void {
203     this.isLoadingNSInstanceAction = true;
204     this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]): void => {
205       nsData['vnfd-id'].forEach((vnfdID: string[]): void => {
206         this.restService.getResource(environment.VNFPACKAGES_URL + '/' + vnfdID)
207           .subscribe((vnfd: VNFD): void => {
208             vnfd.vdu.forEach((vduData: VDU): void => {
209               if (vduData['monitoring-parameter'] !== undefined && vduData['monitoring-parameter'].length > 0) {
210                 this.isLoadingNSInstanceAction = false;
211                 const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics';
212                 // eslint-disable-next-line security/detect-non-literal-fs-filename
213                 window.open(location);
214               } else {
215                 this.isLoadingNSInstanceAction = false;
216                 this.notifierService.notify('error', this.translateService.instant('PAGE.NSMETRIC.METRICERROR'));
217               }
218             });
219             this.doChanges();
220           }, (error: ERRORDATA): void => {
221             this.restService.handleError(error, 'get');
222             this.isLoadingNSInstanceAction = false;
223           });
224       });
225     }, (error: ERRORDATA): void => {
226       this.restService.handleError(error, 'get');
227       this.isLoadingNSInstanceAction = false;
228     });
229   }
230
231   /**
232    * Do the manual scaling
233    * Here we are going to get a list of VNFD ID used in the instances
234    * and have this in array with URL created then pass to checkscaling method for forkjoin to get the data @public
235    */
236   public manualScaling(): void {
237     this.isLoadingNSInstanceAction = true;
238     const tempURL: Observable<{}>[] = [];
239     this.value.vnfID.forEach((id: string): void => {
240       const apiUrl: string = environment.VNFPACKAGESCONTENT_URL + '/' + id;
241       tempURL.push(this.restService.getResource(apiUrl));
242     });
243     this.checkScaling(tempURL);
244   }
245
246   /**
247    * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
248    */
249   public checkScaling(URLS: Observable<{}>[]): void {
250     forkJoin(URLS).subscribe((data: VNFD[]): void => {
251       this.vnfDetails = data;
252       if (this.vnfDetails.length > 0) {
253         this.vnfDetails.forEach((vnfdData: VNFD): void => {
254           vnfdData.df.forEach((dfData: DF): void => {
255             if (!isNullOrUndefined(dfData['scaling-aspect']) && dfData['scaling-aspect'].length > 0) {
256               this.isScalingPresent = true;
257             }
258           });
259         });
260       }
261       this.isLoadingNSInstanceAction = false;
262       if (this.isScalingPresent) {
263         this.openScaling();
264       } else {
265         this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
266       }
267       this.doChanges();
268     });
269   }
270
271   /** Open the scaling pop-up @public */
272   public openScaling(): void {
273     // eslint-disable-next-line security/detect-non-literal-fs-filename
274     const modalRef: NgbModalRef = this.modalService.open(ScalingComponent, { backdrop: 'static' });
275     modalRef.componentInstance.params = {
276       id: this.instanceID,
277       vnfID: this.value.vnfID,
278       nsID: this.value['nsd-id'],
279       nsd: this.value.nsd,
280       data: this.vnfDetails
281     };
282     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
283       if (result) {
284         this.sharedService.callData();
285       }
286     }).catch((): void => {
287       // Catch Navigation Error
288   });
289   }
290
291   /** To open VM Migration in NS Instances */
292   public openVmMigration(): void {
293     // eslint-disable-next-line security/detect-non-literal-fs-filename
294     const modalRef: NgbModalRef = this.modalService.open(VmMigrationComponent, { backdrop: 'static' });
295     modalRef.componentInstance.params = {
296       id: this.instanceID
297     };
298     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
299       if (result) {
300         this.sharedService.callData();
301       }
302     }).catch((): void => {
303       // Catch Navigation Error
304   });
305   }
306
307   /** To open the Ns Update pop-up */
308   public openNsUpdate(): void {
309     // eslint-disable-next-line security/detect-non-literal-fs-filename
310     const modalRef: NgbModalRef = this.modalService.open(NsUpdateComponent, { backdrop: 'static' });
311     modalRef.componentInstance.params = {
312       id: this.instanceID
313     };
314     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
315       if (result) {
316         this.sharedService.callData();
317       }
318     }).catch((): void => {
319       // Catch Navigation Error
320   });
321   }
322
323   /** To open the Start, Stop & Rebuild pop-up */
324   public openStart(actionType: string): void {
325     // eslint-disable-next-line security/detect-non-literal-fs-filename
326     const modalRef: NgbModalRef = this.modalService.open(StartStopRebuildComponent, { backdrop: 'static' });
327     modalRef.componentInstance.params = {
328       id: this.instanceID
329     };
330     if (actionType === 'start') {
331       modalRef.componentInstance.instanceTitle = this.translateService.instant('START');
332     } else if (actionType === 'stop') {
333       modalRef.componentInstance.instanceTitle = this.translateService.instant('STOP');
334     } else {
335       modalRef.componentInstance.instanceTitle = this.translateService.instant('REBUILD');
336     }
337     modalRef.componentInstance.instanceType = actionType;
338     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
339       if (result) {
340         this.sharedService.callData();
341       }
342     }).catch((): void => {
343       // Catch Navigation Error
344   });
345   }
346
347   /** To open the vertical Scaling pop-up */
348   public openVerticalScaling(): void {
349     // eslint-disable-next-line security/detect-non-literal-fs-filename
350     const modalRef: NgbModalRef = this.modalService.open(VerticalScalingComponent, { backdrop: 'static' });
351     modalRef.componentInstance.params = {
352       id: this.instanceID
353     };
354     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
355       if (result) {
356         this.sharedService.callData();
357       }
358     }).catch((): void => {
359       // Catch Navigation Error
360   });
361   }
362
363   /**
364    * Check any changes in the child component @public
365    */
366   public doChanges(): void {
367     setTimeout((): void => {
368       this.cd.detectChanges();
369     }, this.timeOut);
370   }
371 }