Skip to content

Commit ebf57a4

Browse files
committed
[server] allow user custom global timeout
1 parent ce51dae commit ebf57a4

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

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

+13-4
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

+4
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,7 @@ export class WorkspaceStarter {
14761476
lastValidWorkspaceInstanceId,
14771477
);
14781478
const userTimeoutPromise = this.entitlementService.getDefaultWorkspaceTimeout(user, new Date());
1479+
const allowSetTimeout = this.entitlementService.maySetTimeout(user, new Date());
14791480

14801481
let featureFlags = instance.configuration!.featureFlags || [];
14811482

@@ -1507,6 +1508,9 @@ export class WorkspaceStarter {
15071508

15081509
if (workspace.type === "regular") {
15091510
spec.setTimeout(await userTimeoutPromise);
1511+
if ((await allowSetTimeout) && user.additionalData?.disabledClosedTimeout === true) {
1512+
spec.setClosedTimeout("0");
1513+
}
15101514
}
15111515
spec.setAdmission(admissionLevel);
15121516
const sshKeys = await this.userDB.trace(traceCtx).getSSHPublicKeys(user.id);

0 commit comments

Comments
 (0)