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 InstancesAction Component
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 { HealingComponent } from 'HealingComponent';
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, isNullOrUndefined } 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';
45 * @Component takes NSInstancesActionComponent.html as template url
48 templateUrl: './NSInstancesActionComponent.html',
49 styleUrls: ['./NSInstancesActionComponent.scss'],
50 changeDetection: ChangeDetectionStrategy.OnPush
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;
57 /** Invoke service injectors @public */
58 public injector: Injector;
60 /** Instance of the modal service @public */
61 public restService: RestService;
63 /** Config Status Check @public */
64 public configStatus: string;
66 /** Operational Status Check @public */
67 public operationalStatus: string;
69 /** CNF Status Check @public */
70 public k8sStatus: boolean = false;
72 /** get Admin Details @public */
73 public getAdminDetails: {};
75 /** Scaling is accepted @public */
76 public isScalingPresent: boolean = false;
78 /** Check the loading results for loader status @public */
79 public isLoadingNSInstanceAction: boolean = false;
81 /** Give the message for the loading @public */
82 public message: string = 'PLEASEWAIT';
84 /** Assign the VNF Details @public */
85 public vnfDetails: VNFD[] = [];
87 /** Contains instance ID @public */
88 public instanceID: string;
90 /** Contains operational dashboard view @public */
91 public isShowOperationalDashboard: boolean = false;
93 /** Instance of the modal service @private */
94 private modalService: NgbModal;
96 /** Holds teh instance of AuthService class of type AuthService @private */
97 private router: Router;
99 /** Contains all methods related to shared @private */
100 private sharedService: SharedService;
102 /** Notifier service to popup notification @private */
103 private notifierService: NotifierService;
105 /** Contains tranlsate instance @private */
106 private translateService: TranslateService;
108 /** Detect changes for the User Input */
109 private cd: ChangeDetectorRef;
111 /** Set timeout @private */
112 // eslint-disable-next-line @typescript-eslint/no-magic-numbers
113 private timeOut: number = 100;
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);
127 * Lifecyle Hooks the trigger before component is instantiate
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;
148 this.isShowOperationalDashboard = !isNullOrUndefined(this.value.vcaStatus) ?
149 Object.keys(this.value.vcaStatus).length === 0 && typeof this.value.vcaStatus === 'object' : true;
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 = {
158 titleName: 'INSTANCEDETAILS'
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 => {
169 this.sharedService.callData();
171 }).catch((): void => {
172 // Catch Navigation Error
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
184 public nsTopology(): void {
185 this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
186 // Catch Navigation Error
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
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);
215 this.isLoadingNSInstanceAction = false;
216 this.notifierService.notify('error', this.translateService.instant('PAGE.NSMETRIC.METRICERROR'));
220 }, (error: ERRORDATA): void => {
221 this.restService.handleError(error, 'get');
222 this.isLoadingNSInstanceAction = false;
225 }, (error: ERRORDATA): void => {
226 this.restService.handleError(error, 'get');
227 this.isLoadingNSInstanceAction = false;
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
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));
243 this.checkScaling(tempURL);
247 * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
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;
261 this.isLoadingNSInstanceAction = false;
262 if (this.isScalingPresent) {
265 this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
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 = {
277 vnfID: this.value.vnfID,
278 nsID: this.value['nsd-id'],
280 data: this.vnfDetails
282 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
284 this.sharedService.callData();
286 }).catch((): void => {
287 // Catch Navigation Error
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 = {
298 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
300 this.sharedService.callData();
302 }).catch((): void => {
303 // Catch Navigation Error
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 = {
314 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
316 this.sharedService.callData();
318 }).catch((): void => {
319 // Catch Navigation Error
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 = {
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');
335 modalRef.componentInstance.instanceTitle = this.translateService.instant('REBUILD');
337 modalRef.componentInstance.instanceType = actionType;
338 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
340 this.sharedService.callData();
342 }).catch((): void => {
343 // Catch Navigation Error
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 = {
354 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
356 this.sharedService.callData();
358 }).catch((): void => {
359 // Catch Navigation Error
363 /** Open the Healing pop-up @public */
364 public openHealing(): void {
365 // eslint-disable-next-line security/detect-non-literal-fs-filename
366 const modalRef: NgbModalRef = this.modalService.open(HealingComponent, { backdrop: 'static' });
367 modalRef.componentInstance.params = {
370 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
372 this.sharedService.callData();
374 }).catch((): void => {
375 // Catch Navigation Error
380 * Check any changes in the child component @public
382 public doChanges(): void {
383 setTimeout((): void => {
384 this.cd.detectChanges();