From 6ffbb7fd6a5c63ce89dd2443a9b590ac7af95c7f Mon Sep 17 00:00:00 2001 From: Andreas Dinauer Date: Sat, 7 Jun 2025 13:03:27 +0200 Subject: [PATCH] :sparkles: Deployments + rescale introduced --- .../java/dev/dinauer/DeploymentResource.java | 51 +++++++++++++++++++ .../java/dev/dinauer/IngressResource.java | 2 + src/main/java/dev/dinauer/LogResource.java | 2 + .../java/dev/dinauer/NamespaceResource.java | 2 + src/main/java/dev/dinauer/NodeResource.java | 2 + src/main/java/dev/dinauer/PodResource.java | 2 +- .../java/dev/dinauer/ServiceResource.java | 2 + .../dinauer/service/DeploymentService.java | 42 +++++++++++++++ 8 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/dinauer/DeploymentResource.java create mode 100644 src/main/java/dev/dinauer/service/DeploymentService.java diff --git a/src/main/java/dev/dinauer/DeploymentResource.java b/src/main/java/dev/dinauer/DeploymentResource.java new file mode 100644 index 0000000..c32d27c --- /dev/null +++ b/src/main/java/dev/dinauer/DeploymentResource.java @@ -0,0 +1,51 @@ +package dev.dinauer; + +import dev.dinauer.service.DeploymentService; +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; +import jakarta.annotation.security.RolesAllowed; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; + +import java.util.List; + +@Path("/deployments") +@Blocking +@Authenticated +@ApplicationScoped +public class DeploymentResource +{ + @Inject + DeploymentService deploymentService; + + @GET + @Produces(MediaType.APPLICATION_JSON) + public List getDeployments(@QueryParam("namespace") String namespace) + { + if(namespace != null && !namespace.isBlank()) + { + return deploymentService.findByNamespace(namespace); + } + return deploymentService.findAll(); + } + + @PATCH + @Path("/{namespace}/{name}") + @Consumes(MediaType.TEXT_PLAIN) + @Produces + @RolesAllowed("admin") + public void rescaleDeployment(@PathParam("namespace") String namespace, @PathParam("name") String name, Integer replicaCount) + { + if(namespace != null && !namespace.isBlank() && name != null && !name.isBlank() && replicaCount != null && replicaCount > 0) + { + deploymentService.rescale(namespace, name, replicaCount); + } + else + { + throw new RuntimeException("Namespace, name cannot be null or empty. Replica count cannot be null and must be greater than 0."); + } + } +} diff --git a/src/main/java/dev/dinauer/IngressResource.java b/src/main/java/dev/dinauer/IngressResource.java index 07c1b4d..18c017c 100644 --- a/src/main/java/dev/dinauer/IngressResource.java +++ b/src/main/java/dev/dinauer/IngressResource.java @@ -6,6 +6,7 @@ import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; import jakarta.annotation.PostConstruct; import jakarta.inject.Inject; import jakarta.ws.rs.GET; @@ -17,6 +18,7 @@ import jakarta.ws.rs.core.MediaType; import java.util.List; @Path("/ingresses") +@Blocking @Authenticated public class IngressResource { diff --git a/src/main/java/dev/dinauer/LogResource.java b/src/main/java/dev/dinauer/LogResource.java index 8474cae..49267de 100644 --- a/src/main/java/dev/dinauer/LogResource.java +++ b/src/main/java/dev/dinauer/LogResource.java @@ -6,6 +6,7 @@ import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -17,6 +18,7 @@ import java.util.Optional; @Path("/pods/{pod-id}/logs") @ApplicationScoped +@Blocking @Authenticated public class LogResource { diff --git a/src/main/java/dev/dinauer/NamespaceResource.java b/src/main/java/dev/dinauer/NamespaceResource.java index c1ef097..a700f80 100644 --- a/src/main/java/dev/dinauer/NamespaceResource.java +++ b/src/main/java/dev/dinauer/NamespaceResource.java @@ -5,6 +5,7 @@ import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -17,6 +18,7 @@ import java.util.List; @Path("/namespaces") @ApplicationScoped +@Blocking @Authenticated public class NamespaceResource { diff --git a/src/main/java/dev/dinauer/NodeResource.java b/src/main/java/dev/dinauer/NodeResource.java index 334c61c..d711722 100644 --- a/src/main/java/dev/dinauer/NodeResource.java +++ b/src/main/java/dev/dinauer/NodeResource.java @@ -5,6 +5,7 @@ import io.fabric8.kubernetes.api.model.Node; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -23,6 +24,7 @@ import java.util.List; @Path("/nodes") @ApplicationScoped +@Blocking @Authenticated public class NodeResource { diff --git a/src/main/java/dev/dinauer/PodResource.java b/src/main/java/dev/dinauer/PodResource.java index 021601b..dea3ce0 100644 --- a/src/main/java/dev/dinauer/PodResource.java +++ b/src/main/java/dev/dinauer/PodResource.java @@ -24,6 +24,7 @@ import java.util.Optional; @Path("/pods") @Startup @ApplicationScoped +@Blocking @Authenticated public class PodResource { @@ -36,7 +37,6 @@ public class PodResource PodService podService; @GET - @Blocking @Produces(MediaType.APPLICATION_JSON) public List getPods(@QueryParam("namespace") String namespace) { diff --git a/src/main/java/dev/dinauer/ServiceResource.java b/src/main/java/dev/dinauer/ServiceResource.java index 48b5b3d..2e322c3 100644 --- a/src/main/java/dev/dinauer/ServiceResource.java +++ b/src/main/java/dev/dinauer/ServiceResource.java @@ -8,6 +8,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.quarkus.runtime.Startup; import io.quarkus.security.Authenticated; +import io.smallrye.common.annotation.Blocking; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -23,6 +24,7 @@ import java.util.Optional; @Path("/services") @Startup @ApplicationScoped +@Blocking @Authenticated public class ServiceResource { diff --git a/src/main/java/dev/dinauer/service/DeploymentService.java b/src/main/java/dev/dinauer/service/DeploymentService.java new file mode 100644 index 0000000..04b6080 --- /dev/null +++ b/src/main/java/dev/dinauer/service/DeploymentService.java @@ -0,0 +1,42 @@ +package dev.dinauer.service; + +import dev.dinauer.utils.ClientProvider; +import io.fabric8.kubernetes.api.model.Pod; +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.fabric8.kubernetes.client.dsl.AppsAPIGroupDSL; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class DeploymentService +{ + @Inject + ClientProvider clientProvider; + + public List findByNamespace(String namespace) + { + try(AppsAPIGroupDSL dsl = clientProvider.getClient().apps()) + { + return dsl.deployments().inNamespace(namespace).list().getItems(); + } + } + + public List findAll() + { + try(AppsAPIGroupDSL dsl = clientProvider.getClient().apps()) + { + return dsl.deployments().inAnyNamespace().list().getItems(); + } + } + + public void rescale(String namespace, String name, int replicaCount) + { + try(AppsAPIGroupDSL dsl = clientProvider.getClient().apps()) + { + dsl.deployments().inNamespace(namespace).withName(name).scale(replicaCount); + } + } +}