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();
}
}