blob: 3c856dd7e54f2256493bffe7bb78b5ce01bbd65b [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 Dashboard Component
20 */
21import { Component, Injector, OnInit } from '@angular/core';
22import { TranslateService } from '@ngx-translate/core';
SANDHYA.JS4a7a5422021-05-15 15:35:22 +053023import { NotifierService } from 'angular-notifier';
kumaran.m3b4814a2020-05-01 19:48:54 +053024import { AuthenticationService } from 'AuthenticationService';
Barath Kumar Re53dbb62021-06-08 11:06:38 +053025import { Chart } from 'chart.js';
SANDHYA.JS4a7a5422021-05-15 15:35:22 +053026import 'chartjs-plugin-labels';
27import { ERRORDATA, TYPESECTION, VIM_TYPES } from 'CommonModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053028import { environment } from 'environment';
29import { NSDDetails } from 'NSDModel';
30import { NSInstanceDetails } from 'NSInstanceModel';
31import { ProjectData, ProjectDetails } from 'ProjectModel';
32import { ProjectService } from 'ProjectService';
33import { RestService } from 'RestService';
34import { Observable, Subscription } from 'rxjs';
35import { SDNControllerModel } from 'SDNControllerModel';
36import { SharedService } from 'SharedService';
37import { ProjectRoleMappings, UserDetail } from 'UserModel';
SANDHYA.JS4a7a5422021-05-15 15:35:22 +053038import { isNullOrUndefined } from 'util';
kumaran.m3b4814a2020-05-01 19:48:54 +053039import { VimAccountDetails } from 'VimAccountModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053040import { VNFInstanceDetails } from 'VNFInstanceModel';
41
42/**
43 * Creating component
44 * @Component takes DashboardComponent.html as template url
45 */
46@Component({
47 styleUrls: ['./DashboardComponent.scss'],
48 templateUrl: './DashboardComponent.html'
49})
50
51/**
52 * This file created during the angular project creation
53 */
54
55/** Exporting a class @exports DashboardComponent */
56export class DashboardComponent implements OnInit {
57 /** Invoke service injectors @public */
58 public injector: Injector;
59
harshini.r3649a5c2022-04-28 12:43:12 +053060 /** Handle translate @public */
kumaran.m3b4814a2020-05-01 19:48:54 +053061 public translateService: TranslateService;
62
63 /** Observable holds logined value @public */
64 public username$: Observable<string>;
65
66 /** Variables holds admin is logged or not @public */
67 public isAdmin: boolean;
68
69 /** List of NS failed Instances @public */
70 public nsFailedInstances: {}[] = [];
71
72 /** Setting up count for vnfdPackages @public */
73 public vnfdPackageCount: number;
74
75 /** Setting up count for nsdPackage @public */
76 public nsdPackageCount: number;
77
78 /** Setting up count for nsInstance @public */
79 public nsInstanceCount: number;
80
81 /** Setting up count for vnfInstance @public */
82 public vnfInstanceCount: number;
83
84 /** Setting up count for vimAccount @public */
85 public vimAccountCount: number;
86
87 /** Setting up count for sdnController @public */
88 public sdnControllerCount: number;
89
90 /** Variables holds current project details @public */
91 public currentProjectDetails: {};
92
93 /** Array holds all the projects @public */
94 public projectList: {}[] = [];
95
96 /** Array holds all the projects @public */
97 public allProjectList: {}[] = [];
98
99 /** Variables holds the selected project @public */
100 public selectedProject: Observable<string>;
101
102 /** Check the Instances loading results @public */
103 public isCanvasLoadingResults: boolean = true;
104
105 /** Check the Projects loading results @public */
106 public isProjectsLoadingResults: boolean = true;
107
108 /** Give the message for the loading @public */
109 public message: string = 'PLEASEWAIT';
110
Barath Kumar R208bef22020-07-07 12:28:04 +0530111 /** List of NS Success Instances @public */
Barath Kumar R5abb2742020-11-22 20:15:10 +0530112 public nsRunningInstance: string[] = [];
Barath Kumar R208bef22020-07-07 12:28:04 +0530113
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530114 /** Contains VIM Account details @public */
115 public vimData: VimAccountDetails[] = [];
116
117 /** Contains Selected VIM Details @public */
118 public selectedVIMDetails: VimAccountDetails = null;
119
120 /** List of VIM_TYPES @public */
121 public vimTypes: TYPESECTION[] = VIM_TYPES;
122
123 /** Array holds Vim data filtered with selected vimtype */
124 public vimList: VimAccountDetails[] = [];
125
SANDHYA.JS0e9c0a42022-04-04 18:44:53 +0530126 /** Model value used to hold selected vimtype Data @public */
127 public vimListData: string;
128
Barath Kumar R208bef22020-07-07 12:28:04 +0530129 /** List of color for Instances @private */
130 private backgroundColor: string[] = [];
kumaran.m3b4814a2020-05-01 19:48:54 +0530131
132 /** Utilizes rest service for any CRUD operations @private */
133 private restService: RestService;
134
135 /** Utilizes auth service for any auth operations @private */
136 private authService: AuthenticationService;
137
138 /** Used to subscribe vnfdPackage @private */
139 private vnfdPackageCountSub: Subscription;
140
141 /** Used to subscribe nsdPackage @private */
142 private nsdPackageCountSub: Subscription;
143
144 /** Used to subscribe nsInstance @private */
145 private nsInstanceCountSub: Subscription;
146
147 /** Used to subscribe vnfInstance @private */
148 private vnfInstanceCountSub: Subscription;
149
150 /** Used to subscribe vimAccount @private */
151 private vimAccountCountSub: Subscription;
152
153 /** Used to subscribe sdnController @private */
154 private sdnControllerCountSub: Subscription;
155
156 /** No of Hours of NS Success Instances @private */
157 private noOfHours: number[] = [];
158
159 /** collects charts objects @private */
160 private charts: object = [];
161
162 /** Contains all methods related to projects @private */
163 private projectService: ProjectService;
164
165 /** Contains all methods related to shared @private */
166 private sharedService: SharedService;
167
168 /** Contains NS Instance Details */
169 private nsInstancesDataArr: {}[];
170
171 /** Container created time array @private */
172 private createdTimes: string[] = [];
173
174 /** Contains slice limit const @private */
175 private sliceLimit: number = 10;
176
177 /** Contians hour converter @private */
178 private hourConverter: number = 3600;
179
harshini.r3649a5c2022-04-28 12:43:12 +0530180 /** Converter used to round off time to one decimal point @private */
181 private converter: number = 10;
182
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530183 /** Notifier service to popup notification @private */
184 private notifierService: NotifierService;
185
kumaran.m3b4814a2020-05-01 19:48:54 +0530186 constructor(injector: Injector) {
187 this.injector = injector;
188 this.restService = this.injector.get(RestService);
189 this.authService = this.injector.get(AuthenticationService);
190 this.projectService = this.injector.get(ProjectService);
191 this.sharedService = this.injector.get(SharedService);
192 this.translateService = this.injector.get(TranslateService);
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530193 this.notifierService = this.injector.get(NotifierService);
kumaran.m3b4814a2020-05-01 19:48:54 +0530194 }
195
196 /**
197 * Lifecyle Hooks the trigger before component is instantiate
198 */
199 public ngOnInit(): void {
200 this.username$ = this.authService.username;
SANDHYA.JSdc7a6612023-05-10 23:01:35 +0530201 this.isAdmin = (sessionStorage.getItem('isAdmin') === 'true') ? true : false;
kumaran.m3b4814a2020-05-01 19:48:54 +0530202 this.selectedProject = this.authService.ProjectName;
203 this.checkAdminPrivilege();
204 this.getUserAccessedProjects();
205 this.getAllProjects();
206 this.getVnfdPackageCount();
207 this.getNsdPackageCount();
208 this.getNsInstanceCount();
209 this.getVnfInstanceCount();
210 this.getVimAccountCount();
211 this.getSDNControllerCount();
212 }
213
214 /** Get all the projects @public */
215 public getUserAccessedProjects(): void {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530216 this.projectService.getUserProjects().subscribe((projects: UserDetail): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530217 const projectList: {}[] = projects.project_role_mappings;
218 this.projectList = projectList.filter(
Barath Kumar R063a3f12020-12-29 16:35:09 +0530219 (thing: ProjectRoleMappings, i: number, arr: []): boolean => arr
220 .findIndex((t: ProjectRoleMappings): boolean => t.project_name === thing.project_name) === i
kumaran.m3b4814a2020-05-01 19:48:54 +0530221 );
Barath Kumar R063a3f12020-12-29 16:35:09 +0530222 }, (error: Error): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530223 // TODO: Handle failure
224 });
225 }
226
227 /** Fetching all the Project in dashboard @public */
228 public getAllProjects(): void {
229 this.isProjectsLoadingResults = true;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530230 this.restService.getResource(environment.PROJECTS_URL).subscribe((projectsData: ProjectDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530231 this.allProjectList = [];
Barath Kumar R063a3f12020-12-29 16:35:09 +0530232 projectsData.forEach((projectData: ProjectDetails): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530233 const projectDataObj: ProjectData = this.generateProjectData(projectData);
234 this.allProjectList.push(projectDataObj);
235 });
236 this.isProjectsLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530237 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530238 this.restService.handleError(error, 'get');
239 this.isProjectsLoadingResults = false;
240 });
241 }
242
243 /** Generate Projects object from loop and return for the datasource @public */
244 public generateProjectData(projectData: ProjectDetails): ProjectData {
245 return {
246 projectName: projectData.name,
247 modificationDate: this.sharedService.convertEpochTime(projectData._admin.modified),
248 creationDate: this.sharedService.convertEpochTime(projectData._admin.created),
249 id: projectData._id,
250 project: projectData._id
251 };
252 }
253
254 /** Function to check admin privilege @public */
255 public checkAdminPrivilege(): void {
256 if (!this.isAdmin) {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530257 this.projectService.getCurrentProjectDetails().subscribe((projectDetails: {}): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530258 this.currentProjectDetails = projectDetails;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530259 }, (error: Error): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530260 // TODO: Handle failure
261 });
262 }
263 }
264
265 /** Get VNFD Package details @public */
266 public getVnfdPackageCount(): void {
267 this.vnfdPackageCountSub = this.restService.getResource(environment.VNFPACKAGESCONTENT_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530268 .subscribe((vnfdPackageData: []): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530269 this.vnfdPackageCount = vnfdPackageData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530270 }, (error: ERRORDATA): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530271 this.restService.handleError(error, 'get');
272 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530273 }
274
275 /** Get NSD Package details @public */
276 public getNsdPackageCount(): void {
277 this.nsdPackageCountSub = this.restService.getResource(environment.NSDESCRIPTORSCONTENT_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530278 .subscribe((nsdPackageData: NSDDetails[]): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530279 this.nsdPackageCount = nsdPackageData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530280 }, (error: ERRORDATA): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530281 this.restService.handleError(error, 'get');
282 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530283 }
284
285 /** Get NS Instance details @public */
286 public getNsInstanceCount(): void {
287 this.isCanvasLoadingResults = true;
288 this.nsInstanceCountSub = this.restService.getResource(environment.NSDINSTANCES_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530289 .subscribe((nsInstancesData: NSInstanceDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530290 this.nsInstancesDataArr = nsInstancesData;
291 this.nsInstanceCount = nsInstancesData.length;
292 this.nsInstanceChart();
293 this.isCanvasLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530294 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530295 this.restService.handleError(error, 'get');
296 this.isCanvasLoadingResults = false;
297 });
298 }
299
300 /** Get NS Instance chart details @public */
301 public nsInstanceChart(): void {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530302 this.nsInstancesDataArr.forEach((nsdInstanceData: NSDDetails): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530303 const operationalStatus: string = nsdInstanceData['operational-status'];
304 const configStatus: string = nsdInstanceData['config-status'];
305 if (operationalStatus === 'failed' || configStatus === 'failed') {
306 this.nsFailedInstances.push(nsdInstanceData);
307 } else if (operationalStatus === 'running' && configStatus === 'configured') {
Barath Kumar R5abb2742020-11-22 20:15:10 +0530308 this.nsRunningInstance.push(nsdInstanceData.name);
Barath Kumar R208bef22020-07-07 12:28:04 +0530309 this.backgroundColor.push(this.sharedService.generateColor());
kumaran.m3b4814a2020-05-01 19:48:54 +0530310 this.createdTimes.push(((nsdInstanceData._admin.created).toString()).slice(0, this.sliceLimit));
311 }
312 });
313 const now: Date = new Date();
314 const currentTime: number = Number((now.getTime().toString().slice(0, this.sliceLimit)));
Barath Kumar R063a3f12020-12-29 16:35:09 +0530315 this.createdTimes.forEach((createdTime: string): void => {
harshini.r3649a5c2022-04-28 12:43:12 +0530316 this.noOfHours.push(Math.floor(((currentTime - Number(createdTime)) / this.hourConverter) * (this.converter)) / this.converter);
kumaran.m3b4814a2020-05-01 19:48:54 +0530317 });
318 this.drawNsChart();
319 }
320
321 /** Prepare and sketch NS instance chart */
322 public drawNsChart(): void {
323 this.charts = new Chart('canvas', {
324 type: 'bar',
325 data: {
326 labels: this.nsRunningInstance,
327 datasets: [{
328 data: this.noOfHours,
329 label: this.translateService.instant('NOOFHOURS'),
Barath Kumar R208bef22020-07-07 12:28:04 +0530330 borderColor: this.backgroundColor,
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530331 fill: false,
Barath Kumar R208bef22020-07-07 12:28:04 +0530332 backgroundColor: this.backgroundColor
kumaran.m3b4814a2020-05-01 19:48:54 +0530333 }]
334 },
335 options: {
SANDHYA.JS9bae4602022-04-05 07:28:32 +0530336 layout: {
337 padding: {
338 top: 20
339 }
340 },
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530341 hover: {
342 onHover(evt: Event, item: {}): void {
343 const el: HTMLElement = document.getElementById('canvas');
344 el.style.cursor = item[0] ? 'pointer' : 'default';
345 }
Barath Kumar R208bef22020-07-07 12:28:04 +0530346 },
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530347 plugins: {
348 labels: {
349 // render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
350 render: 'value'
351 }
352 },
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530353 legend: { display: false },
kumaran.m3b4814a2020-05-01 19:48:54 +0530354 scales: {
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530355 xAxes: [{
kumaran.m3b4814a2020-05-01 19:48:54 +0530356 display: true,
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530357 scaleLabel: {
358 display: true,
harshini.r3649a5c2022-04-28 12:43:12 +0530359 labelString: this.translateService.instant('NSINSTANCES')
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530360 }
361 }],
362 yAxes: [{
kumaran.m3b4814a2020-05-01 19:48:54 +0530363 ticks: {
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530364 beginAtZero: true
kumaran.m3b4814a2020-05-01 19:48:54 +0530365 },
366 display: true,
Barath Kumar Re53dbb62021-06-08 11:06:38 +0530367 scaleLabel: {
368 display: true,
369 labelString: this.translateService.instant('NOOFHOURS')
370 }
371 }]
kumaran.m3b4814a2020-05-01 19:48:54 +0530372 }
373 }
374 });
375 }
376
377 /** Get VNFD instance details @public */
378 public getVnfInstanceCount(): void {
harshini.r3649a5c2022-04-28 12:43:12 +0530379 this.vnfInstanceCountSub = this.restService.getResource(environment.VNFINSTANCES_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530380 .subscribe((vnfInstanceData: VNFInstanceDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530381 this.vnfInstanceCount = vnfInstanceData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530382 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530383 this.restService.handleError(error, 'get');
384 });
385 }
386
387 /** Get VIM account details @public */
388 public getVimAccountCount(): void {
389 this.vimAccountCountSub = this.restService.getResource(environment.VIMACCOUNTS_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530390 .subscribe((vimAccountData: VimAccountDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530391 this.vimAccountCount = vimAccountData.length;
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530392 this.vimData = vimAccountData;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530393 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530394 this.restService.handleError(error, 'get');
395 });
396 }
397
398 /** Get SDN Controller Count @public */
399 public getSDNControllerCount(): void {
400 this.sdnControllerCountSub = this.restService.getResource(environment.SDNCONTROLLER_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530401 .subscribe((sdnControllerData: SDNControllerModel[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530402 this.sdnControllerCount = sdnControllerData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530403 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530404 this.restService.handleError(error, 'get');
405 });
406 }
407
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530408 /** Get Vim data filtered by the selected Vim Type @public */
409 public getSelectedVimTypeList(selectedVIMType: string): void {
410 this.vimList = this.vimData.filter((vimData: VimAccountDetails): boolean =>
411 vimData.vim_type === selectedVIMType);
SANDHYA.JS0e9c0a42022-04-04 18:44:53 +0530412 if (this.vimList.length === 0) {
413 this.vimListData = null;
414 }
SANDHYA.JS4a7a5422021-05-15 15:35:22 +0530415
416 }
417
418 /** Get Selected VIM details @public */
419 public getSelectedVIMDetails(vimDetails: VimAccountDetails): void {
420 if (!isNullOrUndefined(vimDetails.resources)) {
421 this.selectedVIMDetails = vimDetails;
422 } else {
423 this.notifierService.notify('error', this.translateService.instant('RESOURCESNOTFOUND'));
424 }
425 }
426
kumaran.m3b4814a2020-05-01 19:48:54 +0530427 /**
428 * Lifecyle Hooks the trigger before component is deleted
429 */
430 public ngOnDestroy(): void {
431 this.vnfdPackageCountSub.unsubscribe();
432 this.nsdPackageCountSub.unsubscribe();
433 this.nsInstanceCountSub.unsubscribe();
434 this.vnfInstanceCountSub.unsubscribe();
435 this.vimAccountCountSub.unsubscribe();
436 this.sdnControllerCountSub.unsubscribe();
437 }
438}