Path: blob/main/components/gitpod-db/src/workspace-cluster-db.spec.db.ts
2497 views
/**1* Copyright (c) 2022 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import * as chai from "chai";7import { suite, test, timeout } from "@testdeck/mocha";8import { testContainer } from "./test-container";9import { TypeORM } from "./typeorm/typeorm";10import { WorkspaceCluster, WorkspaceClusterDB } from "@gitpod/gitpod-protocol/lib/workspace-cluster";11import { DBWorkspaceCluster } from "./typeorm/entity/db-workspace-cluster";12import { resetDB } from "./test/reset-db";13const expect = chai.expect;1415@suite16@timeout(5000)17export class WorkspaceClusterDBSpec {18typeORM = testContainer.get<TypeORM>(TypeORM);19db = testContainer.get<WorkspaceClusterDB>(WorkspaceClusterDB);2021async before() {22await this.clear();23}2425async after() {26await this.clear();27}2829protected async clear() {30await resetDB(this.typeORM);31}3233@test public async findByName() {34const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({35name: "eu71",36region: "europe",37url: "some-url",38state: "available",39score: 100,40maxScore: 100,41govern: true,42});43const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({44name: "us71",45region: "europe",46url: "some-url",47state: "cordoned",48score: 0,49maxScore: 0,50govern: false,51});5253await this.db.save(wsc1);54await this.db.save(wsc2);5556const result = await this.db.findByName("eu71");57expect(result).not.to.be.undefined;58expect((result as WorkspaceCluster).name).to.equal("eu71");5960// Can find the eu71 cluster as seen by the us02 application cluster.61const result2 = await this.db.findByName("eu71");62expect(result2).not.to.be.undefined;63expect((result2 as WorkspaceCluster).name).to.equal("eu71");64}6566@test public async deleteByName() {67const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({68name: "eu71",69region: "europe",70url: "some-url",71state: "available",72score: 100,73maxScore: 100,74govern: true,75});76const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({77name: "us71",78region: "europe",79url: "some-url",80state: "cordoned",81score: 0,82maxScore: 0,83govern: false,84});8586await this.db.save(wsc1);87await this.db.save(wsc2);8889await this.db.deleteByName("eu71");90expect(await this.db.findByName("eu71")).to.be.undefined;91expect(await this.db.findByName("us71")).not.to.be.undefined;92}9394@test public async testFindFilteredByName() {95const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({96name: "eu71",97region: "north-america",98url: "some-url",99state: "cordoned",100score: 0,101maxScore: 0,102govern: false,103availableWorkspaceClasses: [104{105id: "some-class",106displayName: "Some Class",107description: "Some class description",108creditsPerMinute: 0.5,109},110],111preferredWorkspaceClass: "some-class",112});113const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({114name: "us71",115region: "europe",116url: "some-url",117state: "cordoned",118score: 0,119maxScore: 0,120govern: false,121});122123await this.db.save(wsc1);124await this.db.save(wsc2);125126const wscs = await this.db.findFiltered({ name: "eu71" });127expect(wscs.length).to.equal(1);128expect(wscs[0].name).to.equal("eu71");129expect(wscs[0].availableWorkspaceClasses).to.deep.equal([130{131id: "some-class",132displayName: "Some Class",133description: "Some class description",134creditsPerMinute: 0.5,135},136]);137}138139@test public async testFindFilteredByApplicationCluster() {140const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({141name: "eu71",142region: "europe",143url: "some-url",144state: "available",145score: 100,146maxScore: 100,147govern: true,148admissionConstraints: [],149});150const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({151name: "us71",152region: "north-america",153url: "some-url",154state: "available",155score: 100,156maxScore: 100,157govern: true,158admissionConstraints: [],159});160161await this.db.save(wsc1);162await this.db.save(wsc2);163164const wscs2 = await this.db.findFiltered({});165expect(wscs2.length).to.equal(2);166}167168@test public async testFindFilteredExcludesDeletedClusters() {169const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({170name: "eu71",171region: "europe",172url: "some-url",173state: "available",174score: 100,175maxScore: 100,176govern: true,177});178const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({179name: "us71",180region: "north-america",181url: "some-url",182state: "available",183score: 100,184maxScore: 100,185govern: true,186});187188await this.db.save(wsc1);189await this.db.save(wsc2);190191await this.db.deleteByName("eu71");192193const wscs = await this.db.findFiltered({});194expect(wscs.length).to.equal(1);195}196197@test public async testFindFilteredWithRegion() {198const clusters: DBWorkspaceCluster[] = [199dbWorkspaceCluster({200name: "eu71",201region: "europe",202url: "some-url",203state: "available",204score: 100,205maxScore: 100,206govern: true,207}),208dbWorkspaceCluster({209name: "eu72",210region: "",211url: "some-url",212state: "cordoned",213score: 0,214maxScore: 0,215govern: false,216}),217dbWorkspaceCluster({218name: "us71",219region: "",220url: "some-url",221state: "available",222score: 100,223maxScore: 100,224govern: true,225}),226];227228for (const cluster of clusters) {229await this.db.save(cluster);230}231232const withoutRegionFilter = await this.db.findFiltered({});233expect(withoutRegionFilter.length).to.equal(3);234235const matchingEurope = await this.db.findFiltered({ region: "europe" });236expect(matchingEurope.length).to.equal(1);237}238}239240function dbWorkspaceCluster(cluster: Omit<DBWorkspaceCluster, "deleted">): DBWorkspaceCluster {241return { ...cluster, deleted: false };242}243244module.exports = WorkspaceClusterDBSpec;245246247