From e636eb88101a51399057c86477af6677f5614d48 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Sun, 25 Jun 2017 17:19:46 +0200 Subject: Requests -> RequestSchedulers --- client/src/app/+admin/request-schedulers/index.ts | 4 ++ .../request-schedulers-stats/index.ts | 1 + .../request-schedulers-stats.component.html | 46 +++++++++++++ .../request-schedulers-stats.component.scss | 8 +++ .../request-schedulers-stats.component.ts | 77 ++++++++++++++++++++++ .../request-schedulers.component.ts | 7 ++ .../request-schedulers.routes.ts | 27 ++++++++ .../app/+admin/request-schedulers/shared/index.ts | 2 + .../request-schedulers-stats-attributes.model.ts | 37 +++++++++++ .../shared/request-schedulers.service.ts | 35 ++++++++++ 10 files changed, 244 insertions(+) create mode 100644 client/src/app/+admin/request-schedulers/index.ts create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers-stats/index.ts create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.html create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.scss create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.ts create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers.component.ts create mode 100644 client/src/app/+admin/request-schedulers/request-schedulers.routes.ts create mode 100644 client/src/app/+admin/request-schedulers/shared/index.ts create mode 100644 client/src/app/+admin/request-schedulers/shared/request-schedulers-stats-attributes.model.ts create mode 100644 client/src/app/+admin/request-schedulers/shared/request-schedulers.service.ts (limited to 'client/src/app/+admin/request-schedulers') diff --git a/client/src/app/+admin/request-schedulers/index.ts b/client/src/app/+admin/request-schedulers/index.ts new file mode 100644 index 000000000..87b72e8c7 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/index.ts @@ -0,0 +1,4 @@ +export * from './request-schedulers-stats' +export * from './shared' +export * from './request-schedulers.component' +export * from './request-schedulers.routes' diff --git a/client/src/app/+admin/request-schedulers/request-schedulers-stats/index.ts b/client/src/app/+admin/request-schedulers/request-schedulers-stats/index.ts new file mode 100644 index 000000000..a3323e6be --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers-stats/index.ts @@ -0,0 +1 @@ +export * from './request-schedulers-stats.component' diff --git a/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.html b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.html new file mode 100644 index 000000000..4508ab4c2 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.html @@ -0,0 +1,46 @@ +
+
+ +

Requests stats

+ + +
+
+
{{ statsTitles[requestSchedulerName] }}
+ +
+
+
+ Remaining requests: + {{ stats[requestSchedulerName].totalRequests }} +
+ +
+ Interval seconds between requests: + {{ stats[requestSchedulerName].secondsInterval }} +
+ +
+ Remaining time before the scheduled request: + {{ stats[requestSchedulerName].remainingSeconds }} +
+
+ +
+
+ Maximum number of different pods for a scheduled request: + {{ stats[requestSchedulerName].requestsLimitPods }} +
+ +
+ Maximum number of requests per pod for a scheduled request: + {{ stats[requestSchedulerName].requestsLimitPerPod }} +
+
+
+
+
+
+ +
+
diff --git a/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.scss b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.scss new file mode 100644 index 000000000..b2c413259 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.scss @@ -0,0 +1,8 @@ +.label-description { + font-weight: bold; + color: black; +} + +.requests-limit { + margin-top: 20px; +} diff --git a/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.ts b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.ts new file mode 100644 index 000000000..4e3fabc64 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.ts @@ -0,0 +1,77 @@ +import { Component, OnInit, OnDestroy } from '@angular/core' + +import { NotificationsService } from 'angular2-notifications' + +import { RequestSchedulersService, RequestSchedulerStatsAttributes } from '../shared' +import { RequestSchedulerStats } from '../../../../../../shared' + +@Component({ + selector: 'my-request-schedulers-stats', + templateUrl: './request-schedulers-stats.component.html', + styleUrls: [ './request-schedulers-stats.component.scss' ] +}) +export class RequestSchedulersStatsComponent implements OnInit, OnDestroy { + statsTitles = { + requestScheduler: 'Basic request scheduler', + requestVideoEventScheduler: 'Video events request scheduler', + requestVideoQaduScheduler: 'Quick and dirty video updates request scheduler' + } + + stats: RequestSchedulerStats + + private intervals: { [ id: string ]: number } = { + requestScheduler: null, + requestVideoEventScheduler: null, + requestVideoQaduScheduler: null + } + + private timeouts: { [ id: string ]: number } = { + requestScheduler: null, + requestVideoEventScheduler: null, + requestVideoQaduScheduler: null + } + + constructor ( + private notificationsService: NotificationsService, + private requestService: RequestSchedulersService + ) { } + + ngOnInit () { + this.getStats() + this.runIntervals() + } + + ngOnDestroy () { + Object.keys(this.stats).forEach(requestSchedulerName => { + if (this.intervals[requestSchedulerName] !== null) { + window.clearInterval(this.intervals[requestSchedulerName]) + } + + if (this.timeouts[requestSchedulerName] !== null) { + window.clearTimeout(this.timeouts[requestSchedulerName]) + } + }) + } + + getStats () { + this.requestService.getStats().subscribe( + stats => this.stats = stats, + + err => this.notificationsService.error('Error', err.text) + ) + } + + private runIntervals () { + Object.keys(this.intervals).forEach(requestSchedulerName => { + this.intervals[requestSchedulerName] = window.setInterval(() => { + const stats: RequestSchedulerStatsAttributes = this.stats[requestSchedulerName] + + stats.remainingMilliSeconds -= 1000 + + if (stats.remainingMilliSeconds <= 0) { + this.timeouts[requestSchedulerName] = window.setTimeout(() => this.getStats(), stats.remainingMilliSeconds + 100) + } + }, 1000) + }) + } +} diff --git a/client/src/app/+admin/request-schedulers/request-schedulers.component.ts b/client/src/app/+admin/request-schedulers/request-schedulers.component.ts new file mode 100644 index 000000000..5444d6ea5 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core' + +@Component({ + template: '' +}) +export class RequestSchedulersComponent { +} diff --git a/client/src/app/+admin/request-schedulers/request-schedulers.routes.ts b/client/src/app/+admin/request-schedulers/request-schedulers.routes.ts new file mode 100644 index 000000000..4961c646b --- /dev/null +++ b/client/src/app/+admin/request-schedulers/request-schedulers.routes.ts @@ -0,0 +1,27 @@ +import { Routes } from '@angular/router' + +import { RequestSchedulersComponent } from './request-schedulers.component' +import { RequestSchedulersStatsComponent } from './request-schedulers-stats' + +export const RequestSchedulersRoutes: Routes = [ + { + path: 'requests', + component: RequestSchedulersComponent, + children: [ + { + path: '', + redirectTo: 'stats', + pathMatch: 'full' + }, + { + path: 'stats', + component: RequestSchedulersStatsComponent, + data: { + meta: { + title: 'Request stats' + } + } + } + ] + } +] diff --git a/client/src/app/+admin/request-schedulers/shared/index.ts b/client/src/app/+admin/request-schedulers/shared/index.ts new file mode 100644 index 000000000..1a0174409 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/shared/index.ts @@ -0,0 +1,2 @@ +export * from './request-schedulers-stats-attributes.model' +export * from './request-schedulers.service' diff --git a/client/src/app/+admin/request-schedulers/shared/request-schedulers-stats-attributes.model.ts b/client/src/app/+admin/request-schedulers/shared/request-schedulers-stats-attributes.model.ts new file mode 100644 index 000000000..6e19a0e44 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/shared/request-schedulers-stats-attributes.model.ts @@ -0,0 +1,37 @@ +import { RequestSchedulerStatsAttributes as FormatedRequestSchedulerStatsAttributes } from '../../../../../../shared' + +export interface Request { + request: any + to: any +} + +export class RequestSchedulerStatsAttributes implements FormatedRequestSchedulerStatsAttributes { + requestsLimitPods: number + requestsLimitPerPod: number + milliSecondsInterval: number + remainingMilliSeconds: number + totalRequests: number + + constructor (hash: { + requestsLimitPods: number, + requestsLimitPerPod: number, + milliSecondsInterval: number, + remainingMilliSeconds: number, + totalRequests: number + }) { + this.requestsLimitPods = hash.requestsLimitPods + this.requestsLimitPerPod = hash.requestsLimitPerPod + this.milliSecondsInterval = hash.milliSecondsInterval + this.remainingMilliSeconds = hash.remainingMilliSeconds + this.totalRequests = hash.totalRequests + } + + get remainingSeconds () { + return Math.floor(this.remainingMilliSeconds / 1000) + } + + get secondsInterva () { + return Math.floor(this.milliSecondsInterval / 1000) + } + +} diff --git a/client/src/app/+admin/request-schedulers/shared/request-schedulers.service.ts b/client/src/app/+admin/request-schedulers/shared/request-schedulers.service.ts new file mode 100644 index 000000000..e9b166f78 --- /dev/null +++ b/client/src/app/+admin/request-schedulers/shared/request-schedulers.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs/Observable' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' + +import { RequestSchedulerStats } from '../../../../../../shared' +import { AuthHttp, RestExtractor } from '../../../shared' +import { RequestSchedulerStatsAttributes } from './request-schedulers-stats-attributes.model' + +@Injectable() +export class RequestSchedulersService { + private static BASE_REQUEST_URL = API_URL + '/api/v1/request-schedulers/' + + constructor ( + private authHttp: AuthHttp, + private restExtractor: RestExtractor + ) {} + + getStats (): Observable { + return this.authHttp.get(RequestSchedulersService.BASE_REQUEST_URL + 'stats') + .map(this.restExtractor.extractDataGet) + .map(this.buildRequestObjects) + .catch((res) => this.restExtractor.handleError(res)) + } + + private buildRequestObjects (data: RequestSchedulerStats) { + const requestSchedulers = {} + + Object.keys(data).forEach(requestSchedulerName => { + requestSchedulers[requestSchedulerName] = new RequestSchedulerStatsAttributes(data[requestSchedulerName]) + }) + + return requestSchedulers + } +} -- cgit v1.2.3