From 8a767489aefcb559d838e6f5a7cbb74b65f5342c Mon Sep 17 00:00:00 2001 From: lukaskratzel Date: Thu, 19 Mar 2026 12:26:24 +0100 Subject: [PATCH] add force launch option --- .../eclipse/theia/cloud/common/util/WorkspaceUtil.java | 6 ++++-- .../java/org/eclipse/theia/cloud/service/K8sUtil.java | 7 ++++--- .../org/eclipse/theia/cloud/service/LaunchRequest.java | 8 ++++++-- .../org/eclipse/theia/cloud/service/RootResource.java | 4 ++-- .../theia/cloud/service/session/SessionResource.java | 2 +- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/java/common/org.eclipse.theia.cloud.common/src/main/java/org/eclipse/theia/cloud/common/util/WorkspaceUtil.java b/java/common/org.eclipse.theia.cloud.common/src/main/java/org/eclipse/theia/cloud/common/util/WorkspaceUtil.java index 7a013630..a9a0f849 100644 --- a/java/common/org.eclipse.theia.cloud.common/src/main/java/org/eclipse/theia/cloud/common/util/WorkspaceUtil.java +++ b/java/common/org.eclipse.theia.cloud.common/src/main/java/org/eclipse/theia/cloud/common/util/WorkspaceUtil.java @@ -18,6 +18,7 @@ import static org.eclipse.theia.cloud.common.util.NamingUtil.asValidName; import java.time.Instant; +import java.util.UUID; import org.eclipse.theia.cloud.common.k8s.resource.workspace.Workspace; @@ -31,8 +32,9 @@ private WorkspaceUtil() { } public static String generateUniqueWorkspaceName(String user, String appDefinitionName) { - return asValidName((WORKSPACE_PREFIX + Instant.now().toEpochMilli() + getWorkspaceDescription(appDefinitionName) - + "-" + user).toLowerCase(), WORKSPACE_NAME_LIMIT); + String suffix = UUID.randomUUID().toString().substring(0, 8); + return asValidName((WORKSPACE_PREFIX + Instant.now().toEpochMilli() + "-" + suffix + + getWorkspaceDescription(appDefinitionName) + "-" + user).toLowerCase(), WORKSPACE_NAME_LIMIT); } public static String generateNonUniqueWorkspaceName(String user, String appDefinitionName) { diff --git a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/K8sUtil.java b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/K8sUtil.java index 36c086eb..32a3d53c 100644 --- a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/K8sUtil.java +++ b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/K8sUtil.java @@ -97,9 +97,10 @@ public Optional findSession(String sessionName) { return CLIENT.sessions().get(sessionName); } - public String launchEphemeralSession(String correlationId, String appDefinition, String user, int timeout, - EnvironmentVars env) { - SessionSpec sessionSpec = new SessionSpec(getSessionName(user, appDefinition, false), appDefinition, user); + public String launchEphemeralSession(String correlationId, String appDefinition, String user, + boolean reuseExistingSession, int timeout, EnvironmentVars env) { + SessionSpec sessionSpec = new SessionSpec(getSessionName(user, appDefinition, !reuseExistingSession), + appDefinition, user); sessionSpec = sessionSpecWithEnv(sessionSpec, env); return launchSession(correlationId, sessionSpec, timeout); diff --git a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/LaunchRequest.java b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/LaunchRequest.java index 8fbe5239..71a28c3c 100644 --- a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/LaunchRequest.java +++ b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/LaunchRequest.java @@ -33,6 +33,9 @@ public class LaunchRequest extends UserScopedServiceRequest { @Schema(description = "If true no workspace will be created for the session.", required = false) public boolean ephemeral; + @Schema(description = "If false, ephemeral launches will always create a fresh session instead of reusing an existing one for the same user and app definition.", required = false) + public boolean reuseExistingSession = true; + @Schema(description = "Number of minutes to wait for session launch. Default is 3 Minutes.", required = false) public int timeout = 3; @@ -61,8 +64,9 @@ public boolean isCreateWorkspace() { @Override public String toString() { return "LaunchRequest [user=" + user + ", appDefinition=" + appDefinition + ", workspaceName=" + workspaceName - + ", label=" + label + ", ephemeral=" + ephemeral + ", appId=" + appId + ", kind=" + kind + ", timeout=" - + timeout + ", " + env + "]"; + + ", label=" + label + ", ephemeral=" + ephemeral + ", reuseExistingSession=" + + reuseExistingSession + ", appId=" + appId + ", kind=" + kind + ", timeout=" + timeout + ", " + env + + "]"; } } diff --git a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/RootResource.java b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/RootResource.java index 15fda84a..c85e00c6 100644 --- a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/RootResource.java +++ b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/RootResource.java @@ -97,8 +97,8 @@ public String launch(LaunchRequest request) { if (request.isEphemeral()) { info(correlationId, "Launching ephemeral session " + request); - return k8sUtil.launchEphemeralSession(correlationId, request.appDefinition, user, request.timeout, - request.env); + return k8sUtil.launchEphemeralSession(correlationId, request.appDefinition, user, + request.reuseExistingSession, request.timeout, request.env); } if (request.isExistingWorkspace()) { diff --git a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/session/SessionResource.java b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/session/SessionResource.java index f42b1817..1931dca0 100644 --- a/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/session/SessionResource.java +++ b/java/service/org.eclipse.theia.cloud.service/src/main/java/org/eclipse/theia/cloud/service/session/SessionResource.java @@ -94,7 +94,7 @@ public String start(SessionStartRequest request) { info(correlationId, "Launching session " + request); if (request.isEphemeral()) { - return k8sUtil.launchEphemeralSession(correlationId, request.appDefinition, user, request.timeout, + return k8sUtil.launchEphemeralSession(correlationId, request.appDefinition, user, true, request.timeout, request.env); }