blob: ed24a674e2440a0d70485256af098c79f49a5fde [file] [log] [blame]
kumaran.m3b4814a2020-05-01 19:48:54 +05301/*
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 */
21import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core';
22import { Router } from '@angular/router';
23import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
24import { TranslateService } from '@ngx-translate/core';
25import { NotifierService } from 'angular-notifier';
26import { ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
27import { DeleteComponent } from 'DeleteComponent';
28import { environment } from 'environment';
29import { NSDDetails } from 'NSDModel';
30import { NSDInstanceData } from 'NSInstanceModel';
31import { NSPrimitiveComponent } from 'NSPrimitiveComponent';
32import { RestService } from 'RestService';
Barath Kumar R07698ab2021-03-30 11:50:42 +053033import { forkJoin, Observable } from 'rxjs';
34import { ScalingComponent } from 'ScalingComponent';
kumaran.m3b4814a2020-05-01 19:48:54 +053035import { SharedService } from 'SharedService';
36import { ShowInfoComponent } from 'ShowInfoComponent';
Barath Kumar R07698ab2021-03-30 11:50:42 +053037import { isNullOrUndefined } from 'util';
38import { DF, VDU, VNFD } from 'VNFDModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053039/**
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 */
49export 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
Barath Kumar R07698ab2021-03-30 11:50:42 +053065 /** get Admin Details @public */
66 public getAdminDetails: {};
67
68 /** Scaling is accepted @public */
69 public isScalingPresent: boolean = false;
70
kumaran.m3b4814a2020-05-01 19:48:54 +053071 /** Check the loading results for loader status @public */
Barath Kumar R07698ab2021-03-30 11:50:42 +053072 public isLoadingNSInstanceAction: boolean = false;
kumaran.m3b4814a2020-05-01 19:48:54 +053073
74 /** Give the message for the loading @public */
75 public message: string = 'PLEASEWAIT';
76
Barath Kumar R07698ab2021-03-30 11:50:42 +053077 /** Assign the VNF Details @public */
78 public vnfDetails: VNFD[] = [];
79
kumaran.m3b4814a2020-05-01 19:48:54 +053080 /** Instance of the modal service @private */
81 private modalService: NgbModal;
82
83 /** Holds teh instance of AuthService class of type AuthService @private */
84 private router: Router;
85
86 /** Contains instance ID @private */
87 private instanceID: string;
88
89 /** Contains all methods related to shared @private */
90 private sharedService: SharedService;
91
92 /** Notifier service to popup notification @private */
93 private notifierService: NotifierService;
94
95 /** Contains tranlsate instance @private */
96 private translateService: TranslateService;
97
98 /** Detect changes for the User Input */
99 private cd: ChangeDetectorRef;
100
101 /** Set timeout @private */
Barath Kumar R07698ab2021-03-30 11:50:42 +0530102 private timeOut: number = 100;
kumaran.m3b4814a2020-05-01 19:48:54 +0530103
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);
113 }
114
115 /**
116 * Lifecyle Hooks the trigger before component is instantiate
117 */
118 public ngOnInit(): void {
119 this.configStatus = this.value.ConfigStatus;
120 this.operationalStatus = this.value.OperationalStatus;
121 this.instanceID = this.value.identifier;
Barath Kumar R07698ab2021-03-30 11:50:42 +0530122 this.getAdminDetails = this.value.adminDetails;
kumaran.m3b4814a2020-05-01 19:48:54 +0530123 }
124
125 /** Shows information using modalservice @public */
126 public infoNs(): void {
127 this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = {
128 id: this.instanceID,
129 page: 'ns-instance',
130 titleName: 'INSTANCEDETAILS'
131 };
132 }
133
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 };
Barath Kumar R1a34b832021-03-05 11:32:19 +0530138 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530139 if (result) {
140 this.sharedService.callData();
141 }
142 }).catch();
143 }
144
145 /** History of operations for an Instanace @public */
146 public historyOfOperations(): void {
Barath Kumar R1a34b832021-03-05 11:32:19 +0530147 this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch((): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530148 // Catch Navigation Error
149 });
150 }
151
152 /** NS Topology */
153 public nsTopology(): void {
Barath Kumar R1a34b832021-03-05 11:32:19 +0530154 this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530155 // Catch Navigation Error
156 });
157 }
158
159 /** Exec NS Primitive @public */
160 public execNSPrimitiveModal(): void {
Barath Kumar Rd3ce0c52020-08-13 11:44:01 +0530161 this.modalService.open(NSPrimitiveComponent, { backdrop: 'static' }).componentInstance.params = {
kumaran.m3b4814a2020-05-01 19:48:54 +0530162 memberIndex: this.value.memberIndex,
Barath Kumar R54d693c2020-07-13 20:54:13 +0530163 nsConfig: this.value.nsConfig,
164 name: this.value.NsdName
kumaran.m3b4814a2020-05-01 19:48:54 +0530165 };
166 }
167
168 /** Redirect to Grafana Metrics @public */
169 public metrics(): void {
Barath Kumar R07698ab2021-03-30 11:50:42 +0530170 this.isLoadingNSInstanceAction = true;
Barath Kumar R1a34b832021-03-05 11:32:19 +0530171 this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]): void => {
172 nsData['vnfd-id'].forEach((vnfdID: string[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530173 this.restService.getResource(environment.VNFPACKAGES_URL + '/' + vnfdID)
Barath Kumar R1a34b832021-03-05 11:32:19 +0530174 .subscribe((vnfd: VNFD): void => {
175 vnfd.vdu.forEach((vduData: VDU): void => {
176 if (vduData['monitoring-parameter'] !== undefined && vduData['monitoring-parameter'].length > 0) {
Barath Kumar R07698ab2021-03-30 11:50:42 +0530177 this.isLoadingNSInstanceAction = false;
Barath Kumar R1a34b832021-03-05 11:32:19 +0530178 const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics';
179 window.open(location);
180 } else {
Barath Kumar R07698ab2021-03-30 11:50:42 +0530181 this.isLoadingNSInstanceAction = false;
Barath Kumar R1a34b832021-03-05 11:32:19 +0530182 this.notifierService.notify('error', this.translateService.instant('GRAFANA.METRICSERROR'));
183 }
184 });
Barath Kumar R07698ab2021-03-30 11:50:42 +0530185 this.doChanges();
Barath Kumar R1a34b832021-03-05 11:32:19 +0530186 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530187 this.restService.handleError(error, 'get');
Barath Kumar R07698ab2021-03-30 11:50:42 +0530188 this.isLoadingNSInstanceAction = false;
kumaran.m3b4814a2020-05-01 19:48:54 +0530189 });
190 });
Barath Kumar R1a34b832021-03-05 11:32:19 +0530191 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530192 this.restService.handleError(error, 'get');
Barath Kumar R07698ab2021-03-30 11:50:42 +0530193 this.isLoadingNSInstanceAction = false;
kumaran.m3b4814a2020-05-01 19:48:54 +0530194 });
195 }
Barath Kumar R07698ab2021-03-30 11:50:42 +0530196
197 /**
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
201 */
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));
208 });
209 this.checkScaling(tempURL);
210 }
211
212 /**
213 * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public
214 */
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;
223 }
224 });
225 });
226 }
227 this.isLoadingNSInstanceAction = false;
228 if (this.isScalingPresent) {
229 this.openScaling();
230 } else {
231 this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND'));
232 }
233 this.doChanges();
234 });
235 }
236
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 = {
241 id: this.instanceID,
242 vnfID: this.value.vnfID,
243 nsID: this.value['nsd-id'],
244 nsd: this.value.nsd,
245 data: this.vnfDetails
246 };
247 modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => {
248 if (result) {
249 this.sharedService.callData();
250 }
251 }).catch();
252 }
253
254 /**
255 * Check any changes in the child component @public
256 */
257 public doChanges(): void {
258 setTimeout((): void => {
259 this.cd.detectChanges();
260 }, this.timeOut);
261 }
kumaran.m3b4814a2020-05-01 19:48:54 +0530262}