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 { 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';
41 * @Component takes NSInstancesActionComponent.html as template url
44 templateUrl: './NSInstancesActionComponent.html',
45 styleUrls: ['./NSInstancesActionComponent.scss'],
46 changeDetection: ChangeDetectionStrategy.OnPush
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;
53 /** Invoke service injectors @public */
54 public injector: Injector;
56 /** Instance of the modal service @public */
57 public restService: RestService;
59 /** Config Status Check @public */
60 public configStatus: string;
62 /** Operational Status Check @public */
63 public operationalStatus: string;
65 /** get Admin Details @public */
66 public getAdminDetails: {};
68 /** Scaling is accepted @public */
69 public isScalingPresent: boolean = false;
71 /** Check the loading results for loader status @public */
72 public isLoadingNSInstanceAction: boolean = false;
74 /** Give the message for the loading @public */
75 public message: string = 'PLEASEWAIT';
77 /** Assign the VNF Details @public */
78 public vnfDetails: VNFD[] = [];
80 /** Contains instance ID @public */
81 public instanceID: string;
83 /** Contains operational dashboard view @public */
84 public isShowOperationalDashboard: boolean = false;
86 /** Instance of the modal service @private */
87 private modalService: NgbModal;
89 /** Holds teh instance of AuthService class of type AuthService @private */
90 private router: Router;
92 /** Contains all methods related to shared @private */
93 private sharedService: SharedService;
95 /** Notifier service to popup notification @private */
96 private notifierService: NotifierService;
98 /** Contains tranlsate instance @private */
99 private translateService: TranslateService;
101 /** Detect changes for the User Input */
102 private cd: ChangeDetectorRef;
104 /** Set timeout @private */
105 private timeOut: number = 100;
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);
119 * Lifecyle Hooks the trigger before component is instantiate
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;
130 /** Shows information using modalservice @public */
131 public infoNs(): void {
132 this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = {
135 titleName: 'INSTANCEDETAILS'
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 => {
145 this.sharedService.callData();
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
158 public nsTopology(): void {
159 this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
160 // Catch Navigation Error
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
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);
186 this.isLoadingNSInstanceAction = false;
187 this.notifierService.notify('error', this.translateService.instant('GRAFANA.METRICSERROR'));
191 }, (error: ERRORDATA): void => {
192 this.restService.handleError(error, 'get');
193 this.isLoadingNSInstanceAction = false;
196 }, (error: ERRORDATA): void => {
197 this.restService.handleError(error, 'get');
198 this.isLoadingNSInstanceAction = false;
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
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));
214 this.checkScaling(tempURL);
218 * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
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;
232 this.isLoadingNSInstanceAction = false;
233 if (this.isScalingPresent) {
236 this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
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 = {
247 vnfID: this.value.vnfID,
248 nsID: this.value['nsd-id'],
250 data: this.vnfDetails
252 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
254 this.sharedService.callData();
260 * Check any changes in the child component @public
262 public doChanges(): void {
263 setTimeout((): void => {
264 this.cd.detectChanges();