Skip to content

Commit c6b20e1

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

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

components/gitpod-protocol/src/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ export interface AdditionalUserData {
256256
isMigratedToTeamOnlyAttribution?: boolean;
257257
// user globol workspace timeout
258258
workspaceTimeout?: string;
259+
// control whether to enable the closed timeout of a workspace, i.e. close web ide, disconnect ssh connection
259260
disabledClosedTimeout?: boolean;
260261
}
261262
export namespace AdditionalUserData {

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import {
5757
Project,
5858
GitpodServer,
5959
IDESettings,
60+
WorkspaceTimeoutDuration,
6061
} from "@gitpod/gitpod-protocol";
6162
import { IAnalyticsWriter } from "@gitpod/gitpod-protocol/lib/analytics";
6263
import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
@@ -1437,6 +1438,7 @@ export class WorkspaceStarter {
14371438
lastValidWorkspaceInstanceId,
14381439
);
14391440
const userTimeoutPromise = this.entitlementService.getDefaultWorkspaceTimeout(user, new Date());
1441+
const allowSetTimeoutPromise = this.entitlementService.maySetTimeout(user, new Date());
14401442

14411443
let featureFlags = instance.configuration!.featureFlags || [];
14421444

@@ -1467,7 +1469,19 @@ export class WorkspaceStarter {
14671469
spec.setClass(instance.workspaceClass!);
14681470

14691471
if (workspace.type === "regular") {
1470-
spec.setTimeout(await userTimeoutPromise);
1472+
const [defaultTimeout, allowSetTimeout] = await Promise.all([userTimeoutPromise, allowSetTimeoutPromise]);
1473+
spec.setTimeout(defaultTimeout);
1474+
if (allowSetTimeout) {
1475+
if (user.additionalData?.workspaceTimeout) {
1476+
try {
1477+
let timeout = WorkspaceTimeoutDuration.validate(user.additionalData?.workspaceTimeout);
1478+
spec.setTimeout(timeout);
1479+
} catch (err) {}
1480+
}
1481+
if (user.additionalData?.disabledClosedTimeout === true) {
1482+
spec.setClosedTimeout("0");
1483+
}
1484+
}
14711485
}
14721486
spec.setAdmission(admissionLevel);
14731487
const sshKeys = await this.userDB.trace(traceCtx).getSSHPublicKeys(user.id);

0 commit comments

Comments
 (0)