diff options
author | Chocobozzz <florian.bigard@gmail.com> | 2017-06-25 17:19:46 +0200 |
---|---|---|
committer | Chocobozzz <florian.bigard@gmail.com> | 2017-06-25 17:19:46 +0200 |
commit | e636eb88101a51399057c86477af6677f5614d48 (patch) | |
tree | ba56f0da932613c8013a2c52905ded1987cd6d6d /client/src/app/+admin/request-schedulers | |
parent | 4f133041819409a72cf70fa2fa6c4df14c6de4fd (diff) | |
download | PeerTube-e636eb88101a51399057c86477af6677f5614d48.tar.gz PeerTube-e636eb88101a51399057c86477af6677f5614d48.tar.zst PeerTube-e636eb88101a51399057c86477af6677f5614d48.zip |
Requests -> RequestSchedulers
Diffstat (limited to 'client/src/app/+admin/request-schedulers')
10 files changed, 244 insertions, 0 deletions
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 @@ | |||
1 | export * from './request-schedulers-stats' | ||
2 | export * from './shared' | ||
3 | export * from './request-schedulers.component' | ||
4 | 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 @@ | |||
1 | <div class="row"> | ||
2 | <div class="content-padding"> | ||
3 | |||
4 | <h3>Requests stats</h3> | ||
5 | |||
6 | <ng-template [ngIf]="stats"> | ||
7 | <div *ngFor="let requestSchedulerName of statsTitles | keys" class="col-lg-4 col-md-12"> | ||
8 | <div class="panel panel-default" *ngIf="stats[requestSchedulerName] !== null"> | ||
9 | <div class="panel-heading">{{ statsTitles[requestSchedulerName] }}</div> | ||
10 | |||
11 | <div class="panel-body"> | ||
12 | <div class="requests-general"> | ||
13 | <div> | ||
14 | <span class="label-description">Remaining requests:</span> | ||
15 | {{ stats[requestSchedulerName].totalRequests }} | ||
16 | </div> | ||
17 | |||
18 | <div> | ||
19 | <span class="label-description">Interval seconds between requests:</span> | ||
20 | {{ stats[requestSchedulerName].secondsInterval }} | ||
21 | </div> | ||
22 | |||
23 | <div> | ||
24 | <span class="label-description">Remaining time before the scheduled request:</span> | ||
25 | {{ stats[requestSchedulerName].remainingSeconds }} | ||
26 | </div> | ||
27 | </div> | ||
28 | |||
29 | <div class="requests-limit"> | ||
30 | <div> | ||
31 | <span class="label-description">Maximum number of different pods for a scheduled request:</span> | ||
32 | {{ stats[requestSchedulerName].requestsLimitPods }} | ||
33 | </div> | ||
34 | |||
35 | <div> | ||
36 | <span class="label-description">Maximum number of requests per pod for a scheduled request:</span> | ||
37 | {{ stats[requestSchedulerName].requestsLimitPerPod }} | ||
38 | </div> | ||
39 | </div> | ||
40 | </div> | ||
41 | </div> | ||
42 | </div> | ||
43 | </ng-template> | ||
44 | |||
45 | </div> | ||
46 | </div> | ||
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 @@ | |||
1 | .label-description { | ||
2 | font-weight: bold; | ||
3 | color: black; | ||
4 | } | ||
5 | |||
6 | .requests-limit { | ||
7 | margin-top: 20px; | ||
8 | } | ||
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 @@ | |||
1 | import { Component, OnInit, OnDestroy } from '@angular/core' | ||
2 | |||
3 | import { NotificationsService } from 'angular2-notifications' | ||
4 | |||
5 | import { RequestSchedulersService, RequestSchedulerStatsAttributes } from '../shared' | ||
6 | import { RequestSchedulerStats } from '../../../../../../shared' | ||
7 | |||
8 | @Component({ | ||
9 | selector: 'my-request-schedulers-stats', | ||
10 | templateUrl: './request-schedulers-stats.component.html', | ||
11 | styleUrls: [ './request-schedulers-stats.component.scss' ] | ||
12 | }) | ||
13 | export class RequestSchedulersStatsComponent implements OnInit, OnDestroy { | ||
14 | statsTitles = { | ||
15 | requestScheduler: 'Basic request scheduler', | ||
16 | requestVideoEventScheduler: 'Video events request scheduler', | ||
17 | requestVideoQaduScheduler: 'Quick and dirty video updates request scheduler' | ||
18 | } | ||
19 | |||
20 | stats: RequestSchedulerStats | ||
21 | |||
22 | private intervals: { [ id: string ]: number } = { | ||
23 | requestScheduler: null, | ||
24 | requestVideoEventScheduler: null, | ||
25 | requestVideoQaduScheduler: null | ||
26 | } | ||
27 | |||
28 | private timeouts: { [ id: string ]: number } = { | ||
29 | requestScheduler: null, | ||
30 | requestVideoEventScheduler: null, | ||
31 | requestVideoQaduScheduler: null | ||
32 | } | ||
33 | |||
34 | constructor ( | ||
35 | private notificationsService: NotificationsService, | ||
36 | private requestService: RequestSchedulersService | ||
37 | ) { } | ||
38 | |||
39 | ngOnInit () { | ||
40 | this.getStats() | ||
41 | this.runIntervals() | ||
42 | } | ||
43 | |||
44 | ngOnDestroy () { | ||
45 | Object.keys(this.stats).forEach(requestSchedulerName => { | ||
46 | if (this.intervals[requestSchedulerName] !== null) { | ||
47 | window.clearInterval(this.intervals[requestSchedulerName]) | ||
48 | } | ||
49 | |||
50 | if (this.timeouts[requestSchedulerName] !== null) { | ||
51 | window.clearTimeout(this.timeouts[requestSchedulerName]) | ||
52 | } | ||
53 | }) | ||
54 | } | ||
55 | |||
56 | getStats () { | ||
57 | this.requestService.getStats().subscribe( | ||
58 | stats => this.stats = stats, | ||
59 | |||
60 | err => this.notificationsService.error('Error', err.text) | ||
61 | ) | ||
62 | } | ||
63 | |||
64 | private runIntervals () { | ||
65 | Object.keys(this.intervals).forEach(requestSchedulerName => { | ||
66 | this.intervals[requestSchedulerName] = window.setInterval(() => { | ||
67 | const stats: RequestSchedulerStatsAttributes = this.stats[requestSchedulerName] | ||
68 | |||
69 | stats.remainingMilliSeconds -= 1000 | ||
70 | |||
71 | if (stats.remainingMilliSeconds <= 0) { | ||
72 | this.timeouts[requestSchedulerName] = window.setTimeout(() => this.getStats(), stats.remainingMilliSeconds + 100) | ||
73 | } | ||
74 | }, 1000) | ||
75 | }) | ||
76 | } | ||
77 | } | ||
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 @@ | |||
1 | import { Component } from '@angular/core' | ||
2 | |||
3 | @Component({ | ||
4 | template: '<router-outlet></router-outlet>' | ||
5 | }) | ||
6 | export class RequestSchedulersComponent { | ||
7 | } | ||
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 @@ | |||
1 | import { Routes } from '@angular/router' | ||
2 | |||
3 | import { RequestSchedulersComponent } from './request-schedulers.component' | ||
4 | import { RequestSchedulersStatsComponent } from './request-schedulers-stats' | ||
5 | |||
6 | export const RequestSchedulersRoutes: Routes = [ | ||
7 | { | ||
8 | path: 'requests', | ||
9 | component: RequestSchedulersComponent, | ||
10 | children: [ | ||
11 | { | ||
12 | path: '', | ||
13 | redirectTo: 'stats', | ||
14 | pathMatch: 'full' | ||
15 | }, | ||
16 | { | ||
17 | path: 'stats', | ||
18 | component: RequestSchedulersStatsComponent, | ||
19 | data: { | ||
20 | meta: { | ||
21 | title: 'Request stats' | ||
22 | } | ||
23 | } | ||
24 | } | ||
25 | ] | ||
26 | } | ||
27 | ] | ||
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 @@ | |||
1 | export * from './request-schedulers-stats-attributes.model' | ||
2 | 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 @@ | |||
1 | import { RequestSchedulerStatsAttributes as FormatedRequestSchedulerStatsAttributes } from '../../../../../../shared' | ||
2 | |||
3 | export interface Request { | ||
4 | request: any | ||
5 | to: any | ||
6 | } | ||
7 | |||
8 | export class RequestSchedulerStatsAttributes implements FormatedRequestSchedulerStatsAttributes { | ||
9 | requestsLimitPods: number | ||
10 | requestsLimitPerPod: number | ||
11 | milliSecondsInterval: number | ||
12 | remainingMilliSeconds: number | ||
13 | totalRequests: number | ||
14 | |||
15 | constructor (hash: { | ||
16 | requestsLimitPods: number, | ||
17 | requestsLimitPerPod: number, | ||
18 | milliSecondsInterval: number, | ||
19 | remainingMilliSeconds: number, | ||
20 | totalRequests: number | ||
21 | }) { | ||
22 | this.requestsLimitPods = hash.requestsLimitPods | ||
23 | this.requestsLimitPerPod = hash.requestsLimitPerPod | ||
24 | this.milliSecondsInterval = hash.milliSecondsInterval | ||
25 | this.remainingMilliSeconds = hash.remainingMilliSeconds | ||
26 | this.totalRequests = hash.totalRequests | ||
27 | } | ||
28 | |||
29 | get remainingSeconds () { | ||
30 | return Math.floor(this.remainingMilliSeconds / 1000) | ||
31 | } | ||
32 | |||
33 | get secondsInterva () { | ||
34 | return Math.floor(this.milliSecondsInterval / 1000) | ||
35 | } | ||
36 | |||
37 | } | ||
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 @@ | |||
1 | import { Injectable } from '@angular/core' | ||
2 | import { Observable } from 'rxjs/Observable' | ||
3 | import 'rxjs/add/operator/catch' | ||
4 | import 'rxjs/add/operator/map' | ||
5 | |||
6 | import { RequestSchedulerStats } from '../../../../../../shared' | ||
7 | import { AuthHttp, RestExtractor } from '../../../shared' | ||
8 | import { RequestSchedulerStatsAttributes } from './request-schedulers-stats-attributes.model' | ||
9 | |||
10 | @Injectable() | ||
11 | export class RequestSchedulersService { | ||
12 | private static BASE_REQUEST_URL = API_URL + '/api/v1/request-schedulers/' | ||
13 | |||
14 | constructor ( | ||
15 | private authHttp: AuthHttp, | ||
16 | private restExtractor: RestExtractor | ||
17 | ) {} | ||
18 | |||
19 | getStats (): Observable<RequestSchedulerStats> { | ||
20 | return this.authHttp.get(RequestSchedulersService.BASE_REQUEST_URL + 'stats') | ||
21 | .map(this.restExtractor.extractDataGet) | ||
22 | .map(this.buildRequestObjects) | ||
23 | .catch((res) => this.restExtractor.handleError(res)) | ||
24 | } | ||
25 | |||
26 | private buildRequestObjects (data: RequestSchedulerStats) { | ||
27 | const requestSchedulers = {} | ||
28 | |||
29 | Object.keys(data).forEach(requestSchedulerName => { | ||
30 | requestSchedulers[requestSchedulerName] = new RequestSchedulerStatsAttributes(data[requestSchedulerName]) | ||
31 | }) | ||
32 | |||
33 | return requestSchedulers | ||
34 | } | ||
35 | } | ||