Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update kubernetes-client and quarkus #287

Merged
merged 7 commits into from
Mar 22, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- `Workspace.v1beta4`: Move the `error` field from the spec to the status. Also add the `error` field to `Workspace.v1beta3` as it was missing
- Remove `timeout.strategy` from AppDefinition
- `AppDefinition.v1beta9`: Removed `timeout.strategy` and `timeout.limit` is now just `timeout`. This was done, as there is only one Strategy left.
- [java] Update io.fabric8.kubernetes-client to version 6.10.0. Also update Quarkus platform to 3.8.1. This provides kubernetes 1.29 support [#287](https://github.com/eclipsesource/theia-cloud/pull/287)

## [0.9.0] - 2024-01-23

Expand Down
4 changes: 2 additions & 2 deletions java/common/maven-conf/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<properties>
<failsafe.useModulePath>false</failsafe.useModulePath>
<guice.version>5.0.1</guice.version>
<kubernetes-client.version>6.7.2</kubernetes-client.version>
<kubernetes-client.version>6.10.0</kubernetes-client.version>
<log4j.version>2.17.1</log4j.version>
<slf4j.version>1.7.32</slf4j.version>
<maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
Expand All @@ -22,7 +22,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>3.3.1</quarkus.platform.version>
<quarkus.platform.version>3.8.1</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M7</surefire-plugin.version>
<webhooks.framework.core.version>1.1.2</webhooks.framework.core.version>
</properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.client.NamespacedKubernetesClient;

public class DefaultAppDefinitionResourceClient
extends BaseResourceClient<AppDefinition, AppDefinitionSpecResourceList>
public class DefaultAppDefinitionResourceClient extends BaseResourceClient<AppDefinition, AppDefinitionSpecResourceList>
implements AppDefinitionResourceClient {

public DefaultAppDefinitionResourceClient(NamespacedKubernetesClient client) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,15 @@ public DefaultSessionResourceClient(NamespacedKubernetesClient client) {
public Session create(String correlationId, SessionSpec spec) {
Session session = new Session();
session.setSpec(spec);
session.getStatus().setLastActivity(Instant.now().toEpochMilli());

spec.setSessionSecret(UUID.randomUUID().toString());

ObjectMeta metadata = new ObjectMeta();
metadata.setName(spec.getName());
session.setMetadata(metadata);

updateStatus(correlationId, session, status -> status.setLastActivity(Instant.now().toEpochMilli()));

info(correlationId, "Create Session " + session.getSpec());
return operation().resource(session).create();
}
Expand All @@ -56,39 +58,38 @@ public Session create(String correlationId, SessionSpec spec) {
public Session launch(String correlationId, SessionSpec spec, long timeout, TimeUnit unit) {
// get or create session
Session session = get(spec.getName()).orElseGet(() -> create(correlationId, spec));
SessionStatus sessionStatus = session.getStatus();
SessionStatus sessionStatus = session.getNonNullStatus();

// if session is available and has already an url or error, return that session
if (sessionStatus.hasUrl()) {
return session;
}
if (sessionStatus.hasError()) {
delete(correlationId, spec.getName());
delete(correlationId, session.getSpec().getName());
return session;
}

// wait for session url or error to be available
try {
watchUntil((action, changedSession) -> isSessionComplete(correlationId, session, changedSession), timeout,
unit);
watchUntil((action, changedSession) -> isSessionComplete(correlationId, session.getSpec().getName(),
changedSession), timeout, unit);
} catch (InterruptedException exception) {
error(correlationId, "Timeout while waiting for URL for " + spec.getName(), exception);
sessionStatus.setError(TheiaCloudError.SESSION_LAUNCH_TIMEOUT);
error(correlationId, "Timeout while waiting for URL for " + session.getSpec().getName(), exception);
updateStatus(correlationId, session, status -> status.setError(TheiaCloudError.SESSION_LAUNCH_TIMEOUT));
return session;
}
return session;
// Get updated session that we received as changedSession during watching
return get(spec.getName()).orElseGet(() -> create(correlationId, spec));
}

protected boolean isSessionComplete(String correlationId, Session session, Session changedSession) {
if (session.getSpec().getName().equals(changedSession.getSpec().getName())) {
if (changedSession.getStatus().hasUrl()) {
protected boolean isSessionComplete(String correlationId, String sessionName, Session changedSession) {
if (sessionName.equals(changedSession.getSpec().getName())) {
if (changedSession.getNonNullStatus().hasUrl()) {
info(correlationId, "Received URL for " + changedSession);
session.getStatus().setUrl(changedSession.getStatus().getUrl());
return true;
}
if (changedSession.getStatus().hasError()) {
if (changedSession.getNonNullStatus().hasError()) {
info(correlationId, "Received Error for " + changedSession + ". Deleting session again.");
delete(correlationId, session.getSpec().getName());
session.getStatus().setError(changedSession.getStatus().getError());
delete(correlationId, sessionName);
return true;
}
}
Expand All @@ -99,7 +100,7 @@ protected boolean isSessionComplete(String correlationId, Session session, Sessi
public boolean reportActivity(String correlationId, String name) {
return edit(correlationId, name, session -> {
trace(correlationId, "Updating activity for session {" + name + "}");
session.getStatus().setLastActivity(Instant.now().toEpochMilli());
updateStatus(correlationId, session, status -> status.setLastActivity(Instant.now().toEpochMilli()));
}) != null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public Workspace create(String correlationId, WorkspaceSpec spec) {
public Workspace launch(String correlationId, WorkspaceSpec spec, long timeout, TimeUnit unit) {
Workspace workspace = get(spec.getName()).orElseGet(() -> create(correlationId, spec));
WorkspaceSpec workspaceSpec = workspace.getSpec();
WorkspaceStatus workspaceStatus = workspace.getStatus();
WorkspaceStatus workspaceStatus = workspace.getNonNullStatus();

if (workspaceSpec.hasStorage()) {
return workspace;
Expand All @@ -67,7 +67,7 @@ public Workspace launch(String correlationId, WorkspaceSpec spec, long timeout,
} catch (InterruptedException exception) {
error(correlationId, "Timeout while waiting for workspace storage " + workspaceSpec.getName()
+ ". Deleting workspace again.", exception);
workspaceStatus.setError(TheiaCloudError.WORKSPACE_LAUNCH_TIMEOUT);
updateStatus(correlationId, workspace, status -> status.setError(TheiaCloudError.WORKSPACE_LAUNCH_TIMEOUT));
}
return workspace;
}
Expand All @@ -80,10 +80,12 @@ protected boolean isWorkspaceComplete(String correlationId, Workspace createdWor
createdWorkspace.getSpec().setStorage(changedWorkspace.getSpec().getStorage());
return true;
}
if (changedWorkspace.getStatus().hasError()) {
if (changedWorkspace.getNonNullStatus().hasError()) {
info(correlationId, "Received Error for " + changedWorkspace + ". Deleting workspace again.");
delete(correlationId, createdWorkspace.getSpec().getName());
createdWorkspace.getStatus().setError(changedWorkspace.getStatus().getError());
updateStatus(correlationId, createdWorkspace,
status -> status.setError(changedWorkspace.getNonNullStatus().getError()));

return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import org.eclipse.theia.cloud.common.k8s.resource.appdefinition.hub.AppDefinitionHub;
import org.eclipse.theia.cloud.common.util.CustomResourceUtil;

import com.fasterxml.jackson.annotation.JsonIgnore;

import io.fabric8.kubernetes.api.model.Namespaced;
import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.model.annotation.Group;
Expand All @@ -45,7 +47,6 @@ public String toString() {
}

public AppDefinition() {

}

public AppDefinition(AppDefinitionHub fromHub) {
Expand All @@ -56,4 +57,9 @@ public AppDefinition(AppDefinitionHub fromHub) {
this.status = new AppDefinitionStatus(fromHub);
}

@JsonIgnore
public AppDefinitionStatus getNonNullStatus() {
return super.getStatus() != null ? super.getStatus() : new AppDefinitionStatus();
}

}
Loading
Loading