blob: 4660732f80ffefd48309e1e2a69f98ba9c2588bc [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';
23import { AuthenticationService } from 'AuthenticationService';
bravofcedffec2021-05-05 16:50:46 -040024import { ActiveElement, Chart, ChartEvent } from 'chart.js';
kumaran.m3b4814a2020-05-01 19:48:54 +053025import { ERRORDATA } from 'CommonModel';
26import { environment } from 'environment';
27import { NSDDetails } from 'NSDModel';
28import { NSInstanceDetails } from 'NSInstanceModel';
29import { ProjectData, ProjectDetails } from 'ProjectModel';
30import { ProjectService } from 'ProjectService';
31import { RestService } from 'RestService';
32import { Observable, Subscription } from 'rxjs';
33import { SDNControllerModel } from 'SDNControllerModel';
34import { SharedService } from 'SharedService';
35import { ProjectRoleMappings, UserDetail } from 'UserModel';
36import { VimAccountDetails } from 'VimAccountModel';
kumaran.m3b4814a2020-05-01 19:48:54 +053037import { VNFInstanceDetails } from 'VNFInstanceModel';
38
39/**
40 * Creating component
41 * @Component takes DashboardComponent.html as template url
42 */
43@Component({
44 styleUrls: ['./DashboardComponent.scss'],
45 templateUrl: './DashboardComponent.html'
46})
47
48/**
49 * This file created during the angular project creation
50 */
51
52/** Exporting a class @exports DashboardComponent */
53export class DashboardComponent implements OnInit {
54 /** Invoke service injectors @public */
55 public injector: Injector;
56
57 /** handle translate @public */
58 public translateService: TranslateService;
59
60 /** Observable holds logined value @public */
61 public username$: Observable<string>;
62
63 /** Variables holds admin is logged or not @public */
64 public isAdmin: boolean;
65
66 /** List of NS failed Instances @public */
67 public nsFailedInstances: {}[] = [];
68
69 /** Setting up count for vnfdPackages @public */
70 public vnfdPackageCount: number;
71
72 /** Setting up count for nsdPackage @public */
73 public nsdPackageCount: number;
74
75 /** Setting up count for nsInstance @public */
76 public nsInstanceCount: number;
77
78 /** Setting up count for vnfInstance @public */
79 public vnfInstanceCount: number;
80
81 /** Setting up count for vimAccount @public */
82 public vimAccountCount: number;
83
84 /** Setting up count for sdnController @public */
85 public sdnControllerCount: number;
86
87 /** Variables holds current project details @public */
88 public currentProjectDetails: {};
89
90 /** Array holds all the projects @public */
91 public projectList: {}[] = [];
92
93 /** Array holds all the projects @public */
94 public allProjectList: {}[] = [];
95
96 /** Variables holds the selected project @public */
97 public selectedProject: Observable<string>;
98
99 /** Check the Instances loading results @public */
100 public isCanvasLoadingResults: boolean = true;
101
102 /** Check the Projects loading results @public */
103 public isProjectsLoadingResults: boolean = true;
104
105 /** Give the message for the loading @public */
106 public message: string = 'PLEASEWAIT';
107
Barath Kumar R208bef22020-07-07 12:28:04 +0530108 /** List of NS Success Instances @public */
Barath Kumar R5abb2742020-11-22 20:15:10 +0530109 public nsRunningInstance: string[] = [];
Barath Kumar R208bef22020-07-07 12:28:04 +0530110
111 /** List of color for Instances @private */
112 private backgroundColor: string[] = [];
kumaran.m3b4814a2020-05-01 19:48:54 +0530113
114 /** Utilizes rest service for any CRUD operations @private */
115 private restService: RestService;
116
117 /** Utilizes auth service for any auth operations @private */
118 private authService: AuthenticationService;
119
120 /** Used to subscribe vnfdPackage @private */
121 private vnfdPackageCountSub: Subscription;
122
123 /** Used to subscribe nsdPackage @private */
124 private nsdPackageCountSub: Subscription;
125
126 /** Used to subscribe nsInstance @private */
127 private nsInstanceCountSub: Subscription;
128
129 /** Used to subscribe vnfInstance @private */
130 private vnfInstanceCountSub: Subscription;
131
132 /** Used to subscribe vimAccount @private */
133 private vimAccountCountSub: Subscription;
134
135 /** Used to subscribe sdnController @private */
136 private sdnControllerCountSub: Subscription;
137
138 /** No of Hours of NS Success Instances @private */
139 private noOfHours: number[] = [];
140
141 /** collects charts objects @private */
142 private charts: object = [];
143
144 /** Contains all methods related to projects @private */
145 private projectService: ProjectService;
146
147 /** Contains all methods related to shared @private */
148 private sharedService: SharedService;
149
150 /** Contains NS Instance Details */
151 private nsInstancesDataArr: {}[];
152
153 /** Container created time array @private */
154 private createdTimes: string[] = [];
155
156 /** Contains slice limit const @private */
157 private sliceLimit: number = 10;
158
159 /** Contians hour converter @private */
160 private hourConverter: number = 3600;
161
kumaran.m3b4814a2020-05-01 19:48:54 +0530162 constructor(injector: Injector) {
163 this.injector = injector;
164 this.restService = this.injector.get(RestService);
165 this.authService = this.injector.get(AuthenticationService);
166 this.projectService = this.injector.get(ProjectService);
167 this.sharedService = this.injector.get(SharedService);
168 this.translateService = this.injector.get(TranslateService);
169 }
170
171 /**
172 * Lifecyle Hooks the trigger before component is instantiate
173 */
174 public ngOnInit(): void {
175 this.username$ = this.authService.username;
176 this.isAdmin = (localStorage.getItem('isAdmin') === 'true') ? true : false;
177 this.selectedProject = this.authService.ProjectName;
178 this.checkAdminPrivilege();
179 this.getUserAccessedProjects();
180 this.getAllProjects();
181 this.getVnfdPackageCount();
182 this.getNsdPackageCount();
183 this.getNsInstanceCount();
184 this.getVnfInstanceCount();
185 this.getVimAccountCount();
186 this.getSDNControllerCount();
187 }
188
189 /** Get all the projects @public */
190 public getUserAccessedProjects(): void {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530191 this.projectService.getUserProjects().subscribe((projects: UserDetail): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530192 const projectList: {}[] = projects.project_role_mappings;
193 this.projectList = projectList.filter(
Barath Kumar R063a3f12020-12-29 16:35:09 +0530194 (thing: ProjectRoleMappings, i: number, arr: []): boolean => arr
195 .findIndex((t: ProjectRoleMappings): boolean => t.project_name === thing.project_name) === i
kumaran.m3b4814a2020-05-01 19:48:54 +0530196 );
Barath Kumar R063a3f12020-12-29 16:35:09 +0530197 }, (error: Error): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530198 // TODO: Handle failure
199 });
200 }
201
202 /** Fetching all the Project in dashboard @public */
203 public getAllProjects(): void {
204 this.isProjectsLoadingResults = true;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530205 this.restService.getResource(environment.PROJECTS_URL).subscribe((projectsData: ProjectDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530206 this.allProjectList = [];
Barath Kumar R063a3f12020-12-29 16:35:09 +0530207 projectsData.forEach((projectData: ProjectDetails): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530208 const projectDataObj: ProjectData = this.generateProjectData(projectData);
209 this.allProjectList.push(projectDataObj);
210 });
211 this.isProjectsLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530212 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530213 this.restService.handleError(error, 'get');
214 this.isProjectsLoadingResults = false;
215 });
216 }
217
218 /** Generate Projects object from loop and return for the datasource @public */
219 public generateProjectData(projectData: ProjectDetails): ProjectData {
220 return {
221 projectName: projectData.name,
222 modificationDate: this.sharedService.convertEpochTime(projectData._admin.modified),
223 creationDate: this.sharedService.convertEpochTime(projectData._admin.created),
224 id: projectData._id,
225 project: projectData._id
226 };
227 }
228
229 /** Function to check admin privilege @public */
230 public checkAdminPrivilege(): void {
231 if (!this.isAdmin) {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530232 this.projectService.getCurrentProjectDetails().subscribe((projectDetails: {}): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530233 this.currentProjectDetails = projectDetails;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530234 }, (error: Error): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530235 // TODO: Handle failure
236 });
237 }
238 }
239
240 /** Get VNFD Package details @public */
241 public getVnfdPackageCount(): void {
242 this.vnfdPackageCountSub = this.restService.getResource(environment.VNFPACKAGESCONTENT_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530243 .subscribe((vnfdPackageData: []): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530244 this.vnfdPackageCount = vnfdPackageData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530245 }, (error: ERRORDATA): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530246 this.restService.handleError(error, 'get');
247 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530248 }
249
250 /** Get NSD Package details @public */
251 public getNsdPackageCount(): void {
252 this.nsdPackageCountSub = this.restService.getResource(environment.NSDESCRIPTORSCONTENT_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530253 .subscribe((nsdPackageData: NSDDetails[]): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530254 this.nsdPackageCount = nsdPackageData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530255 }, (error: ERRORDATA): void => {
Barath Kumar R208bef22020-07-07 12:28:04 +0530256 this.restService.handleError(error, 'get');
257 });
kumaran.m3b4814a2020-05-01 19:48:54 +0530258 }
259
260 /** Get NS Instance details @public */
261 public getNsInstanceCount(): void {
262 this.isCanvasLoadingResults = true;
263 this.nsInstanceCountSub = this.restService.getResource(environment.NSDINSTANCES_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530264 .subscribe((nsInstancesData: NSInstanceDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530265 this.nsInstancesDataArr = nsInstancesData;
266 this.nsInstanceCount = nsInstancesData.length;
267 this.nsInstanceChart();
268 this.isCanvasLoadingResults = false;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530269 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530270 this.restService.handleError(error, 'get');
271 this.isCanvasLoadingResults = false;
272 });
273 }
274
275 /** Get NS Instance chart details @public */
276 public nsInstanceChart(): void {
Barath Kumar R063a3f12020-12-29 16:35:09 +0530277 this.nsInstancesDataArr.forEach((nsdInstanceData: NSDDetails): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530278 const operationalStatus: string = nsdInstanceData['operational-status'];
279 const configStatus: string = nsdInstanceData['config-status'];
280 if (operationalStatus === 'failed' || configStatus === 'failed') {
281 this.nsFailedInstances.push(nsdInstanceData);
282 } else if (operationalStatus === 'running' && configStatus === 'configured') {
Barath Kumar R5abb2742020-11-22 20:15:10 +0530283 this.nsRunningInstance.push(nsdInstanceData.name);
Barath Kumar R208bef22020-07-07 12:28:04 +0530284 this.backgroundColor.push(this.sharedService.generateColor());
kumaran.m3b4814a2020-05-01 19:48:54 +0530285 this.createdTimes.push(((nsdInstanceData._admin.created).toString()).slice(0, this.sliceLimit));
286 }
287 });
288 const now: Date = new Date();
289 const currentTime: number = Number((now.getTime().toString().slice(0, this.sliceLimit)));
Barath Kumar R063a3f12020-12-29 16:35:09 +0530290 this.createdTimes.forEach((createdTime: string): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530291 this.noOfHours.push((Math.round((currentTime - Number(createdTime)) / this.hourConverter)));
292 });
293 this.drawNsChart();
294 }
295
296 /** Prepare and sketch NS instance chart */
297 public drawNsChart(): void {
298 this.charts = new Chart('canvas', {
299 type: 'bar',
300 data: {
301 labels: this.nsRunningInstance,
302 datasets: [{
303 data: this.noOfHours,
304 label: this.translateService.instant('NOOFHOURS'),
Barath Kumar R208bef22020-07-07 12:28:04 +0530305 borderColor: this.backgroundColor,
Barath Kumar R208bef22020-07-07 12:28:04 +0530306 backgroundColor: this.backgroundColor
kumaran.m3b4814a2020-05-01 19:48:54 +0530307 }]
308 },
309 options: {
bravofcedffec2021-05-05 16:50:46 -0400310 onHover: (evt: ChartEvent, elements):void => {
311 const el: HTMLElement = document.getElementById('canvas');
312 el.style.cursor = elements[0] ? 'pointer' : 'default';
Barath Kumar R208bef22020-07-07 12:28:04 +0530313 },
bravofcedffec2021-05-05 16:50:46 -0400314 plugins: {
315 legend: { display: false },
316 },
kumaran.m3b4814a2020-05-01 19:48:54 +0530317 scales: {
bravofcedffec2021-05-05 16:50:46 -0400318 x: {
kumaran.m3b4814a2020-05-01 19:48:54 +0530319 display: true,
bravofcedffec2021-05-05 16:50:46 -0400320 labels: [this.translateService.instant('INSTANCES')],
321 },
322 y: {
kumaran.m3b4814a2020-05-01 19:48:54 +0530323 ticks: {
bravofcedffec2021-05-05 16:50:46 -0400324 labelOffset: 0,
kumaran.m3b4814a2020-05-01 19:48:54 +0530325 },
326 display: true,
bravofcedffec2021-05-05 16:50:46 -0400327 labels: [this.translateService.instant('NOOFHOURS')]
328 },
kumaran.m3b4814a2020-05-01 19:48:54 +0530329 }
330 }
331 });
332 }
333
334 /** Get VNFD instance details @public */
335 public getVnfInstanceCount(): void {
336 this.vnfInstanceCountSub = this.restService.getResource(environment.NSDINSTANCES_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530337 .subscribe((vnfInstanceData: VNFInstanceDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530338 this.vnfInstanceCount = vnfInstanceData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530339 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530340 this.restService.handleError(error, 'get');
341 });
342 }
343
344 /** Get VIM account details @public */
345 public getVimAccountCount(): void {
346 this.vimAccountCountSub = this.restService.getResource(environment.VIMACCOUNTS_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530347 .subscribe((vimAccountData: VimAccountDetails[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530348 this.vimAccountCount = vimAccountData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530349 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530350 this.restService.handleError(error, 'get');
351 });
352 }
353
354 /** Get SDN Controller Count @public */
355 public getSDNControllerCount(): void {
356 this.sdnControllerCountSub = this.restService.getResource(environment.SDNCONTROLLER_URL)
Barath Kumar R063a3f12020-12-29 16:35:09 +0530357 .subscribe((sdnControllerData: SDNControllerModel[]): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530358 this.sdnControllerCount = sdnControllerData.length;
Barath Kumar R063a3f12020-12-29 16:35:09 +0530359 }, (error: ERRORDATA): void => {
kumaran.m3b4814a2020-05-01 19:48:54 +0530360 this.restService.handleError(error, 'get');
361 });
362 }
363
364 /**
365 * Lifecyle Hooks the trigger before component is deleted
366 */
367 public ngOnDestroy(): void {
368 this.vnfdPackageCountSub.unsubscribe();
369 this.nsdPackageCountSub.unsubscribe();
370 this.nsInstanceCountSub.unsubscribe();
371 this.vnfInstanceCountSub.unsubscribe();
372 this.vimAccountCountSub.unsubscribe();
373 this.sdnControllerCountSub.unsubscribe();
374 }
375}