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 Dashboard Component
21 import { Component, Injector, OnInit } from '@angular/core';
22 import { TranslateService } from '@ngx-translate/core';
23 import { NotifierService } from 'angular-notifier';
24 import { AuthenticationService } from 'AuthenticationService';
25 import { Chart } from 'chart.js';
26 import 'chartjs-plugin-labels';
27 import { ERRORDATA, TYPESECTION, VIM_TYPES } from 'CommonModel';
28 import { environment } from 'environment';
29 import { NSDDetails } from 'NSDModel';
30 import { NSInstanceDetails } from 'NSInstanceModel';
31 import { ProjectData, ProjectDetails } from 'ProjectModel';
32 import { ProjectService } from 'ProjectService';
33 import { RestService } from 'RestService';
34 import { Observable, Subscription } from 'rxjs';
35 import { SDNControllerModel } from 'SDNControllerModel';
36 import { SharedService } from 'SharedService';
37 import { ProjectRoleMappings, UserDetail } from 'UserModel';
38 import { isNullOrUndefined } from 'util';
39 import { VimAccountDetails } from 'VimAccountModel';
40 import { VNFInstanceDetails } from 'VNFInstanceModel';
44 * @Component takes DashboardComponent.html as template url
47 styleUrls: ['./DashboardComponent.scss'],
48 templateUrl: './DashboardComponent.html'
52 * This file created during the angular project creation
55 /** Exporting a class @exports DashboardComponent */
56 export class DashboardComponent implements OnInit {
57 /** Invoke service injectors @public */
58 public injector: Injector;
60 /** handle translate @public */
61 public translateService: TranslateService;
63 /** Observable holds logined value @public */
64 public username$: Observable<string>;
66 /** Variables holds admin is logged or not @public */
67 public isAdmin: boolean;
69 /** List of NS failed Instances @public */
70 public nsFailedInstances: {}[] = [];
72 /** Setting up count for vnfdPackages @public */
73 public vnfdPackageCount: number;
75 /** Setting up count for nsdPackage @public */
76 public nsdPackageCount: number;
78 /** Setting up count for nsInstance @public */
79 public nsInstanceCount: number;
81 /** Setting up count for vnfInstance @public */
82 public vnfInstanceCount: number;
84 /** Setting up count for vimAccount @public */
85 public vimAccountCount: number;
87 /** Setting up count for sdnController @public */
88 public sdnControllerCount: number;
90 /** Variables holds current project details @public */
91 public currentProjectDetails: {};
93 /** Array holds all the projects @public */
94 public projectList: {}[] = [];
96 /** Array holds all the projects @public */
97 public allProjectList: {}[] = [];
99 /** Variables holds the selected project @public */
100 public selectedProject: Observable<string>;
102 /** Check the Instances loading results @public */
103 public isCanvasLoadingResults: boolean = true;
105 /** Check the Projects loading results @public */
106 public isProjectsLoadingResults: boolean = true;
108 /** Give the message for the loading @public */
109 public message: string = 'PLEASEWAIT';
111 /** List of NS Success Instances @public */
112 public nsRunningInstance: string[] = [];
114 /** Contains VIM Account details @public */
115 public vimData: VimAccountDetails[] = [];
117 /** Contains Selected VIM Details @public */
118 public selectedVIMDetails: VimAccountDetails = null;
120 /** List of VIM_TYPES @public */
121 public vimTypes: TYPESECTION[] = VIM_TYPES;
123 /** Array holds Vim data filtered with selected vimtype */
124 public vimList: VimAccountDetails[] = [];
126 /** List of color for Instances @private */
127 private backgroundColor: string[] = [];
129 /** Utilizes rest service for any CRUD operations @private */
130 private restService: RestService;
132 /** Utilizes auth service for any auth operations @private */
133 private authService: AuthenticationService;
135 /** Used to subscribe vnfdPackage @private */
136 private vnfdPackageCountSub: Subscription;
138 /** Used to subscribe nsdPackage @private */
139 private nsdPackageCountSub: Subscription;
141 /** Used to subscribe nsInstance @private */
142 private nsInstanceCountSub: Subscription;
144 /** Used to subscribe vnfInstance @private */
145 private vnfInstanceCountSub: Subscription;
147 /** Used to subscribe vimAccount @private */
148 private vimAccountCountSub: Subscription;
150 /** Used to subscribe sdnController @private */
151 private sdnControllerCountSub: Subscription;
153 /** No of Hours of NS Success Instances @private */
154 private noOfHours: number[] = [];
156 /** collects charts objects @private */
157 private charts: object = [];
159 /** Contains all methods related to projects @private */
160 private projectService: ProjectService;
162 /** Contains all methods related to shared @private */
163 private sharedService: SharedService;
165 /** Contains NS Instance Details */
166 private nsInstancesDataArr: {}[];
168 /** Container created time array @private */
169 private createdTimes: string[] = [];
171 /** Contains slice limit const @private */
172 private sliceLimit: number = 10;
174 /** Contians hour converter @private */
175 private hourConverter: number = 3600;
177 /** Notifier service to popup notification @private */
178 private notifierService: NotifierService;
180 constructor(injector: Injector) {
181 this.injector = injector;
182 this.restService = this.injector.get(RestService);
183 this.authService = this.injector.get(AuthenticationService);
184 this.projectService = this.injector.get(ProjectService);
185 this.sharedService = this.injector.get(SharedService);
186 this.translateService = this.injector.get(TranslateService);
187 this.notifierService = this.injector.get(NotifierService);
191 * Lifecyle Hooks the trigger before component is instantiate
193 public ngOnInit(): void {
194 this.username$ = this.authService.username;
195 this.isAdmin = (localStorage.getItem('isAdmin') === 'true') ? true : false;
196 this.selectedProject = this.authService.ProjectName;
197 this.checkAdminPrivilege();
198 this.getUserAccessedProjects();
199 this.getAllProjects();
200 this.getVnfdPackageCount();
201 this.getNsdPackageCount();
202 this.getNsInstanceCount();
203 this.getVnfInstanceCount();
204 this.getVimAccountCount();
205 this.getSDNControllerCount();
208 /** Get all the projects @public */
209 public getUserAccessedProjects(): void {
210 this.projectService.getUserProjects().subscribe((projects: UserDetail): void => {
211 const projectList: {}[] = projects.project_role_mappings;
212 this.projectList = projectList.filter(
213 (thing: ProjectRoleMappings, i: number, arr: []): boolean => arr
214 .findIndex((t: ProjectRoleMappings): boolean => t.project_name === thing.project_name) === i
216 }, (error: Error): void => {
217 // TODO: Handle failure
221 /** Fetching all the Project in dashboard @public */
222 public getAllProjects(): void {
223 this.isProjectsLoadingResults = true;
224 this.restService.getResource(environment.PROJECTS_URL).subscribe((projectsData: ProjectDetails[]): void => {
225 this.allProjectList = [];
226 projectsData.forEach((projectData: ProjectDetails): void => {
227 const projectDataObj: ProjectData = this.generateProjectData(projectData);
228 this.allProjectList.push(projectDataObj);
230 this.isProjectsLoadingResults = false;
231 }, (error: ERRORDATA): void => {
232 this.restService.handleError(error, 'get');
233 this.isProjectsLoadingResults = false;
237 /** Generate Projects object from loop and return for the datasource @public */
238 public generateProjectData(projectData: ProjectDetails): ProjectData {
240 projectName: projectData.name,
241 modificationDate: this.sharedService.convertEpochTime(projectData._admin.modified),
242 creationDate: this.sharedService.convertEpochTime(projectData._admin.created),
244 project: projectData._id
248 /** Function to check admin privilege @public */
249 public checkAdminPrivilege(): void {
251 this.projectService.getCurrentProjectDetails().subscribe((projectDetails: {}): void => {
252 this.currentProjectDetails = projectDetails;
253 }, (error: Error): void => {
254 // TODO: Handle failure
259 /** Get VNFD Package details @public */
260 public getVnfdPackageCount(): void {
261 this.vnfdPackageCountSub = this.restService.getResource(environment.VNFPACKAGESCONTENT_URL)
262 .subscribe((vnfdPackageData: []): void => {
263 this.vnfdPackageCount = vnfdPackageData.length;
264 }, (error: ERRORDATA): void => {
265 this.restService.handleError(error, 'get');
269 /** Get NSD Package details @public */
270 public getNsdPackageCount(): void {
271 this.nsdPackageCountSub = this.restService.getResource(environment.NSDESCRIPTORSCONTENT_URL)
272 .subscribe((nsdPackageData: NSDDetails[]): void => {
273 this.nsdPackageCount = nsdPackageData.length;
274 }, (error: ERRORDATA): void => {
275 this.restService.handleError(error, 'get');
279 /** Get NS Instance details @public */
280 public getNsInstanceCount(): void {
281 this.isCanvasLoadingResults = true;
282 this.nsInstanceCountSub = this.restService.getResource(environment.NSDINSTANCES_URL)
283 .subscribe((nsInstancesData: NSInstanceDetails[]): void => {
284 this.nsInstancesDataArr = nsInstancesData;
285 this.nsInstanceCount = nsInstancesData.length;
286 this.nsInstanceChart();
287 this.isCanvasLoadingResults = false;
288 }, (error: ERRORDATA): void => {
289 this.restService.handleError(error, 'get');
290 this.isCanvasLoadingResults = false;
294 /** Get NS Instance chart details @public */
295 public nsInstanceChart(): void {
296 this.nsInstancesDataArr.forEach((nsdInstanceData: NSDDetails): void => {
297 const operationalStatus: string = nsdInstanceData['operational-status'];
298 const configStatus: string = nsdInstanceData['config-status'];
299 if (operationalStatus === 'failed' || configStatus === 'failed') {
300 this.nsFailedInstances.push(nsdInstanceData);
301 } else if (operationalStatus === 'running' && configStatus === 'configured') {
302 this.nsRunningInstance.push(nsdInstanceData.name);
303 this.backgroundColor.push(this.sharedService.generateColor());
304 this.createdTimes.push(((nsdInstanceData._admin.created).toString()).slice(0, this.sliceLimit));
307 const now: Date = new Date();
308 const currentTime: number = Number((now.getTime().toString().slice(0, this.sliceLimit)));
309 this.createdTimes.forEach((createdTime: string): void => {
310 this.noOfHours.push((Math.round((currentTime - Number(createdTime)) / this.hourConverter)));
315 /** Prepare and sketch NS instance chart */
316 public drawNsChart(): void {
317 this.charts = new Chart('canvas', {
320 labels: this.nsRunningInstance,
322 data: this.noOfHours,
323 label: this.translateService.instant('NOOFHOURS'),
324 borderColor: this.backgroundColor,
326 backgroundColor: this.backgroundColor
331 onHover(evt: Event, item: {}): void {
332 const el: HTMLElement = document.getElementById('canvas');
333 el.style.cursor = item[0] ? 'pointer' : 'default';
338 // render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
342 legend: { display: false },
348 labelString: this.translateService.instant('INSTANCES')
358 labelString: this.translateService.instant('NOOFHOURS')
366 /** Get VNFD instance details @public */
367 public getVnfInstanceCount(): void {
368 this.vnfInstanceCountSub = this.restService.getResource(environment.NSDINSTANCES_URL)
369 .subscribe((vnfInstanceData: VNFInstanceDetails[]): void => {
370 this.vnfInstanceCount = vnfInstanceData.length;
371 }, (error: ERRORDATA): void => {
372 this.restService.handleError(error, 'get');
376 /** Get VIM account details @public */
377 public getVimAccountCount(): void {
378 this.vimAccountCountSub = this.restService.getResource(environment.VIMACCOUNTS_URL)
379 .subscribe((vimAccountData: VimAccountDetails[]): void => {
380 this.vimAccountCount = vimAccountData.length;
381 this.vimData = vimAccountData;
382 }, (error: ERRORDATA): void => {
383 this.restService.handleError(error, 'get');
387 /** Get SDN Controller Count @public */
388 public getSDNControllerCount(): void {
389 this.sdnControllerCountSub = this.restService.getResource(environment.SDNCONTROLLER_URL)
390 .subscribe((sdnControllerData: SDNControllerModel[]): void => {
391 this.sdnControllerCount = sdnControllerData.length;
392 }, (error: ERRORDATA): void => {
393 this.restService.handleError(error, 'get');
397 /** Get Vim data filtered by the selected Vim Type @public */
398 public getSelectedVimTypeList(selectedVIMType: string): void {
399 this.vimList = this.vimData.filter((vimData: VimAccountDetails): boolean =>
400 vimData.vim_type === selectedVIMType);
404 /** Get Selected VIM details @public */
405 public getSelectedVIMDetails(vimDetails: VimAccountDetails): void {
406 if (!isNullOrUndefined(vimDetails.resources)) {
407 this.selectedVIMDetails = vimDetails;
409 this.notifierService.notify('error', this.translateService.instant('RESOURCESNOTFOUND'));
414 * Lifecyle Hooks the trigger before component is deleted
416 public ngOnDestroy(): void {
417 this.vnfdPackageCountSub.unsubscribe();
418 this.nsdPackageCountSub.unsubscribe();
419 this.nsInstanceCountSub.unsubscribe();
420 this.vnfInstanceCountSub.unsubscribe();
421 this.vimAccountCountSub.unsubscribe();
422 this.sdnControllerCountSub.unsubscribe();