Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/gitpod-db/src/workspace-cluster-db.spec.db.ts
2497 views
1
/**
2
* Copyright (c) 2022 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import * as chai from "chai";
8
import { suite, test, timeout } from "@testdeck/mocha";
9
import { testContainer } from "./test-container";
10
import { TypeORM } from "./typeorm/typeorm";
11
import { WorkspaceCluster, WorkspaceClusterDB } from "@gitpod/gitpod-protocol/lib/workspace-cluster";
12
import { DBWorkspaceCluster } from "./typeorm/entity/db-workspace-cluster";
13
import { resetDB } from "./test/reset-db";
14
const expect = chai.expect;
15
16
@suite
17
@timeout(5000)
18
export class WorkspaceClusterDBSpec {
19
typeORM = testContainer.get<TypeORM>(TypeORM);
20
db = testContainer.get<WorkspaceClusterDB>(WorkspaceClusterDB);
21
22
async before() {
23
await this.clear();
24
}
25
26
async after() {
27
await this.clear();
28
}
29
30
protected async clear() {
31
await resetDB(this.typeORM);
32
}
33
34
@test public async findByName() {
35
const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({
36
name: "eu71",
37
region: "europe",
38
url: "some-url",
39
state: "available",
40
score: 100,
41
maxScore: 100,
42
govern: true,
43
});
44
const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({
45
name: "us71",
46
region: "europe",
47
url: "some-url",
48
state: "cordoned",
49
score: 0,
50
maxScore: 0,
51
govern: false,
52
});
53
54
await this.db.save(wsc1);
55
await this.db.save(wsc2);
56
57
const result = await this.db.findByName("eu71");
58
expect(result).not.to.be.undefined;
59
expect((result as WorkspaceCluster).name).to.equal("eu71");
60
61
// Can find the eu71 cluster as seen by the us02 application cluster.
62
const result2 = await this.db.findByName("eu71");
63
expect(result2).not.to.be.undefined;
64
expect((result2 as WorkspaceCluster).name).to.equal("eu71");
65
}
66
67
@test public async deleteByName() {
68
const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({
69
name: "eu71",
70
region: "europe",
71
url: "some-url",
72
state: "available",
73
score: 100,
74
maxScore: 100,
75
govern: true,
76
});
77
const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({
78
name: "us71",
79
region: "europe",
80
url: "some-url",
81
state: "cordoned",
82
score: 0,
83
maxScore: 0,
84
govern: false,
85
});
86
87
await this.db.save(wsc1);
88
await this.db.save(wsc2);
89
90
await this.db.deleteByName("eu71");
91
expect(await this.db.findByName("eu71")).to.be.undefined;
92
expect(await this.db.findByName("us71")).not.to.be.undefined;
93
}
94
95
@test public async testFindFilteredByName() {
96
const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({
97
name: "eu71",
98
region: "north-america",
99
url: "some-url",
100
state: "cordoned",
101
score: 0,
102
maxScore: 0,
103
govern: false,
104
availableWorkspaceClasses: [
105
{
106
id: "some-class",
107
displayName: "Some Class",
108
description: "Some class description",
109
creditsPerMinute: 0.5,
110
},
111
],
112
preferredWorkspaceClass: "some-class",
113
});
114
const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({
115
name: "us71",
116
region: "europe",
117
url: "some-url",
118
state: "cordoned",
119
score: 0,
120
maxScore: 0,
121
govern: false,
122
});
123
124
await this.db.save(wsc1);
125
await this.db.save(wsc2);
126
127
const wscs = await this.db.findFiltered({ name: "eu71" });
128
expect(wscs.length).to.equal(1);
129
expect(wscs[0].name).to.equal("eu71");
130
expect(wscs[0].availableWorkspaceClasses).to.deep.equal([
131
{
132
id: "some-class",
133
displayName: "Some Class",
134
description: "Some class description",
135
creditsPerMinute: 0.5,
136
},
137
]);
138
}
139
140
@test public async testFindFilteredByApplicationCluster() {
141
const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({
142
name: "eu71",
143
region: "europe",
144
url: "some-url",
145
state: "available",
146
score: 100,
147
maxScore: 100,
148
govern: true,
149
admissionConstraints: [],
150
});
151
const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({
152
name: "us71",
153
region: "north-america",
154
url: "some-url",
155
state: "available",
156
score: 100,
157
maxScore: 100,
158
govern: true,
159
admissionConstraints: [],
160
});
161
162
await this.db.save(wsc1);
163
await this.db.save(wsc2);
164
165
const wscs2 = await this.db.findFiltered({});
166
expect(wscs2.length).to.equal(2);
167
}
168
169
@test public async testFindFilteredExcludesDeletedClusters() {
170
const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({
171
name: "eu71",
172
region: "europe",
173
url: "some-url",
174
state: "available",
175
score: 100,
176
maxScore: 100,
177
govern: true,
178
});
179
const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({
180
name: "us71",
181
region: "north-america",
182
url: "some-url",
183
state: "available",
184
score: 100,
185
maxScore: 100,
186
govern: true,
187
});
188
189
await this.db.save(wsc1);
190
await this.db.save(wsc2);
191
192
await this.db.deleteByName("eu71");
193
194
const wscs = await this.db.findFiltered({});
195
expect(wscs.length).to.equal(1);
196
}
197
198
@test public async testFindFilteredWithRegion() {
199
const clusters: DBWorkspaceCluster[] = [
200
dbWorkspaceCluster({
201
name: "eu71",
202
region: "europe",
203
url: "some-url",
204
state: "available",
205
score: 100,
206
maxScore: 100,
207
govern: true,
208
}),
209
dbWorkspaceCluster({
210
name: "eu72",
211
region: "",
212
url: "some-url",
213
state: "cordoned",
214
score: 0,
215
maxScore: 0,
216
govern: false,
217
}),
218
dbWorkspaceCluster({
219
name: "us71",
220
region: "",
221
url: "some-url",
222
state: "available",
223
score: 100,
224
maxScore: 100,
225
govern: true,
226
}),
227
];
228
229
for (const cluster of clusters) {
230
await this.db.save(cluster);
231
}
232
233
const withoutRegionFilter = await this.db.findFiltered({});
234
expect(withoutRegionFilter.length).to.equal(3);
235
236
const matchingEurope = await this.db.findFiltered({ region: "europe" });
237
expect(matchingEurope.length).to.equal(1);
238
}
239
}
240
241
function dbWorkspaceCluster(cluster: Omit<DBWorkspaceCluster, "deleted">): DBWorkspaceCluster {
242
return { ...cluster, deleted: false };
243
}
244
245
module.exports = WorkspaceClusterDBSpec;
246
247