aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+admin/request-schedulers
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-06-25 17:19:46 +0200
committerChocobozzz <florian.bigard@gmail.com>2017-06-25 17:19:46 +0200
commite636eb88101a51399057c86477af6677f5614d48 (patch)
treeba56f0da932613c8013a2c52905ded1987cd6d6d /client/src/app/+admin/request-schedulers
parent4f133041819409a72cf70fa2fa6c4df14c6de4fd (diff)
downloadPeerTube-e636eb88101a51399057c86477af6677f5614d48.tar.gz
PeerTube-e636eb88101a51399057c86477af6677f5614d48.tar.zst
PeerTube-e636eb88101a51399057c86477af6677f5614d48.zip
Requests -> RequestSchedulers
Diffstat (limited to 'client/src/app/+admin/request-schedulers')
-rw-r--r--client/src/app/+admin/request-schedulers/index.ts4
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers-stats/index.ts1
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.html46
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.scss8
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers-stats/request-schedulers-stats.component.ts77
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers.component.ts7
-rw-r--r--client/src/app/+admin/request-schedulers/request-schedulers.routes.ts27
-rw-r--r--client/src/app/+admin/request-schedulers/shared/index.ts2
-rw-r--r--client/src/app/+admin/request-schedulers/shared/request-schedulers-stats-attributes.model.ts37
-rw-r--r--client/src/app/+admin/request-schedulers/shared/request-schedulers.service.ts35
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 @@
1export * from './request-schedulers-stats'
2export * from './shared'
3export * from './request-schedulers.component'
4export * 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 @@
1import { Component, OnInit, OnDestroy } from '@angular/core'
2
3import { NotificationsService } from 'angular2-notifications'
4
5import { RequestSchedulersService, RequestSchedulerStatsAttributes } from '../shared'
6import { 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})
13export 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 @@
1import { Component } from '@angular/core'
2
3@Component({
4 template: '<router-outlet></router-outlet>'
5})
6export 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 @@
1import { Routes } from '@angular/router'
2
3import { RequestSchedulersComponent } from './request-schedulers.component'
4import { RequestSchedulersStatsComponent } from './request-schedulers-stats'
5
6export 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 @@
1export * from './request-schedulers-stats-attributes.model'
2export * 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 @@
1import { RequestSchedulerStatsAttributes as FormatedRequestSchedulerStatsAttributes } from '../../../../../../shared'
2
3export interface Request {
4 request: any
5 to: any
6}
7
8export 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 @@
1import { Injectable } from '@angular/core'
2import { Observable } from 'rxjs/Observable'
3import 'rxjs/add/operator/catch'
4import 'rxjs/add/operator/map'
5
6import { RequestSchedulerStats } from '../../../../../../shared'
7import { AuthHttp, RestExtractor } from '../../../shared'
8import { RequestSchedulerStatsAttributes } from './request-schedulers-stats-attributes.model'
9
10@Injectable()
11export 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}