diff --git a/components/ws-manager-bridge/ee/src/container-module.ts b/components/ws-manager-bridge/ee/src/container-module.ts index 3ec56ecebbc350..823a691a8dd871 100644 --- a/components/ws-manager-bridge/ee/src/container-module.ts +++ b/components/ws-manager-bridge/ee/src/container-module.ts @@ -5,9 +5,9 @@ */ import { ContainerModule } from "inversify"; -import { WorkspaceManagerBridgeEE } from "./bridge"; -import { WorkspaceManagerBridge } from "../../src/bridge"; +import { PrebuildUpdater } from "../../src/prebuild-updater"; +import { PrebuildUpdaterDB } from "./prebuild-updater-db"; export const containerModuleEE = new ContainerModule((bind, unbind, isBound, rebind) => { - rebind(WorkspaceManagerBridge).to(WorkspaceManagerBridgeEE).inRequestScope(); + rebind(PrebuildUpdater).to(PrebuildUpdaterDB).inSingletonScope(); }); diff --git a/components/ws-manager-bridge/ee/src/bridge.ts b/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts similarity index 83% rename from components/ws-manager-bridge/ee/src/bridge.ts rename to components/ws-manager-bridge/ee/src/prebuild-updater-db.ts index 5b8d6dea964a82..3c70673df83134 100644 --- a/components/ws-manager-bridge/ee/src/bridge.ts +++ b/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts @@ -1,10 +1,9 @@ /** - * Copyright (c) 2020 Gitpod GmbH. All rights reserved. + * Copyright (c) 2022 Gitpod GmbH. All rights reserved. * Licensed under the Gitpod Enterprise Source Code License, * See License.enterprise.txt in the project root folder. */ -import { WorkspaceManagerBridge } from "../../src/bridge"; import { inject, injectable } from "inversify"; import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing"; import { WorkspaceStatus, WorkspaceType } from "@gitpod/ws-manager/lib"; @@ -12,13 +11,27 @@ import { HeadlessWorkspaceEvent } from "@gitpod/gitpod-protocol/lib/headless-wor import { WorkspaceInstance } from "@gitpod/gitpod-protocol"; import { log, LogContext } from "@gitpod/gitpod-protocol/lib/util/logging"; import { PrebuildStateMapper } from "../../src/prebuild-state-mapper"; +import { PrebuildUpdater } from "../../src/prebuild-updater"; +import { DBWithTracing, TracedWorkspaceDB } from "@gitpod/gitpod-db/lib/traced-db"; +import { WorkspaceDB } from "@gitpod/gitpod-db/lib/workspace-db"; +import { MessageBusIntegration } from "../../src/messagebus-integration"; +import { PrometheusMetricsExporter } from "../../src/prometheus-metrics-exporter"; @injectable() -export class WorkspaceManagerBridgeEE extends WorkspaceManagerBridge { +export class PrebuildUpdaterDB implements PrebuildUpdater { @inject(PrebuildStateMapper) protected readonly prebuildStateMapper: PrebuildStateMapper; - protected async updatePrebuiltWorkspace( + @inject(TracedWorkspaceDB) + protected readonly workspaceDB: DBWithTracing; + + @inject(MessageBusIntegration) + protected readonly messagebus: MessageBusIntegration; + + @inject(PrometheusMetricsExporter) + protected readonly prometheusExporter: PrometheusMetricsExporter; + + async updatePrebuiltWorkspace( ctx: TraceContext, userId: string, status: WorkspaceStatus.AsObject, @@ -91,7 +104,7 @@ export class WorkspaceManagerBridgeEE extends WorkspaceManagerBridge { } } - protected async stopPrebuildInstance(ctx: TraceContext, instance: WorkspaceInstance): Promise { + async stopPrebuildInstance(ctx: TraceContext, instance: WorkspaceInstance): Promise { const span = TraceContext.startSpan("stopPrebuildInstance", ctx); const prebuild = await this.workspaceDB.trace({}).findPrebuildByWorkspaceID(instance.workspaceId); diff --git a/components/ws-manager-bridge/src/bridge.ts b/components/ws-manager-bridge/src/bridge.ts index a69fd51beee0de..4ba5dd08571799 100644 --- a/components/ws-manager-bridge/src/bridge.ts +++ b/components/ws-manager-bridge/src/bridge.ts @@ -37,6 +37,7 @@ import { WorkspaceCluster } from "@gitpod/gitpod-protocol/lib/workspace-cluster" import { repeat } from "@gitpod/gitpod-protocol/lib/util/repeat"; import { PreparingUpdateEmulator, PreparingUpdateEmulatorFactory } from "./preparing-update-emulator"; import { performance } from "perf_hooks"; +import { PrebuildUpdater } from "./prebuild-updater"; export const WorkspaceManagerBridgeFactory = Symbol("WorkspaceManagerBridgeFactory"); @@ -73,6 +74,9 @@ export class WorkspaceManagerBridge implements Disposable { @inject(IAnalyticsWriter) protected readonly analytics: IAnalyticsWriter; + @inject(PrebuildUpdater) + protected readonly prebuildUpdater: PrebuildUpdater; + protected readonly disposables = new DisposableCollection(); protected readonly queues = new Map(); @@ -348,7 +352,7 @@ export class WorkspaceManagerBridge implements Disposable { span.setTag("after", JSON.stringify(instance)); // now notify all prebuild listeners about updates - and update DB if needed - await this.updatePrebuiltWorkspace({ span }, userId, status, writeToDB); + await this.prebuildUpdater.updatePrebuiltWorkspace({ span }, userId, status, writeToDB); // update volume snapshot information if ( @@ -462,24 +466,11 @@ export class WorkspaceManagerBridge implements Disposable { instance.stoppedTime = new Date().toISOString(); promises.push(this.workspaceDB.trace({}).storeInstance(instance)); promises.push(this.onInstanceStopped({}, ri.workspace.ownerId, instance)); - promises.push(this.stopPrebuildInstance(ctx, instance)); + promises.push(this.prebuildUpdater.stopPrebuildInstance(ctx, instance)); } await Promise.all(promises); } - protected async updatePrebuiltWorkspace( - ctx: TraceContext, - userId: string, - status: WorkspaceStatus.AsObject, - writeToDB: boolean, - ) { - // prebuilds are an EE feature - we just need the hook here - } - - protected async stopPrebuildInstance(ctx: TraceContext, instance: WorkspaceInstance): Promise { - // prebuilds are an EE feature - we just need the hook here - } - protected async onInstanceStopped( ctx: TraceContext, ownerUserID: string, diff --git a/components/ws-manager-bridge/src/container-module.ts b/components/ws-manager-bridge/src/container-module.ts index bd0f8c09b57823..61aa89dfe45f26 100644 --- a/components/ws-manager-bridge/src/container-module.ts +++ b/components/ws-manager-bridge/src/container-module.ts @@ -34,6 +34,7 @@ import { IClientCallMetrics } from "@gitpod/content-service/lib/client-call-metr import { PrometheusClientCallMetrics } from "@gitpod/gitpod-protocol/lib/messaging/client-call-metrics"; import { PreparingUpdateEmulator, PreparingUpdateEmulatorFactory } from "./preparing-update-emulator"; import { PrebuildStateMapper } from "./prebuild-state-mapper"; +import { PrebuildUpdater, PrebuildUpdaterNoOp } from "./prebuild-updater"; export const containerModule = new ContainerModule((bind) => { bind(MessagebusConfiguration).toSelf().inSingletonScope(); @@ -83,4 +84,5 @@ export const containerModule = new ContainerModule((bind) => { bind(PreparingUpdateEmulatorFactory).toAutoFactory(PreparingUpdateEmulator); bind(PrebuildStateMapper).toSelf().inSingletonScope(); + bind(PrebuildUpdater).to(PrebuildUpdaterNoOp).inSingletonScope(); }); diff --git a/components/ws-manager-bridge/src/prebuild-updater.ts b/components/ws-manager-bridge/src/prebuild-updater.ts new file mode 100644 index 00000000000000..bcfe6b9793f985 --- /dev/null +++ b/components/ws-manager-bridge/src/prebuild-updater.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2022 Gitpod GmbH. All rights reserved. + * Licensed under the Gitpod Enterprise Source Code License, + * See License.enterprise.txt in the project root folder. + */ + +import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing"; +import { WorkspaceStatus } from "@gitpod/ws-manager/lib"; +import { WorkspaceInstance } from "@gitpod/gitpod-protocol"; +import { injectable } from "inversify"; + +export const PrebuildUpdater = Symbol("PrebuildUpdater"); + +export interface PrebuildUpdater { + updatePrebuiltWorkspace( + ctx: TraceContext, + userId: string, + status: WorkspaceStatus.AsObject, + writeToDB: boolean, + ): Promise; + + stopPrebuildInstance(ctx: TraceContext, instance: WorkspaceInstance): Promise; +} + +@injectable() +export class PrebuildUpdaterNoOp implements PrebuildUpdater { + async updatePrebuiltWorkspace( + ctx: TraceContext, + userId: string, + status: WorkspaceStatus.AsObject, + writeToDB: boolean, + ): Promise {} + + async stopPrebuildInstance(ctx: TraceContext, instance: WorkspaceInstance): Promise {} +}