From: Chocobozzz Date: Sun, 25 Jun 2017 15:19:46 +0000 (+0200) Subject: Requests -> RequestSchedulers X-Git-Tag: v0.0.1-alpha~387 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=e636eb88101a51399057c86477af6677f5614d48;p=oweals%2Fpeertube.git Requests -> RequestSchedulers --- diff --git a/client/src/app/+admin/admin-routing.module.ts b/client/src/app/+admin/admin-routing.module.ts index 839913135..bcc94a9f3 100644 --- a/client/src/app/+admin/admin-routing.module.ts +++ b/client/src/app/+admin/admin-routing.module.ts @@ -3,7 +3,7 @@ import { RouterModule, Routes } from '@angular/router' import { AdminComponent } from './admin.component' import { FriendsRoutes } from './friends' -import { RequestsRoutes } from './requests' +import { RequestSchedulersRoutes } from './request-schedulers' import { UsersRoutes } from './users' import { VideoAbusesRoutes } from './video-abuses' @@ -18,7 +18,7 @@ const adminRoutes: Routes = [ pathMatch: 'full' }, ...FriendsRoutes, - ...RequestsRoutes, + ...RequestSchedulersRoutes, ...UsersRoutes, ...VideoAbusesRoutes ] diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts index 9ecce5dc3..e4ba8e5b7 100644 --- a/client/src/app/+admin/admin.module.ts +++ b/client/src/app/+admin/admin.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core' import { AdminComponent } from './admin.component' import { AdminRoutingModule } from './admin-routing.module' import { FriendsComponent, FriendAddComponent, FriendListComponent, FriendService } from './friends' -import { RequestsComponent, RequestStatsComponent, RequestService } from './requests' +import { RequestSchedulersComponent, RequestSchedulersStatsComponent, RequestSchedulersService } from './request-schedulers' import { UsersComponent, UserAddComponent, UserListComponent, UserService } from './users' import { VideoAbusesComponent, VideoAbuseListComponent } from './video-abuses' import { SharedModule } from '../shared' @@ -21,8 +21,8 @@ import { SharedModule } from '../shared' FriendAddComponent, FriendListComponent, - RequestsComponent, - RequestStatsComponent, + RequestSchedulersComponent, + RequestSchedulersStatsComponent, UsersComponent, UserAddComponent, @@ -38,7 +38,7 @@ import { SharedModule } from '../shared' providers: [ FriendService, - RequestService, + RequestSchedulersService, UserService ] }) diff --git a/client/src/app/+admin/index.ts b/client/src/app/+admin/index.ts index 11e2587c0..b628a3662 100644 --- a/client/src/app/+admin/index.ts +++ b/client/src/app/+admin/index.ts @@ -1,6 +1 @@ -export * from './friends' -export * from './requests' -export * from './users' -export * from './admin-routing.module' export * from './admin.module' -export * from './admin.component' 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 + } +} diff --git a/client/src/app/+admin/requests/index.ts b/client/src/app/+admin/requests/index.ts deleted file mode 100644 index d96a893c3..000000000 --- a/client/src/app/+admin/requests/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './request-stats' -export * from './shared' -export * from './requests.component' -export * from './requests.routes' diff --git a/client/src/app/+admin/requests/request-stats/index.ts b/client/src/app/+admin/requests/request-stats/index.ts deleted file mode 100644 index 740c401bb..000000000 --- a/client/src/app/+admin/requests/request-stats/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './request-stats.component' diff --git a/client/src/app/+admin/requests/request-stats/request-stats.component.html b/client/src/app/+admin/requests/request-stats/request-stats.component.html deleted file mode 100644 index 4508ab4c2..000000000 --- a/client/src/app/+admin/requests/request-stats/request-stats.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
- -

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/requests/request-stats/request-stats.component.scss b/client/src/app/+admin/requests/request-stats/request-stats.component.scss deleted file mode 100644 index b2c413259..000000000 --- a/client/src/app/+admin/requests/request-stats/request-stats.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.label-description { - font-weight: bold; - color: black; -} - -.requests-limit { - margin-top: 20px; -} diff --git a/client/src/app/+admin/requests/request-stats/request-stats.component.ts b/client/src/app/+admin/requests/request-stats/request-stats.component.ts deleted file mode 100644 index 140aaf47e..000000000 --- a/client/src/app/+admin/requests/request-stats/request-stats.component.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core' - -import { NotificationsService } from 'angular2-notifications' - -import { RequestService, RequestSchedulerStatsAttributes } from '../shared' -import { RequestScheduler } from '../../../../../../shared' - -@Component({ - selector: 'my-request-stats', - templateUrl: './request-stats.component.html', - styleUrls: [ './request-stats.component.scss' ] -}) -export class RequestStatsComponent implements OnInit, OnDestroy { - statsTitles = { - requestScheduler: 'Basic request scheduler', - requestVideoEventScheduler: 'Video events request scheduler', - requestVideoQaduScheduler: 'Quick and dirty video updates request scheduler' - } - - stats: RequestScheduler - - 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: RequestService - ) { } - - 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/requests/requests.component.ts b/client/src/app/+admin/requests/requests.component.ts deleted file mode 100644 index 88a90fa4e..000000000 --- a/client/src/app/+admin/requests/requests.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core' - -@Component({ - template: '' -}) -export class RequestsComponent { -} diff --git a/client/src/app/+admin/requests/requests.routes.ts b/client/src/app/+admin/requests/requests.routes.ts deleted file mode 100644 index 84db3fea8..000000000 --- a/client/src/app/+admin/requests/requests.routes.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Routes } from '@angular/router' - -import { RequestsComponent } from './requests.component' -import { RequestStatsComponent } from './request-stats' - -export const RequestsRoutes: Routes = [ - { - path: 'requests', - component: RequestsComponent, - children: [ - { - path: '', - redirectTo: 'stats', - pathMatch: 'full' - }, - { - path: 'stats', - component: RequestStatsComponent, - data: { - meta: { - title: 'Request stats' - } - } - } - ] - } -] diff --git a/client/src/app/+admin/requests/shared/index.ts b/client/src/app/+admin/requests/shared/index.ts deleted file mode 100644 index 857fe9d29..000000000 --- a/client/src/app/+admin/requests/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './request-stats-attributes.model' -export * from './request.service' diff --git a/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts b/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts deleted file mode 100644 index 394acc73d..000000000 --- a/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { RequestSchedulerAttributes as FormatedRequestSchedulerAttributes } from '../../../../../../shared' - -export interface Request { - request: any - to: any -} - -export class RequestSchedulerStatsAttributes implements FormatedRequestSchedulerAttributes { - 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/requests/shared/request.service.ts b/client/src/app/+admin/requests/shared/request.service.ts deleted file mode 100644 index 53682b111..000000000 --- a/client/src/app/+admin/requests/shared/request.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Injectable } from '@angular/core' -import { Observable } from 'rxjs/Observable' -import 'rxjs/add/operator/catch' -import 'rxjs/add/operator/map' - -import { RequestScheduler } from '../../../../../../shared' -import { AuthHttp, RestExtractor } from '../../../shared' -import { RequestSchedulerStatsAttributes } from './request-stats-attributes.model' - -@Injectable() -export class RequestService { - private static BASE_REQUEST_URL = API_URL + '/api/v1/requests/' - - constructor ( - private authHttp: AuthHttp, - private restExtractor: RestExtractor - ) {} - - getStats (): Observable { - return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats') - .map(this.restExtractor.extractDataGet) - .map(this.buildRequestObjects) - .catch((res) => this.restExtractor.handleError(res)) - } - - private buildRequestObjects (data: RequestScheduler) { - const requestSchedulers = {} - - Object.keys(data).forEach(requestSchedulerName => { - requestSchedulers[requestSchedulerName] = new RequestSchedulerStatsAttributes(data[requestSchedulerName]) - }) - - return requestSchedulers - } -} diff --git a/server/controllers/api/index.ts b/server/controllers/api/index.ts index ac3972ac6..3abe9bcf8 100644 --- a/server/controllers/api/index.ts +++ b/server/controllers/api/index.ts @@ -6,7 +6,7 @@ import { clientsRouter } from './clients' import { configRouter } from './config' import { podsRouter } from './pods' import { remoteRouter } from './remote' -import { requestsRouter } from './requests' +import { requestSchedulerRouter } from './request-schedulers' import { usersRouter } from './users' import { videosRouter } from './videos' @@ -16,7 +16,7 @@ apiRouter.use('/clients', clientsRouter) apiRouter.use('/config', configRouter) apiRouter.use('/pods', podsRouter) apiRouter.use('/remote', remoteRouter) -apiRouter.use('/requests', requestsRouter) +apiRouter.use('/request-schedulers', requestSchedulerRouter) apiRouter.use('/users', usersRouter) apiRouter.use('/videos', videosRouter) apiRouter.use('/ping', pong) diff --git a/server/controllers/api/request-schedulers.ts b/server/controllers/api/request-schedulers.ts new file mode 100644 index 000000000..8dd849007 --- /dev/null +++ b/server/controllers/api/request-schedulers.ts @@ -0,0 +1,59 @@ +import * as express from 'express' +import { parallel } from 'async' + +import { + AbstractRequestScheduler, + getRequestScheduler, + getRequestVideoQaduScheduler, + getRequestVideoEventScheduler +} from '../../lib' +import { authenticate, ensureIsAdmin } from '../../middlewares' +import { RequestSchedulerStatsAttributes } from '../../../shared' + +const requestSchedulerRouter = express.Router() + +requestSchedulerRouter.get('/stats', + authenticate, + ensureIsAdmin, + getRequestSchedulersStats +) + +// --------------------------------------------------------------------------- + +export { + requestSchedulerRouter +} + +// --------------------------------------------------------------------------- + +function getRequestSchedulersStats (req: express.Request, res: express.Response, next: express.NextFunction) { + parallel({ + requestScheduler: buildRequestSchedulerStats(getRequestScheduler()), + requestVideoQaduScheduler: buildRequestSchedulerStats(getRequestVideoQaduScheduler()), + requestVideoEventScheduler: buildRequestSchedulerStats(getRequestVideoEventScheduler()) + }, function (err, result) { + if (err) return next(err) + + return res.json(result) + }) +} + +// --------------------------------------------------------------------------- + +function buildRequestSchedulerStats (requestScheduler: AbstractRequestScheduler) { + return function (callback) { + requestScheduler.remainingRequestsCount(function (err, count) { + if (err) return callback(err) + + const result: RequestSchedulerStatsAttributes = { + totalRequests: count, + requestsLimitPods: requestScheduler.limitPods, + requestsLimitPerPod: requestScheduler.limitPerPod, + remainingMilliSeconds: requestScheduler.remainingMilliSeconds(), + milliSecondsInterval: requestScheduler.requestInterval + } + + return callback(null, result) + }) + } +} diff --git a/server/controllers/api/requests.ts b/server/controllers/api/requests.ts deleted file mode 100644 index 5718b59b7..000000000 --- a/server/controllers/api/requests.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as express from 'express' -import { parallel } from 'async' - -import { - AbstractRequestScheduler, - getRequestScheduler, - getRequestVideoQaduScheduler, - getRequestVideoEventScheduler -} from '../../lib' -import { authenticate, ensureIsAdmin } from '../../middlewares' -import { RequestSchedulerAttributes } from '../../../shared' - -const requestsRouter = express.Router() - -requestsRouter.get('/stats', - authenticate, - ensureIsAdmin, - getStatsRequests -) - -// --------------------------------------------------------------------------- - -export { - requestsRouter -} - -// --------------------------------------------------------------------------- - -function getStatsRequests (req: express.Request, res: express.Response, next: express.NextFunction) { - parallel({ - requestScheduler: buildRequestSchedulerFunction(getRequestScheduler()), - requestVideoQaduScheduler: buildRequestSchedulerFunction(getRequestVideoQaduScheduler()), - requestVideoEventScheduler: buildRequestSchedulerFunction(getRequestVideoEventScheduler()) - }, function (err, result) { - if (err) return next(err) - - return res.json(result) - }) -} - -// --------------------------------------------------------------------------- - -function buildRequestSchedulerFunction (requestScheduler: AbstractRequestScheduler) { - return function (callback) { - requestScheduler.remainingRequestsCount(function (err, count) { - if (err) return callback(err) - - const result: RequestSchedulerAttributes = { - totalRequests: count, - requestsLimitPods: requestScheduler.limitPods, - requestsLimitPerPod: requestScheduler.limitPerPod, - remainingMilliSeconds: requestScheduler.remainingMilliSeconds(), - milliSecondsInterval: requestScheduler.requestInterval - } - - return callback(null, result) - }) - } -} diff --git a/server/tests/api/check-params/index.js b/server/tests/api/check-params/index.js index 527ab65a9..1ba16ff32 100644 --- a/server/tests/api/check-params/index.js +++ b/server/tests/api/check-params/index.js @@ -4,7 +4,7 @@ require('./pods') require('./remotes') require('./users') -require('./requests') +require('./request-schedulers') require('./videos') require('./video-abuses') require('./video-blacklists') diff --git a/server/tests/api/check-params/request-schedulers.js b/server/tests/api/check-params/request-schedulers.js new file mode 100644 index 000000000..9ba0df730 --- /dev/null +++ b/server/tests/api/check-params/request-schedulers.js @@ -0,0 +1,89 @@ +/* eslint-disable no-unused-expressions */ + +'use strict' + +const request = require('supertest') +const series = require('async/series') + +const loginUtils = require('../../utils/login') +const usersUtils = require('../../utils/users') +const serversUtils = require('../../utils/servers') + +describe('Test request schedulers stats API validators', function () { + const path = '/api/v1/request-schedulers/stats' + let server = null + let userAccessToken = null + + // --------------------------------------------------------------- + + before(function (done) { + this.timeout(20000) + + series([ + function (next) { + serversUtils.flushTests(next) + }, + function (next) { + serversUtils.runServer(1, function (server1) { + server = server1 + + next() + }) + }, + function (next) { + loginUtils.loginAndGetAccessToken(server, function (err, token) { + if (err) throw err + server.accessToken = token + + next() + }) + }, + function (next) { + const username = 'user' + const password = 'my super password' + + usersUtils.createUser(server.url, server.accessToken, username, password, next) + }, + function (next) { + const user = { + username: 'user', + password: 'my super password' + } + + loginUtils.getUserAccessToken(server, user, function (err, accessToken) { + if (err) throw err + + userAccessToken = accessToken + + next() + }) + } + ], done) + }) + + it('Should fail with an non authenticated user', function (done) { + request(server.url) + .get(path) + .set('Accept', 'application/json') + .expect(401, done) + }) + + it('Should fail with a non admin user', function (done) { + request(server.url) + .get(path) + .set('Authorization', 'Bearer ' + userAccessToken) + .set('Accept', 'application/json') + .expect(403, done) + }) + + after(function (done) { + process.kill(-server.app.pid) + + // Keep the logs if the test failed + if (this.ok) { + serversUtils.flushTests(done) + } else { + done() + } + }) +}) diff --git a/server/tests/api/check-params/requests.js b/server/tests/api/check-params/requests.js deleted file mode 100644 index 0ce5582d6..000000000 --- a/server/tests/api/check-params/requests.js +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint-disable no-unused-expressions */ - -'use strict' - -const request = require('supertest') -const series = require('async/series') - -const loginUtils = require('../../utils/login') -const usersUtils = require('../../utils/users') -const serversUtils = require('../../utils/servers') - -describe('Test requests API validators', function () { - const path = '/api/v1/requests/stats' - let server = null - let userAccessToken = null - - // --------------------------------------------------------------- - - before(function (done) { - this.timeout(20000) - - series([ - function (next) { - serversUtils.flushTests(next) - }, - function (next) { - serversUtils.runServer(1, function (server1) { - server = server1 - - next() - }) - }, - function (next) { - loginUtils.loginAndGetAccessToken(server, function (err, token) { - if (err) throw err - server.accessToken = token - - next() - }) - }, - function (next) { - const username = 'user' - const password = 'my super password' - - usersUtils.createUser(server.url, server.accessToken, username, password, next) - }, - function (next) { - const user = { - username: 'user', - password: 'my super password' - } - - loginUtils.getUserAccessToken(server, user, function (err, accessToken) { - if (err) throw err - - userAccessToken = accessToken - - next() - }) - } - ], done) - }) - - it('Should fail with an non authenticated user', function (done) { - request(server.url) - .get(path) - .set('Accept', 'application/json') - .expect(401, done) - }) - - it('Should fail with a non admin user', function (done) { - request(server.url) - .get(path) - .set('Authorization', 'Bearer ' + userAccessToken) - .set('Accept', 'application/json') - .expect(403, done) - }) - - after(function (done) { - process.kill(-server.app.pid) - - // Keep the logs if the test failed - if (this.ok) { - serversUtils.flushTests(done) - } else { - done() - } - }) -}) diff --git a/server/tests/api/index.js b/server/tests/api/index.js index cc86a3d3b..7404d7d88 100644 --- a/server/tests/api/index.js +++ b/server/tests/api/index.js @@ -9,6 +9,6 @@ require('./single-pod') require('./video-abuse') require('./video-blacklist') require('./multiple-pods') -require('./requests') +require('./request-schedulers') require('./friends-advanced') require('./video-transcoder') diff --git a/server/tests/api/request-schedulers.js b/server/tests/api/request-schedulers.js new file mode 100644 index 000000000..c5c443f14 --- /dev/null +++ b/server/tests/api/request-schedulers.js @@ -0,0 +1,111 @@ +/* eslint-disable no-unused-expressions */ + +'use strict' + +const chai = require('chai') +const each = require('async/each') +const expect = chai.expect +const request = require('supertest') + +const loginUtils = require('../utils/login') +const podsUtils = require('../utils/pods') +const serversUtils = require('../utils/servers') +const videosUtils = require('../utils/videos') + +describe('Test requests schedulers stats', function () { + const requestSchedulerNames = [ 'requestScheduler', 'requestVideoQaduScheduler', 'requestVideoEventScheduler' ] + const path = '/api/v1/request-schedulers/stats' + let servers = [] + + function uploadVideo (server, callback) { + const videoAttributes = { + tags: [ 'tag1', 'tag2' ] + } + + videosUtils.uploadVideo(server.url, server.accessToken, videoAttributes, callback) + } + + function getRequestsStats (server, callback) { + request(server.url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + server.accessToken) + .expect(200) + .end(callback) + } + + // --------------------------------------------------------------- + + before(function (done) { + this.timeout(20000) + serversUtils.flushAndRunMultipleServers(2, function (serversRun, urlsRun) { + servers = serversRun + + each(servers, function (server, callbackEach) { + loginUtils.loginAndGetAccessToken(server, function (err, accessToken) { + if (err) return callbackEach(err) + + server.accessToken = accessToken + callbackEach() + }) + }, function (err) { + if (err) throw err + + const server1 = servers[0] + podsUtils.makeFriends(server1.url, server1.accessToken, done) + }) + }) + }) + + it('Should have a correct timer', function (done) { + const server = servers[0] + + getRequestsStats(server, function (err, res) { + if (err) throw err + + const requestSchedulers = res.body + for (const requestSchedulerName of requestSchedulerNames) { + const requestScheduler = requestSchedulers[requestSchedulerName] + + expect(requestScheduler.remainingMilliSeconds).to.be.at.least(0) + expect(requestScheduler.remainingMilliSeconds).to.be.at.most(10000) + } + + done() + }) + }) + + it('Should have the correct total request', function (done) { + this.timeout(15000) + + const server = servers[0] + // Ensure the requests of pod 1 won't be made + servers[1].app.kill() + + uploadVideo(server, function (err) { + if (err) throw err + + setTimeout(function () { + getRequestsStats(server, function (err, res) { + if (err) throw err + + const requestSchedulers = res.body + const requestScheduler = requestSchedulers.requestScheduler + expect(requestScheduler.totalRequests).to.equal(1) + + done() + }) + }, 1000) + }) + }) + + after(function (done) { + process.kill(-servers[0].app.pid) + + if (this.ok) { + serversUtils.flushTests(done) + } else { + done() + } + }) +}) diff --git a/server/tests/api/requests.js b/server/tests/api/requests.js deleted file mode 100644 index 8762163af..000000000 --- a/server/tests/api/requests.js +++ /dev/null @@ -1,111 +0,0 @@ -/* eslint-disable no-unused-expressions */ - -'use strict' - -const chai = require('chai') -const each = require('async/each') -const expect = chai.expect -const request = require('supertest') - -const loginUtils = require('../utils/login') -const podsUtils = require('../utils/pods') -const serversUtils = require('../utils/servers') -const videosUtils = require('../utils/videos') - -describe('Test requests stats', function () { - const requestSchedulerNames = [ 'requestScheduler', 'requestVideoQaduScheduler', 'requestVideoEventScheduler' ] - const path = '/api/v1/requests/stats' - let servers = [] - - function uploadVideo (server, callback) { - const videoAttributes = { - tags: [ 'tag1', 'tag2' ] - } - - videosUtils.uploadVideo(server.url, server.accessToken, videoAttributes, callback) - } - - function getRequestsStats (server, callback) { - request(server.url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + server.accessToken) - .expect(200) - .end(callback) - } - - // --------------------------------------------------------------- - - before(function (done) { - this.timeout(20000) - serversUtils.flushAndRunMultipleServers(2, function (serversRun, urlsRun) { - servers = serversRun - - each(servers, function (server, callbackEach) { - loginUtils.loginAndGetAccessToken(server, function (err, accessToken) { - if (err) return callbackEach(err) - - server.accessToken = accessToken - callbackEach() - }) - }, function (err) { - if (err) throw err - - const server1 = servers[0] - podsUtils.makeFriends(server1.url, server1.accessToken, done) - }) - }) - }) - - it('Should have a correct timer', function (done) { - const server = servers[0] - - getRequestsStats(server, function (err, res) { - if (err) throw err - - const requestSchedulers = res.body - for (const requestSchedulerName of requestSchedulerNames) { - const requestScheduler = requestSchedulers[requestSchedulerName] - - expect(requestScheduler.remainingMilliSeconds).to.be.at.least(0) - expect(requestScheduler.remainingMilliSeconds).to.be.at.most(10000) - } - - done() - }) - }) - - it('Should have the correct total request', function (done) { - this.timeout(15000) - - const server = servers[0] - // Ensure the requests of pod 1 won't be made - servers[1].app.kill() - - uploadVideo(server, function (err) { - if (err) throw err - - setTimeout(function () { - getRequestsStats(server, function (err, res) { - if (err) throw err - - const requestSchedulers = res.body - const requestScheduler = requestSchedulers.requestScheduler - expect(requestScheduler.totalRequests).to.equal(1) - - done() - }) - }, 1000) - }) - }) - - after(function (done) { - process.kill(-servers[0].app.pid) - - if (this.ok) { - serversUtils.flushTests(done) - } else { - done() - } - }) -}) diff --git a/server/tests/real-world/real-world.js b/server/tests/real-world/real-world.js index 3ac13f053..ea189c5f2 100644 --- a/server/tests/real-world/real-world.js +++ b/server/tests/real-world/real-world.js @@ -13,7 +13,7 @@ const loginUtils = require('../utils/login') const podsUtils = require('../utils/pods') const serversUtils = require('../utils/servers') const videosUtils = require('../utils/videos') -const requestStatsUtils = require('../utils/requests-stats') +const requestSchedulersUtils = require('../utils/request-schedulers') program .option('-c, --create [weight]', 'Weight for creating videos') @@ -344,7 +344,7 @@ function isThereAwaitingRequests (servers, callback) { // Check is each server has awaiting requestq each(servers, function (server, callbackEach) { - requestStatsUtils.getRequestsStats(server, server.accessToken, function (err, res) { + requestSchedulersUtils.getRequestsStats(server, server.accessToken, function (err, res) { if (err) throw err const stats = res.body diff --git a/server/tests/utils/request-schedulers.js b/server/tests/utils/request-schedulers.js new file mode 100644 index 000000000..16835ce47 --- /dev/null +++ b/server/tests/utils/request-schedulers.js @@ -0,0 +1,25 @@ +'use strict' + +const request = require('supertest') + +const requestsStatsUtils = { + getRequestsStats +} + +// ---------------------- Export functions -------------------- + +function getRequestsStats (server, accessToken, callback) { + const path = '/api/v1/requests/stats' + + request(server.url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) + .end(callback) +} + +// --------------------------------------------------------------------------- + +module.exports = requestsStatsUtils diff --git a/server/tests/utils/requests-stats.js b/server/tests/utils/requests-stats.js deleted file mode 100644 index 16835ce47..000000000 --- a/server/tests/utils/requests-stats.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const request = require('supertest') - -const requestsStatsUtils = { - getRequestsStats -} - -// ---------------------- Export functions -------------------- - -function getRequestsStats (server, accessToken, callback) { - const path = '/api/v1/requests/stats' - - request(server.url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) - .end(callback) -} - -// --------------------------------------------------------------------------- - -module.exports = requestsStatsUtils diff --git a/shared/models/request-scheduler.model.ts b/shared/models/request-scheduler.model.ts index f94ccfcab..8df184a09 100644 --- a/shared/models/request-scheduler.model.ts +++ b/shared/models/request-scheduler.model.ts @@ -4,7 +4,7 @@ export type RequestVideoQaduType = 'likes' | 'dislikes' | 'views' export type RequestVideoEventType = 'likes' | 'dislikes' | 'views' -export type RequestSchedulerAttributes = { +export type RequestSchedulerStatsAttributes = { totalRequests: number requestsLimitPods: number requestsLimitPerPod: number @@ -12,8 +12,8 @@ export type RequestSchedulerAttributes = { milliSecondsInterval: number } -export interface RequestScheduler { - requestScheduler: RequestSchedulerAttributes - requestVideoQaduScheduler: RequestSchedulerAttributes - requestVideoEventScheduler: RequestSchedulerAttributes +export interface RequestSchedulerStats { + requestScheduler: RequestSchedulerStatsAttributes + requestVideoQaduScheduler: RequestSchedulerStatsAttributes + requestVideoEventScheduler: RequestSchedulerStatsAttributes }