From 7fa4cbb928a26ffb50b85161327a2e24b1256457 Mon Sep 17 00:00:00 2001 From: "Pavel Tumik @ GitPod" <18602811+sagor999@users.noreply.github.com> Date: Tue, 16 Aug 2022 15:52:10 -0700 Subject: [PATCH] [server] ensure that user that has PVC enabled will not force prebuilds to use them on projects that don't have PVC turned on --- .../ee/src/prebuilds/prebuild-manager.ts | 2 +- .../ee/src/workspace/workspace-starter.ts | 4 ++-- .../server/src/workspace/workspace-starter.ts | 20 +++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/components/server/ee/src/prebuilds/prebuild-manager.ts b/components/server/ee/src/prebuilds/prebuild-manager.ts index c43c32cae157c3..d56202d032dc7a 100644 --- a/components/server/ee/src/prebuilds/prebuild-manager.ts +++ b/components/server/ee/src/prebuilds/prebuild-manager.ts @@ -238,7 +238,7 @@ export class PrebuildManager { const usePVC = this.shouldUsePersistentVolumeClaim(project); await this.workspaceStarter.startWorkspace({ span }, workspace, user, [], projectEnvVars, { excludeFeatureFlags: ["full_workspace_backup"], - forcePVC: usePVC, + pvcEnabledForPrebuilds: usePVC, }); } diff --git a/components/server/ee/src/workspace/workspace-starter.ts b/components/server/ee/src/workspace/workspace-starter.ts index 3e560925c3a1b0..b4166830a789f7 100644 --- a/components/server/ee/src/workspace/workspace-starter.ts +++ b/components/server/ee/src/workspace/workspace-starter.ts @@ -24,7 +24,7 @@ export class WorkspaceStarterEE extends WorkspaceStarter { user: User, excludeFeatureFlags: NamedWorkspaceFeatureFlag[], ideConfig: IDEConfig, - forcePVC: boolean, + pvcEnabledForPrebuilds: boolean, ): Promise { const instance = await super.newInstance( ctx, @@ -33,7 +33,7 @@ export class WorkspaceStarterEE extends WorkspaceStarter { user, excludeFeatureFlags, ideConfig, - forcePVC, + pvcEnabledForPrebuilds, ); return instance; diff --git a/components/server/src/workspace/workspace-starter.ts b/components/server/src/workspace/workspace-starter.ts index 4b78ebf916f532..fb37941bfd0c23 100644 --- a/components/server/src/workspace/workspace-starter.ts +++ b/components/server/src/workspace/workspace-starter.ts @@ -128,7 +128,7 @@ export interface StartWorkspaceOptions { rethrow?: boolean; forceDefaultImage?: boolean; excludeFeatureFlags?: NamedWorkspaceFeatureFlag[]; - forcePVC?: boolean; + pvcEnabledForPrebuilds?: boolean; } const MAX_INSTANCE_START_RETRIES = 2; @@ -352,7 +352,7 @@ export class WorkspaceStarter { user, options.excludeFeatureFlags || [], ideConfig, - options.forcePVC || false, + options.pvcEnabledForPrebuilds || false, ), ); span.log({ newInstance: instance.id }); @@ -743,7 +743,7 @@ export class WorkspaceStarter { user: User, excludeFeatureFlags: NamedWorkspaceFeatureFlag[], ideConfig: IDEConfig, - forcePVC: boolean, + pvcEnabledForPrebuilds: boolean, ): Promise { const span = TraceContext.startSpan("buildWorkspaceImage", ctx); //#endregion IDE resolution TODO(ak) move to IDE service @@ -828,8 +828,15 @@ export class WorkspaceStarter { featureFlags = featureFlags.filter((f) => !excludeFeatureFlags.includes(f)); - if (forcePVC === true) { - featureFlags = featureFlags.concat(["persistent_volume_claim"]); + if (workspace.type === "prebuild") { + if (pvcEnabledForPrebuilds === true) { + featureFlags = featureFlags.concat(["persistent_volume_claim"]); + } else { + // If PVC is disabled for prebuilds, we need to remove the PVC feature flag. + // This is necessary to ensure if user has PVC enabled on their account, that they + // will not hijack prebuild with PVC and make everyone who use this prebuild to auto enroll into PVC feature. + featureFlags = featureFlags.filter((f) => f !== "persistent_volume_claim"); + } } let workspaceClass = ""; @@ -1428,7 +1435,8 @@ export class WorkspaceStarter { } const volumeSnapshotId = -((SnapshotContext.is(workspace.context) || WithPrebuild.is(workspace.context)) && !!workspace.context.snapshotBucketId) + (SnapshotContext.is(workspace.context) || WithPrebuild.is(workspace.context)) && + !!workspace.context.snapshotBucketId ? workspace.context.snapshotBucketId : lastValidWorkspaceInstanceId;