From 483930abd3fffacf1ed74e16ee61084df7594c64 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 2 Nov 2022 10:10:40 +0000 Subject: [PATCH 1/4] Change deleteByName to use soft deletion --- components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts index 40df731a32dfdb..11594d2eb3b673 100644 --- a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts +++ b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts @@ -34,7 +34,7 @@ export class WorkspaceClusterDBImpl implements WorkspaceClusterDB { async deleteByName(name: string, applicationCluster: string): Promise { const repo = await this.getRepo(); - await repo.delete({ name, applicationCluster }); + await repo.update({ name, applicationCluster }, { deleted: true }); } async findByName(name: string, applicationCluster: string): Promise { From d1ee343fe546bd94d69259b4065b291e5c0efb4c Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 2 Nov 2022 10:20:32 +0000 Subject: [PATCH 2/4] Filter out deleted clusters in findByName --- components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts index 11594d2eb3b673..855ad2e451a5e2 100644 --- a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts +++ b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts @@ -39,7 +39,7 @@ export class WorkspaceClusterDBImpl implements WorkspaceClusterDB { async findByName(name: string, applicationCluster: string): Promise { const repo = await this.getRepo(); - return repo.findOne({ name, applicationCluster }); + return repo.findOne({ name, applicationCluster, deleted: false }); } async findFiltered(predicate: WorkspaceClusterFilter): Promise { From face70ee4f0ea86b00cf6e284020d25d45331049 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 2 Nov 2022 10:43:20 +0000 Subject: [PATCH 3/4] Add failing test for findFiltered Check that the method correctly excludes soft-deleted clusters. --- .../src/workspace-cluster-db.spec.db.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/components/gitpod-db/src/workspace-cluster-db.spec.db.ts b/components/gitpod-db/src/workspace-cluster-db.spec.db.ts index 7b7a3c6deced9e..6732e3237c7500 100644 --- a/components/gitpod-db/src/workspace-cluster-db.spec.db.ts +++ b/components/gitpod-db/src/workspace-cluster-db.spec.db.ts @@ -242,6 +242,47 @@ export class WorkspaceClusterDBSpec { expect(wscs2.length).to.equal(2); expect(wscs2).to.deep.include.members(expectedClusters2); } + + @test public async testFindFilteredExcludesDeletedClusters() { + const wsc1: DBWorkspaceCluster = dbWorkspaceCluster({ + name: "eu71", + applicationCluster: "eu02", + url: "some-url", + state: "available", + score: 100, + maxScore: 100, + govern: true, + }); + const wsc1a: DBWorkspaceCluster = dbWorkspaceCluster({ + name: "eu71", + applicationCluster: "us02", + url: "some-url", + state: "cordoned", + score: 0, + maxScore: 0, + govern: false, + }); + const wsc2: DBWorkspaceCluster = dbWorkspaceCluster({ + name: "us71", + applicationCluster: "us02", + url: "some-url", + state: "available", + score: 100, + maxScore: 100, + govern: true, + }); + + await this.db.save(wsc1); + await this.db.save(wsc1a); + await this.db.save(wsc2); + + await this.db.deleteByName("eu71", "us02"); + + let wscs = await this.db.findFiltered({ applicationCluster: "us02" }); + expect(wscs.length).to.equal(1); + wscs = await this.db.findFiltered({ applicationCluster: "eu02" }); + expect(wscs.length).to.equal(1); + } } function dbWorkspaceCluster(cluster: Omit): DBWorkspaceCluster { From f364bdc8c76741c51b05ead716cae78e03935ec8 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 2 Nov 2022 10:44:17 +0000 Subject: [PATCH 4/4] Make findFiltered respect soft deletion --- components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts index 855ad2e451a5e2..85f5c039c98f20 100644 --- a/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts +++ b/components/gitpod-db/src/typeorm/workspace-cluster-db-impl.ts @@ -58,7 +58,7 @@ export class WorkspaceClusterDBImpl implements WorkspaceClusterDB { let qb = repo .createQueryBuilder("wsc") .select(Object.keys(prototype).map((k) => `wsc.${k}`)) - .where("TRUE = TRUE"); // make sure andWhere works + .where("wsc.deleted = 0"); if (predicate.name !== undefined) { qb = qb.andWhere("wsc.name = :name", predicate); }