1 import { randomInt } from 'crypto'
2 import { HttpStatusCode } from '@shared/models'
3 import { makePostBodyRequest } from '../requests'
5 export class ObjectStorageCommand {
6 static readonly DEFAULT_SCALEWAY_BUCKET = 'peertube-ci-test'
8 private readonly bucketsCreated: string[] = []
9 private readonly seed: number
11 // ---------------------------------------------------------------------------
14 this.seed = randomInt(0, 10000)
17 static getMockCredentialsConfig () {
19 access_key_id: 'AKIAIOSFODNN7EXAMPLE',
20 secret_access_key: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
24 static getMockEndpointHost () {
25 return 'localhost:9444'
28 static getMockRegion () {
32 getDefaultMockConfig () {
36 endpoint: 'http://' + ObjectStorageCommand.getMockEndpointHost(),
37 region: ObjectStorageCommand.getMockRegion(),
39 credentials: ObjectStorageCommand.getMockCredentialsConfig(),
41 streaming_playlists: {
42 bucket_name: this.getMockStreamingPlaylistsBucketName()
46 bucket_name: this.getMockWebVideosBucketName()
52 getMockWebVideosBaseUrl () {
53 return `http://${this.getMockWebVideosBucketName()}.${ObjectStorageCommand.getMockEndpointHost()}/`
56 getMockPlaylistBaseUrl () {
57 return `http://${this.getMockStreamingPlaylistsBucketName()}.${ObjectStorageCommand.getMockEndpointHost()}/`
60 async prepareDefaultMockBuckets () {
61 await this.createMockBucket(this.getMockStreamingPlaylistsBucketName())
62 await this.createMockBucket(this.getMockWebVideosBucketName())
65 async createMockBucket (name: string) {
66 this.bucketsCreated.push(name)
68 await this.deleteMockBucket(name)
70 await makePostBodyRequest({
71 url: ObjectStorageCommand.getMockEndpointHost(),
72 path: '/ui/' + name + '?create',
73 expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307
76 await makePostBodyRequest({
77 url: ObjectStorageCommand.getMockEndpointHost(),
78 path: '/ui/' + name + '?make-public',
79 expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307
83 async cleanupMock () {
84 for (const name of this.bucketsCreated) {
85 await this.deleteMockBucket(name)
89 getMockStreamingPlaylistsBucketName (name = 'streaming-playlists') {
90 return this.getMockBucketName(name)
93 getMockWebVideosBucketName (name = 'web-videos') {
94 return this.getMockBucketName(name)
97 getMockBucketName (name: string) {
98 return `${this.seed}-${name}`
101 private async deleteMockBucket (name: string) {
102 await makePostBodyRequest({
103 url: ObjectStorageCommand.getMockEndpointHost(),
104 path: '/ui/' + name + '?delete',
105 expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307
109 // ---------------------------------------------------------------------------
111 static getDefaultScalewayConfig (options: {
113 enablePrivateProxy?: boolean // default true
114 privateACL?: 'private' | 'public-read' // default 'private'
116 const { serverNumber, enablePrivateProxy = true, privateACL = 'private' } = options
121 endpoint: this.getScalewayEndpointHost(),
122 region: this.getScalewayRegion(),
124 credentials: this.getScalewayCredentialsConfig(),
131 proxify_private_files: enablePrivateProxy
134 streaming_playlists: {
135 bucket_name: this.DEFAULT_SCALEWAY_BUCKET,
136 prefix: `test:server-${serverNumber}-streaming-playlists:`
140 bucket_name: this.DEFAULT_SCALEWAY_BUCKET,
141 prefix: `test:server-${serverNumber}-videos:`
147 static getScalewayCredentialsConfig () {
149 access_key_id: process.env.OBJECT_STORAGE_SCALEWAY_KEY_ID,
150 secret_access_key: process.env.OBJECT_STORAGE_SCALEWAY_ACCESS_KEY
154 static getScalewayEndpointHost () {
155 return 's3.fr-par.scw.cloud'
158 static getScalewayRegion () {
162 static getScalewayBaseUrl () {
163 return `https://${this.DEFAULT_SCALEWAY_BUCKET}.${this.getScalewayEndpointHost()}/`