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 /** Instance of the modal service @private */
81 private modalService: NgbModal;
83 /** Holds teh instance of AuthService class of type AuthService @private */
84 private router: Router;
86 /** Contains instance ID @private */
87 private instanceID: string;
89 /** Contains all methods related to shared @private */
90 private sharedService: SharedService;
92 /** Notifier service to popup notification @private */
93 private notifierService: NotifierService;
95 /** Contains tranlsate instance @private */
96 private translateService: TranslateService;
98 /** Detect changes for the User Input */
99 private cd: ChangeDetectorRef;
101 /** Set timeout @private */
102 private timeOut: number = 100;
104 constructor(injector: Injector) {
105 this.injector = injector;
106 this.modalService = this.injector.get(NgbModal);
107 this.restService = this.injector.get(RestService);
108 this.router = this.injector.get(Router);
109 this.sharedService = this.injector.get(SharedService);
110 this.notifierService = this.injector.get(NotifierService);
111 this.translateService = this.injector.get(TranslateService);
112 this.cd = this.injector.get(ChangeDetectorRef);
116 * Lifecyle Hooks the trigger before component is instantiate
118 public ngOnInit(): void {
119 this.configStatus = this.value.ConfigStatus;
120 this.operationalStatus = this.value.OperationalStatus;
121 this.instanceID = this.value.identifier;
122 this.getAdminDetails = this.value.adminDetails;
125 /** Shows information using modalservice @public */
126 public infoNs(): void {
127 this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = {
130 titleName: 'INSTANCEDETAILS'
134 /** Delete NS Instanace @public */
135 public deleteNSInstance(forceAction: boolean): void {
136 const modalRef: NgbModalRef = this.modalService.open(DeleteComponent, { backdrop: 'static' });
137 modalRef.componentInstance.params = { forceDeleteType: forceAction };
138 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
140 this.sharedService.callData();
145 /** History of operations for an Instanace @public */
146 public historyOfOperations(): void {
147 this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch((): void => {
148 // Catch Navigation Error
153 public nsTopology(): void {
154 this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
155 // Catch Navigation Error
159 /** Exec NS Primitive @public */
160 public execNSPrimitiveModal(): void {
161 this.modalService.open(NSPrimitiveComponent, { backdrop: 'static' }).componentInstance.params = {
162 memberIndex: this.value.memberIndex,
163 nsConfig: this.value.nsConfig,
164 name: this.value.NsdName
168 /** Redirect to Grafana Metrics @public */
169 public metrics(): void {
170 this.isLoadingNSInstanceAction = true;
171 this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]): void => {
172 nsData['vnfd-id'].forEach((vnfdID: string[]): void => {
173 this.restService.getResource(environment.VNFPACKAGES_URL + '/' + vnfdID)
174 .subscribe((vnfd: VNFD): void => {
175 vnfd.vdu.forEach((vduData: VDU): void => {
176 if (vduData['monitoring-parameter'] !== undefined && vduData['monitoring-parameter'].length > 0) {
177 this.isLoadingNSInstanceAction = false;
178 const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics';
179 window.open(location);
181 this.isLoadingNSInstanceAction = false;
182 this.notifierService.notify('error', this.translateService.instant('GRAFANA.METRICSERROR'));
186 }, (error: ERRORDATA): void => {
187 this.restService.handleError(error, 'get');
188 this.isLoadingNSInstanceAction = false;
191 }, (error: ERRORDATA): void => {
192 this.restService.handleError(error, 'get');
193 this.isLoadingNSInstanceAction = false;
198 * Do the manual scaling
199 * Here we are going to get a list of VNFD ID used in the instances
200 * and have this in array with URL created then pass to checkscaling method for forkjoin to get the data @public
202 public manualScaling(): void {
203 this.isLoadingNSInstanceAction = true;
204 const tempURL: Observable<{}>[] = [];
205 this.value.vnfID.forEach((id: string): void => {
206 const apiUrl: string = environment.VNFPACKAGESCONTENT_URL + '/' + id;
207 tempURL.push(this.restService.getResource(apiUrl));
209 this.checkScaling(tempURL);
213 * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
215 public checkScaling(URLS: Observable<{}>[]): void {
216 forkJoin(URLS).subscribe((data: VNFD[]): void => {
217 this.vnfDetails = data;
218 if (this.vnfDetails.length > 0) {
219 this.vnfDetails.forEach((vnfdData: VNFD): void => {
220 vnfdData.df.forEach((dfData: DF): void => {
221 if (!isNullOrUndefined(dfData['scaling-aspect']) && dfData['scaling-aspect'].length > 0) {
222 this.isScalingPresent = true;
227 this.isLoadingNSInstanceAction = false;
228 if (this.isScalingPresent) {
231 this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
237 /** Open the scaling pop-up @public */
238 public openScaling(): void {
239 const modalRef: NgbModalRef = this.modalService.open(ScalingComponent, { backdrop: 'static' });
240 modalRef.componentInstance.params = {
242 vnfID: this.value.vnfID,
243 nsID: this.value['nsd-id'],
245 data: this.vnfDetails
247 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
249 this.sharedService.callData();
255 * Check any changes in the child component @public
257 public doChanges(): void {
258 setTimeout((): void => {
259 this.cd.detectChanges();