Deployments + rescale introduced

This commit is contained in:
Andreas Dinauer 2025-06-07 13:03:27 +02:00
parent 4171cc86a3
commit 6ffbb7fd6a
8 changed files with 104 additions and 1 deletions

View File

@ -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<Deployment> 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.");
}
}
}

View File

@ -6,6 +6,7 @@ import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
@ -17,6 +18,7 @@ import jakarta.ws.rs.core.MediaType;
import java.util.List; import java.util.List;
@Path("/ingresses") @Path("/ingresses")
@Blocking
@Authenticated @Authenticated
public class IngressResource public class IngressResource
{ {

View File

@ -6,6 +6,7 @@ import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -17,6 +18,7 @@ import java.util.Optional;
@Path("/pods/{pod-id}/logs") @Path("/pods/{pod-id}/logs")
@ApplicationScoped @ApplicationScoped
@Blocking
@Authenticated @Authenticated
public class LogResource public class LogResource
{ {

View File

@ -5,6 +5,7 @@ import io.fabric8.kubernetes.api.model.Namespace;
import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -17,6 +18,7 @@ import java.util.List;
@Path("/namespaces") @Path("/namespaces")
@ApplicationScoped @ApplicationScoped
@Blocking
@Authenticated @Authenticated
public class NamespaceResource public class NamespaceResource
{ {

View File

@ -5,6 +5,7 @@ import io.fabric8.kubernetes.api.model.Node;
import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -23,6 +24,7 @@ import java.util.List;
@Path("/nodes") @Path("/nodes")
@ApplicationScoped @ApplicationScoped
@Blocking
@Authenticated @Authenticated
public class NodeResource public class NodeResource
{ {

View File

@ -24,6 +24,7 @@ import java.util.Optional;
@Path("/pods") @Path("/pods")
@Startup @Startup
@ApplicationScoped @ApplicationScoped
@Blocking
@Authenticated @Authenticated
public class PodResource public class PodResource
{ {
@ -36,7 +37,6 @@ public class PodResource
PodService podService; PodService podService;
@GET @GET
@Blocking
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public List<Pod> getPods(@QueryParam("namespace") String namespace) public List<Pod> getPods(@QueryParam("namespace") String namespace)
{ {

View File

@ -8,6 +8,7 @@ import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.quarkus.runtime.Startup; import io.quarkus.runtime.Startup;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.smallrye.common.annotation.Blocking;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -23,6 +24,7 @@ import java.util.Optional;
@Path("/services") @Path("/services")
@Startup @Startup
@ApplicationScoped @ApplicationScoped
@Blocking
@Authenticated @Authenticated
public class ServiceResource public class ServiceResource
{ {

View File

@ -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<Deployment> findByNamespace(String namespace)
{
try(AppsAPIGroupDSL dsl = clientProvider.getClient().apps())
{
return dsl.deployments().inNamespace(namespace).list().getItems();
}
}
public List<Deployment> 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);
}
}
}