Skip to content

Commit 655c2b9

Browse files
committed
[server] allow user custom global timeout
1 parent 6ab9dc4 commit 655c2b9

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

components/server/ee/src/billing/entitlement-service.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
WorkspaceInstance,
1111
WorkspaceTimeoutDuration,
1212
WORKSPACE_TIMEOUT_DEFAULT_LONG,
13+
WORKSPACE_TIMEOUT_DEFAULT_SHORT,
1314
} from "@gitpod/gitpod-protocol";
1415
import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
1516
import { inject, injectable } from "inversify";
@@ -83,20 +84,28 @@ export class EntitlementServiceImpl implements EntitlementService {
8384
}
8485

8586
async getDefaultWorkspaceTimeout(user: User, date: Date = new Date()): Promise<WorkspaceTimeoutDuration> {
87+
let userWorkspaceTimeout: WorkspaceTimeoutDuration | undefined;
88+
try {
89+
userWorkspaceTimeout = WorkspaceTimeoutDuration.validate(user.additionalData?.workspaceTimeout || "");
90+
} catch (e) {}
91+
let defaultWorkspaceTimeout: WorkspaceTimeoutDuration = WORKSPACE_TIMEOUT_DEFAULT_SHORT;
8692
try {
8793
const billingMode = await this.billingModes.getBillingModeForUser(user, date);
8894
switch (billingMode.mode) {
8995
case "none":
90-
return this.license.getDefaultWorkspaceTimeout(user, date);
96+
defaultWorkspaceTimeout = await this.license.getDefaultWorkspaceTimeout(user, date);
9197
case "chargebee":
92-
return this.chargebee.getDefaultWorkspaceTimeout(user, date);
98+
defaultWorkspaceTimeout = await this.chargebee.getDefaultWorkspaceTimeout(user, date);
9399
case "usage-based":
94-
return this.ubp.getDefaultWorkspaceTimeout(user, date);
100+
defaultWorkspaceTimeout = await this.ubp.getDefaultWorkspaceTimeout(user, date);
95101
}
96102
} catch (err) {
97103
log.error({ userId: user.id }, "EntitlementService error: getDefaultWorkspaceTimeout", err);
98-
return WORKSPACE_TIMEOUT_DEFAULT_LONG;
104+
defaultWorkspaceTimeout = WORKSPACE_TIMEOUT_DEFAULT_LONG;
99105
}
106+
return userWorkspaceTimeout && defaultWorkspaceTimeout == WORKSPACE_TIMEOUT_DEFAULT_LONG
107+
? userWorkspaceTimeout
108+
: defaultWorkspaceTimeout;
100109
}
101110

102111
async userGetsMoreResources(user: User, date: Date = new Date()): Promise<boolean> {

components/server/src/workspace/workspace-starter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,7 @@ export class WorkspaceStarter {
14371437
lastValidWorkspaceInstanceId,
14381438
);
14391439
const userTimeoutPromise = this.entitlementService.getDefaultWorkspaceTimeout(user, new Date());
1440+
const allowSetTimeout = this.entitlementService.maySetTimeout(user, new Date());
14401441

14411442
let featureFlags = instance.configuration!.featureFlags || [];
14421443

@@ -1468,6 +1469,9 @@ export class WorkspaceStarter {
14681469

14691470
if (workspace.type === "regular") {
14701471
spec.setTimeout(await userTimeoutPromise);
1472+
if ((await allowSetTimeout) && user.additionalData?.disabledClosedTimeout === true) {
1473+
spec.setClosedTimeout("0");
1474+
}
14711475
}
14721476
spec.setAdmission(admissionLevel);
14731477
const sshKeys = await this.userDB.trace(traceCtx).getSSHPublicKeys(user.id);

0 commit comments

Comments
 (0)