Fix Bug 1974: No.Of Hours Value for the running instances is hidden in Dashboard
[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 { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core';
22 import { Router } from '@angular/router';
23 import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
24 import { TranslateService } from '@ngx-translate/core';
25 import { NotifierService } from 'angular-notifier';
26 import { ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
27 import { DeleteComponent } from 'DeleteComponent';
28 import { environment } from 'environment';
29 import { NSDDetails } from 'NSDModel';
30 import { NSDInstanceData } from 'NSInstanceModel';
31 import { NSPrimitiveComponent } from 'NSPrimitiveComponent';
32 import { RestService } from 'RestService';
33 import { forkJoin, Observable } from 'rxjs';
34 import { ScalingComponent } from 'ScalingComponent';
35 import { SharedService } from 'SharedService';
36 import { ShowInfoComponent } from 'ShowInfoComponent';
37 import { isNullOrUndefined } from 'util';
38 import { DF, VDU, VNFD } from 'VNFDModel';
39 /**
40  * Creating component
41  * @Component takes NSInstancesActionComponent.html as template url
42  */
43 @Component({
44   templateUrl: './NSInstancesActionComponent.html',
45   styleUrls: ['./NSInstancesActionComponent.scss'],
46   changeDetection: ChangeDetectionStrategy.OnPush
47 })
48 /** Exporting a class @exports NSInstancesActionComponent */
49 export class NSInstancesActionComponent {
50   /** To get the value from the nspackage via valuePrepareFunction default Property of ng-smarttable @public */
51   public value: NSDInstanceData;
52
53   /** Invoke service injectors @public */
54   public injector: Injector;
55
56   /** Instance of the modal service @public */
57   public restService: RestService;
58
59   /** Config Status Check @public */
60   public configStatus: string;
61
62   /** Operational Status Check @public */
63   public operationalStatus: string;
64
65   /** get Admin Details @public */
66   public getAdminDetails: {};
67
68   /** Scaling is accepted @public */
69   public isScalingPresent: boolean = false;
70
71   /** Check the loading results for loader status @public */
72   public isLoadingNSInstanceAction: boolean = false;
73
74   /** Give the message for the loading @public */
75   public message: string = 'PLEASEWAIT';
76
77   /** Assign the VNF Details @public */
78   public vnfDetails: VNFD[] = [];
79
80   /** Contains instance ID @public */
81   public instanceID: string;
82
83   /** Contains operational dashboard view @public */
84   public isShowOperationalDashboard: boolean = false;
85
86   /** Instance of the modal service @private */
87   private modalService: NgbModal;
88
89   /** Holds teh instance of AuthService class of type AuthService @private */
90   private router: Router;
91
92   /** Contains all methods related to shared @private */
93   private sharedService: SharedService;
94
95   /** Notifier service to popup notification @private */
96   private notifierService: NotifierService;
97
98   /** Contains tranlsate instance @private */
99   private translateService: TranslateService;
100
101   /** Detect changes for the User Input */
102   private cd: ChangeDetectorRef;
103
104   /** Set timeout @private */
105   private timeOut: number = 100;
106
107   constructor(injector: Injector) {
108     this.injector = injector;
109     this.modalService = this.injector.get(NgbModal);
110     this.restService = this.injector.get(RestService);
111     this.router = this.injector.get(Router);
112     this.sharedService = this.injector.get(SharedService);
113     this.notifierService = this.injector.get(NotifierService);
114     this.translateService = this.injector.get(TranslateService);
115     this.cd = this.injector.get(ChangeDetectorRef);
116   }
117
118   /**
119    * Lifecyle Hooks the trigger before component is instantiate
120    */
121   public ngOnInit(): void {
122     this.configStatus = this.value.ConfigStatus;
123     this.operationalStatus = this.value.OperationalStatus;
124     this.instanceID = this.value.identifier;
125     this.getAdminDetails = this.value.adminDetails;
126     this.isShowOperationalDashboard = !isNullOrUndefined(this.value.vcaStatus) ?
127       Object.keys(this.value.vcaStatus).length === 0 && typeof this.value.vcaStatus === 'object' : true;
128   }
129
130   /** Shows information using modalservice @public */
131   public infoNs(): void {
132     this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = {
133       id: this.instanceID,
134       page: 'ns-instance',
135       titleName: 'INSTANCEDETAILS'
136     };
137   }
138
139   /** Delete NS Instanace @public */
140   public deleteNSInstance(forceAction: boolean): void {
141     const modalRef: NgbModalRef = this.modalService.open(DeleteComponent, { backdrop: 'static' });
142     modalRef.componentInstance.params = { forceDeleteType: forceAction };
143     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
144       if (result) {
145         this.sharedService.callData();
146       }
147     }).catch();
148   }
149
150   /** History of operations for an Instanace @public */
151   public historyOfOperations(): void {
152     this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch((): void => {
153       // Catch Navigation Error
154     });
155   }
156
157   /** NS Topology */
158   public nsTopology(): void {
159     this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
160       // Catch Navigation Error
161     });
162   }
163
164   /** Exec NS Primitive @public */
165   public execNSPrimitiveModal(): void {
166     this.modalService.open(NSPrimitiveComponent, { backdrop: 'static' }).componentInstance.params = {
167       memberIndex: this.value.memberIndex,
168       nsConfig: this.value.nsConfig,
169       name: this.value.NsdName
170     };
171   }
172
173   /** Redirect to Grafana Metrics @public */
174   public metrics(): void {
175     this.isLoadingNSInstanceAction = true;
176     this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]): void => {
177       nsData['vnfd-id'].forEach((vnfdID: string[]): void => {
178         this.restService.getResource(environment.VNFPACKAGES_URL + '/' + vnfdID)
179           .subscribe((vnfd: VNFD): void => {
180             vnfd.vdu.forEach((vduData: VDU): void => {
181               if (vduData['monitoring-parameter'] !== undefined && vduData['monitoring-parameter'].length > 0) {
182                 this.isLoadingNSInstanceAction = false;
183                 const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics';
184                 window.open(location);
185               } else {
186                 this.isLoadingNSInstanceAction = false;
187                 this.notifierService.notify('error', this.translateService.instant('PAGE.NSMETRIC.METRICERROR'));
188               }
189             });
190             this.doChanges();
191           }, (error: ERRORDATA): void => {
192             this.restService.handleError(error, 'get');
193             this.isLoadingNSInstanceAction = false;
194           });
195       });
196     }, (error: ERRORDATA): void => {
197       this.restService.handleError(error, 'get');
198       this.isLoadingNSInstanceAction = false;
199     });
200   }
201
202   /**
203    * Do the manual scaling
204    * Here we are going to get a list of VNFD ID used in the instances
205    * and have this in array with URL created then pass to checkscaling method for forkjoin to get the data @public
206    */
207   public manualScaling(): void {
208     this.isLoadingNSInstanceAction = true;
209     const tempURL: Observable<{}>[] = [];
210     this.value.vnfID.forEach((id: string): void => {
211       const apiUrl: string = environment.VNFPACKAGESCONTENT_URL + '/' + id;
212       tempURL.push(this.restService.getResource(apiUrl));
213     });
214     this.checkScaling(tempURL);
215   }
216
217   /**
218    * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
219    */
220   public checkScaling(URLS: Observable<{}>[]): void {
221     forkJoin(URLS).subscribe((data: VNFD[]): void => {
222       this.vnfDetails = data;
223       if (this.vnfDetails.length > 0) {
224         this.vnfDetails.forEach((vnfdData: VNFD): void => {
225           vnfdData.df.forEach((dfData: DF): void => {
226             if (!isNullOrUndefined(dfData['scaling-aspect']) && dfData['scaling-aspect'].length > 0) {
227               this.isScalingPresent = true;
228             }
229           });
230         });
231       }
232       this.isLoadingNSInstanceAction = false;
233       if (this.isScalingPresent) {
234         this.openScaling();
235       } else {
236         this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
237       }
238       this.doChanges();
239     });
240   }
241
242   /** Open the scaling pop-up @public */
243   public openScaling(): void {
244     const modalRef: NgbModalRef = this.modalService.open(ScalingComponent, { backdrop: 'static' });
245     modalRef.componentInstance.params = {
246       id: this.instanceID,
247       vnfID: this.value.vnfID,
248       nsID: this.value['nsd-id'],
249       nsd: this.value.nsd,
250       data: this.vnfDetails
251     };
252     modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
253       if (result) {
254         this.sharedService.callData();
255       }
256     }).catch();
257   }
258
259   /**
260    * Check any changes in the child component @public
261    */
262   public doChanges(): void {
263     setTimeout((): void => {
264       this.cd.detectChanges();
265     }, this.timeOut);
266   }
267 }