Skip to content

Commit

Permalink
[CLOUD-500] Updade kubernetes client to 6.5.1 (logicalclocks#1327)
Browse files Browse the repository at this point in the history
* Updade kubernetes client to 6.5.1

* Throw an exception for deleting secrets in any namespace
  • Loading branch information
gibchikafa authored Apr 3, 2023
1 parent 8e9fde8 commit 0237b17
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,17 @@
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import io.fabric8.kubernetes.api.model.apps.DeploymentStatus;
import io.fabric8.kubernetes.api.model.batch.Job;
import io.fabric8.kubernetes.api.model.batch.JobCondition;
import io.fabric8.kubernetes.api.model.NamespaceBuilder;
import io.fabric8.kubernetes.api.model.batch.v1.Job;
import io.fabric8.kubernetes.api.model.batch.v1.JobCondition;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.Watch;
import io.fabric8.kubernetes.client.Watcher;
import io.fabric8.kubernetes.client.dsl.AnyNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
import io.fabric8.kubernetes.client.dsl.FilterWatchListMultiDeletable;
import io.fabric8.kubernetes.client.dsl.Resource;
import io.github.resilience4j.retry.IntervalFunction;
import io.github.resilience4j.retry.Retry;
import io.github.resilience4j.retry.RetryConfig;
Expand Down Expand Up @@ -100,11 +100,11 @@ public class KubeClientService {
public void createProjectNamespace(Project project)
throws KubernetesClientException {
handleClientOp((client) ->
client.namespaces().createNew()
client.namespaces().resource(new NamespaceBuilder()
.withNewMetadata()
.withName(getKubeProjectName(project))
.endMetadata()
.done());
.build()).create());
}

public void deleteProjectNamespace(Project project)
Expand Down Expand Up @@ -295,10 +295,10 @@ public void deleteSecrets(Map<String, String> labels) throws KubernetesClientExc

public void deleteSecrets(String namespace, Map<String, String> labels, Pair<String, String[]> labelIn) {
handleClientOp((client) -> {
FilterWatchListMultiDeletable<Secret, SecretList, Boolean, Watch, Watcher<Secret>> secrets = (namespace != null)
AnyNamespaceOperation<Secret, SecretList, Resource<Secret>> secrets = (namespace != null)
? client.secrets().inNamespace(namespace)
: client.secrets().inAnyNamespace();
FilterWatchListDeletable<Secret, SecretList, Boolean, Watch, Watcher<Secret>> secretsWithLabels = null;
FilterWatchListDeletable<Secret, SecretList, Resource<Secret>> secretsWithLabels = null;
if (labels != null) {
secretsWithLabels = secrets.withLabels(labels);
if (labelIn != null)
Expand All @@ -308,7 +308,10 @@ public void deleteSecrets(String namespace, Map<String, String> labels, Pair<Str
secretsWithLabels = secrets.withLabelIn(labelIn.getL(), labelIn.getR());
}
}
return (secretsWithLabels != null) ? secretsWithLabels.delete() : secrets.delete();
if (secretsWithLabels != null) {
return secretsWithLabels.delete();
}
throw new KubernetesClientException("Secret delete operation without labels not allowed.");
});
}

Expand Down Expand Up @@ -357,10 +360,10 @@ public List<Secret> getSecrets(Map<String, String> labels, Pair<String, String[]

public List<Secret> getSecrets(String namespace, Map<String, String> labels, Pair<String, String[]> labelIn) {
return handleClientOp((client) -> {
FilterWatchListMultiDeletable<Secret, SecretList, Boolean, Watch, Watcher<Secret>> secrets = (namespace != null)
AnyNamespaceOperation<Secret, SecretList, Resource<Secret>> secrets = (namespace != null)
? client.secrets().inNamespace(namespace)
: client.secrets().inAnyNamespace();
FilterWatchListDeletable<Secret, SecretList, Boolean, Watch, Watcher<Secret>> secretsWithLabels = null;
FilterWatchListDeletable<Secret, SecretList, Resource<Secret>> secretsWithLabels = null;
if (labels != null) {
secretsWithLabels = secrets.withLabels(labels);
if (labelIn != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@

package io.hops.hopsworks.kube.common;

import com.fasterxml.jackson.core.JsonProcessingException;
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
import io.fabric8.kubernetes.api.model.GenericKubernetesResourceList;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
import io.fabric8.kubernetes.client.utils.Serialization;
import io.hops.hopsworks.kube.serving.utils.KubeServingUtils;
import io.hops.hopsworks.persistence.entity.project.Project;
import io.hops.hopsworks.persistence.entity.serving.Serving;
Expand All @@ -19,9 +23,9 @@
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

@Stateless
Expand All @@ -41,12 +45,18 @@ public class KubeKServeClientService {

@Asynchronous
public void createOrReplaceInferenceService(Project project, JSONObject inferenceService)
throws KubernetesClientException {
throws KubernetesClientException {
String kubeProjectNs = kubeClientService.getKubeProjectName(project);
CustomResourceDefinitionContext context = getCustomResourceDefinitionContext();

handleClientOp((client) -> client.customResource(context).createOrReplace(kubeProjectNs,
inferenceService.toString()));
try {
GenericKubernetesResource customResource = Serialization.jsonMapper()
.readValue(inferenceService.toString(), GenericKubernetesResource.class);
CustomResourceDefinitionContext context = getCustomResourceDefinitionContext();
handleClientOp((client) -> client.genericKubernetesResources(context)
.inNamespace(kubeProjectNs).resource(customResource).create());
} catch (JsonProcessingException e) {
LOGGER.log(Level.FINE,"Inference service json serialization error", e);
throw new KubernetesClientException(e.getMessage());
}
}

@Asynchronous
Expand All @@ -55,8 +65,8 @@ public void deleteInferenceService(Project project, ObjectMeta inferenceServiceM
String kubeProjectNs = kubeClientService.getKubeProjectName(project);
CustomResourceDefinitionContext context = getCustomResourceDefinitionContext();

handleClientOp((client) -> client.customResource(context).delete(kubeProjectNs,
inferenceServiceMetadata.getName()));
handleClientOp((client) -> client.genericKubernetesResources(context)
.inNamespace(kubeProjectNs).withName(inferenceServiceMetadata.getName()).delete());
}

public JSONObject getInferenceServiceStatus(Project project, Serving serving)
Expand All @@ -81,16 +91,13 @@ public JSONObject getInferenceService(Project project, Serving serving)
String kubeProjectNs = kubeClientService.getKubeProjectName(project);
Map<String, String> labels = new HashMap<>();
labels.put(KubeServingUtils.SERVING_ID_LABEL_NAME, String.valueOf(serving.getId()));
Map<String, Object> response = handleClientOp((client) -> client.customResource(context).list(kubeProjectNs,
labels));

GenericKubernetesResourceList response = handleClientOp((client) -> client.genericKubernetesResources(context)
.inNamespace(kubeProjectNs).withLabels(labels).list());

JSONObject inferenceService = null;
if (response != null) {
ArrayList<Map<String, Object>> inferenceServices = (ArrayList<Map<String, Object>>) response.get("items");
if (inferenceServices.size() > 0) {
inferenceService = new JSONObject(inferenceServices.get(0));
}
if (response != null && response.getItems().size() > 0) {
inferenceService = new JSONObject(Serialization.asJson(response.getItems().get(0)));
}
return inferenceService;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
import io.fabric8.kubernetes.api.model.VolumeBuilder;
import io.fabric8.kubernetes.api.model.VolumeMount;
import io.fabric8.kubernetes.api.model.VolumeMountBuilder;
import io.fabric8.kubernetes.api.model.batch.Job;
import io.fabric8.kubernetes.api.model.batch.JobBuilder;
import io.fabric8.kubernetes.api.model.batch.JobSpec;
import io.fabric8.kubernetes.api.model.batch.v1.Job;
import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;
import io.fabric8.kubernetes.api.model.batch.v1.JobSpec;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.hops.hopsworks.common.dao.jobhistory.ExecutionFacade;
import io.hops.hopsworks.common.dao.jobs.description.YarnAppUrlsDTO;
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
<junit.version>4.13.2</junit.version>
<kafka-clients.version>2.3.0</kafka-clients.version>
<kafka_2.11.version>2.3.0</kafka_2.11.version>
<kubernetes-client.version>4.10.3</kubernetes-client.version>
<kubernetes-client.version>6.5.1</kubernetes-client.version>
<lambdista-try.version>0.3.1</lambdista-try.version>
<libthrift.version>0.15.0</libthrift.version>
<mockito.version>4.3.1</mockito.version>
Expand Down

0 comments on commit 0237b17

Please sign in to comment.