diff --git a/components/server/ee/src/workspace/workspace-factory.ts b/components/server/ee/src/workspace/workspace-factory.ts index 4eaee44cbd6f69..ae8ddf992ea85a 100644 --- a/components/server/ee/src/workspace/workspace-factory.ts +++ b/components/server/ee/src/workspace/workspace-factory.ts @@ -32,12 +32,15 @@ import { UserDB } from "@gitpod/gitpod-db/lib"; import { UserCounter } from "../user/user-counter"; import { increasePrebuildsStartedCounter } from "../../../src/prometheus-metrics"; import { DeepPartial } from "@gitpod/gitpod-protocol/lib/util/deep-partial"; +import { EntitlementService } from "../../../src/billing/entitlement-service"; +import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server"; @injectable() export class WorkspaceFactoryEE extends WorkspaceFactory { @inject(LicenseEvaluator) protected readonly licenseEvaluator: LicenseEvaluator; @inject(HostContextProvider) protected readonly hostContextProvider: HostContextProvider; @inject(UserCounter) protected readonly userCounter: UserCounter; + @inject(EntitlementService) protected readonly entitlementService: EntitlementService; @inject(UserDB) protected readonly userDB: UserDB; @@ -334,6 +337,18 @@ export class WorkspaceFactoryEE extends WorkspaceFactory { if (user.featureFlags?.permanentWSFeatureFlags?.includes("persistent_volume_claim")) { config._featureFlags = (config._featureFlags || []).concat(["persistent_volume_claim"]); } + const billingTier = await this.entitlementService.getBillingTier(user); + const userTeams = await this.teamDB.findTeamsByUser(user.id); + // this allows to control user`s PVC feature flag via ConfigCat + if ( + await getExperimentsClientForBackend().getValueAsync("user_pvc", false, { + user, + teams: userTeams, + billingTier, + }) + ) { + config._featureFlags = (config._featureFlags || []).concat(["persistent_volume_claim"]); + } const id = await this.generateWorkspaceID(context); const newWs: Workspace = { diff --git a/components/server/src/workspace/config-provider.ts b/components/server/src/workspace/config-provider.ts index b1ca5c558ad6ab..fdd52443e13f99 100644 --- a/components/server/src/workspace/config-provider.ts +++ b/components/server/src/workspace/config-provider.ts @@ -31,6 +31,9 @@ import { HostContextProvider } from "../auth/host-context-provider"; import { AuthorizationService } from "../user/authorization-service"; import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing"; import { Config } from "../config"; +import { EntitlementService } from "../billing/entitlement-service"; +import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server"; +import { TeamDB } from "@gitpod/gitpod-db/lib"; const POD_PATH_WORKSPACE_BASE = "/workspace"; @@ -48,6 +51,8 @@ export class ConfigProvider { @inject(AuthorizationService) protected readonly authService: AuthorizationService; @inject(Config) protected readonly config: Config; @inject(ConfigurationService) protected readonly configurationService: ConfigurationService; + @inject(EntitlementService) protected readonly entitlementService: EntitlementService; + @inject(TeamDB) protected readonly teamDB: TeamDB; public async fetchConfig( ctx: TraceContext, @@ -129,6 +134,18 @@ export class ConfigProvider { NamedWorkspaceFeatureFlag.isWorkspacePersisted, ); } + const billingTier = await this.entitlementService.getBillingTier(user); + const userTeams = await this.teamDB.findTeamsByUser(user.id); + // this allows to control user`s PVC feature flag via ConfigCat + if ( + await getExperimentsClientForBackend().getValueAsync("user_pvc", false, { + user, + teams: userTeams, + billingTier, + }) + ) { + config._featureFlags = (config._featureFlags || []).concat(["persistent_volume_claim"]); + } return { config, literalConfig }; } catch (e) {