diff --git a/pom.xml b/pom.xml index f52a39d..0624fc5 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,11 @@ io.quarkus quarkus-smallrye-jwt-build + + io.fabric8 + kubernetes-httpclient-vertx + 7.3.1 + diff --git a/src/main/java/dev/dinauer/IngressResource.java b/src/main/java/dev/dinauer/IngressResource.java index 79feed8..c99dcaf 100644 --- a/src/main/java/dev/dinauer/IngressResource.java +++ b/src/main/java/dev/dinauer/IngressResource.java @@ -19,14 +19,17 @@ import java.util.List; @Authenticated public class IngressResource { + @Inject + ClientProvider clientProvider; + @GET @Produces(MediaType.APPLICATION_JSON) public List getIngresses(@QueryParam("namespace") String namespace) { if(namespace != null) { - return ClientProvider.getClient().network().v1().ingresses().inNamespace(namespace).list().getItems(); + return clientProvider.getClient().network().v1().ingresses().inNamespace(namespace).list().getItems(); } - return ClientProvider.getClient().network().v1().ingresses().list().getItems(); + return clientProvider.getClient().network().v1().ingresses().list().getItems(); } } diff --git a/src/main/java/dev/dinauer/LogResource.java b/src/main/java/dev/dinauer/LogResource.java index 2139ea6..8474cae 100644 --- a/src/main/java/dev/dinauer/LogResource.java +++ b/src/main/java/dev/dinauer/LogResource.java @@ -20,6 +20,9 @@ import java.util.Optional; @Authenticated public class LogResource { + @Inject + ClientProvider clientProvider; + @Inject PodService podService; @@ -31,7 +34,7 @@ public class LogResource if(podOptional.isPresent()) { Pod pod = podOptional.get(); - return List.of(ClientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName()).getLog().split("\\r?\\n")); + return List.of(clientProvider.getClient().pods().inNamespace(pod.getMetadata().getNamespace()).withName(pod.getMetadata().getName()).getLog().split("\\r?\\n")); } throw new NotFoundException(); } diff --git a/src/main/java/dev/dinauer/NamespaceResource.java b/src/main/java/dev/dinauer/NamespaceResource.java index 7d1c1dc..c1ef097 100644 --- a/src/main/java/dev/dinauer/NamespaceResource.java +++ b/src/main/java/dev/dinauer/NamespaceResource.java @@ -20,10 +20,13 @@ import java.util.List; @Authenticated public class NamespaceResource { + @Inject + ClientProvider clientProvider; + @GET @Produces(MediaType.APPLICATION_JSON) public List getNamespaces() { - return ClientProvider.getClient().namespaces().list().getItems(); + return clientProvider.getClient().namespaces().list().getItems(); } } diff --git a/src/main/java/dev/dinauer/NodeResource.java b/src/main/java/dev/dinauer/NodeResource.java index a9b7c96..f7726ce 100644 --- a/src/main/java/dev/dinauer/NodeResource.java +++ b/src/main/java/dev/dinauer/NodeResource.java @@ -24,12 +24,30 @@ import java.util.List; @Authenticated public class NodeResource { + @Inject + ClientProvider clientProvider; + @GET @Produces(MediaType.APPLICATION_JSON) - public List getMonitoring() + public List getMonitoring() throws IOException, InterruptedException { List result = new ArrayList<>(); + List stats = getTopNodes(); + for(String nodeName : stats) + { + String[] parts = nodeName.split("\\s+"); + if(parts.length == 5) + { + String name = parts[0]; + Node node = clientProvider.getClient().nodes().withName(name).get(); + Integer absoluteCpu = extractInteger(parts[1]); + Integer relativeCpu = extractInteger(parts[2]); + Integer absoluteMemory = extractMemory(parts[3]); + Integer relativeMemory = extractInteger(parts[4]); + result.add(new NodeStats(node, absoluteCpu, relativeCpu, Integer.parseInt(node.getStatus().getAllocatable().get("cpu").getAmount()) * 1000, absoluteMemory, relativeMemory, extractMemory(node.getStatus().getAllocatable().get("memory").getAmount()))); + } + } return result; } diff --git a/src/main/java/dev/dinauer/PodResource.java b/src/main/java/dev/dinauer/PodResource.java index 07196f1..1b23a92 100644 --- a/src/main/java/dev/dinauer/PodResource.java +++ b/src/main/java/dev/dinauer/PodResource.java @@ -24,6 +24,9 @@ import java.util.Optional; @Authenticated public class PodResource { + @Inject + ClientProvider clientProvider; + @Inject PodService podService; @@ -49,7 +52,7 @@ public class PodResource if(podOptional.isPresent()) { Pod pod = podOptional.get(); - ClientProvider.getClient() + clientProvider.getClient() .pods() .inNamespace(pod.getMetadata().getNamespace()) .withName(pod.getMetadata().getName()) diff --git a/src/main/java/dev/dinauer/ServiceResource.java b/src/main/java/dev/dinauer/ServiceResource.java index 32907d9..44b0460 100644 --- a/src/main/java/dev/dinauer/ServiceResource.java +++ b/src/main/java/dev/dinauer/ServiceResource.java @@ -25,14 +25,17 @@ import java.util.Optional; @Authenticated public class ServiceResource { + @Inject + ClientProvider clientProvider; + @GET @Produces(MediaType.APPLICATION_JSON) public List getServices(@QueryParam("namespace") Optional namespace) { if(namespace.isPresent()) { - return ClientProvider.getClient().services().inNamespace(namespace.get()).list().getItems(); + return clientProvider.getClient().services().inNamespace(namespace.get()).list().getItems(); } - return ClientProvider.getClient().services().list().getItems(); + return clientProvider.getClient().services().list().getItems(); } } diff --git a/src/main/java/dev/dinauer/service/PodService.java b/src/main/java/dev/dinauer/service/PodService.java index adc6fab..ce2cfcf 100644 --- a/src/main/java/dev/dinauer/service/PodService.java +++ b/src/main/java/dev/dinauer/service/PodService.java @@ -14,19 +14,22 @@ import java.util.Optional; @ApplicationScoped public class PodService { + @Inject + ClientProvider clientProvider; + public List findByNamespace(String namespace) { - return ClientProvider.getClient().pods().inNamespace(namespace).list().getItems(); + return clientProvider.getClient().pods().inNamespace(namespace).list().getItems(); } public List findAll() { - return ClientProvider.getClient().pods().list().getItems(); + return clientProvider.getClient().pods().list().getItems(); } public Optional findPodById(String id) { - for(Pod pod : ClientProvider.getClient().pods().list().getItems()) + for(Pod pod : clientProvider.getClient().pods().list().getItems()) { if(pod.getMetadata().getUid().equals(id)) { diff --git a/src/main/java/dev/dinauer/service/ServiceService.java b/src/main/java/dev/dinauer/service/ServiceService.java index 3bb1a60..c22158d 100644 --- a/src/main/java/dev/dinauer/service/ServiceService.java +++ b/src/main/java/dev/dinauer/service/ServiceService.java @@ -6,15 +6,19 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import java.util.Optional; @ApplicationScoped public class ServiceService { + @Inject + ClientProvider clientProvider; + public Optional findById(String id) { - for(Service service : ClientProvider.getClient().services().list().getItems()) + for(Service service : clientProvider.getClient().services().list().getItems()) { if(service.getMetadata().getUid().equals(id)) { diff --git a/src/main/java/dev/dinauer/utils/ClientProvider.java b/src/main/java/dev/dinauer/utils/ClientProvider.java index 2e954ba..87a55df 100644 --- a/src/main/java/dev/dinauer/utils/ClientProvider.java +++ b/src/main/java/dev/dinauer/utils/ClientProvider.java @@ -4,7 +4,11 @@ import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; -import io.vertx.mutiny.core.Vertx; +import io.fabric8.kubernetes.client.extension.ExtensionAdapter; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.vertx.VertxHttpClientBuilder; +import io.fabric8.kubernetes.client.vertx.VertxHttpClientFactory; +import io.vertx.core.Vertx; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -13,11 +17,15 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; import java.io.File; +@ApplicationScoped public class ClientProvider { - public static KubernetesClient getClient() + @Inject + Vertx vertx; + + public KubernetesClient getClient() { String configFilePath = ConfigProvider.getConfig().getValue("dev.dinauer.kobooboo.kubeconfigs.dir", String.class); - return new KubernetesClientBuilder().withConfig(Config.fromKubeconfig(new File(configFilePath))).build(); + return new KubernetesClientBuilder().withConfig(Config.fromKubeconfig(new File(configFilePath))).withHttpClientFactory(new VertxHttpClientFactory(vertx)).build(); } }