From 19daf7790c5de45c7070216a70f917ecc7f6454b Mon Sep 17 00:00:00 2001 From: Thuan Vo Date: Tue, 9 Apr 2024 15:49:40 -0700 Subject: [PATCH] fix(k8s): fix realm node not found and deletion constraint violation --- .../cryostat/discovery/KubeApiDiscovery.java | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/java/io/cryostat/discovery/KubeApiDiscovery.java b/src/main/java/io/cryostat/discovery/KubeApiDiscovery.java index 92e6695c3..e0827ab58 100644 --- a/src/main/java/io/cryostat/discovery/KubeApiDiscovery.java +++ b/src/main/java/io/cryostat/discovery/KubeApiDiscovery.java @@ -51,6 +51,7 @@ import io.fabric8.kubernetes.client.informers.SharedIndexInformer; import io.quarkus.runtime.ShutdownEvent; import io.quarkus.runtime.StartupEvent; +import jakarta.annotation.Priority; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; @@ -113,7 +114,7 @@ protected HashMap> initialize() }; @Transactional - void onStart(@Observes StartupEvent evt) { + void onStart(@Observes @Priority(1) StartupEvent evt) { if (!(enabled())) { return; } @@ -135,8 +136,14 @@ void onStart(@Observes StartupEvent evt) { } logger.infov("Starting {0} client", REALM); + } - safeGetInformers(); // trigger lazy init + void initializeInformers(@Observes StartupEvent evt) { + try { + nsInformers.get(); + } catch (ConcurrentException e) { + throw new IllegalStateException(e); + } } void onStop(@Observes ShutdownEvent evt) { @@ -165,16 +172,6 @@ KubernetesClient client() { return kubeConfig.kubeClient(); } - private Map> safeGetInformers() { - Map> informers; - try { - informers = nsInformers.get(); - } catch (ConcurrentException e) { - throw new IllegalStateException(e); - } - return informers; - } - private boolean isCompatiblePort(EndpointPort port) { return JmxPortNames.orElse(List.of()).contains(port.getName()) || JmxPortNumbers.orElse(List.of()).contains(port.getPort()); @@ -236,18 +233,26 @@ private void pruneOwnerChain(DiscoveryNode nsNode, TargetTuple targetTuple) { Target target = Target.getTargetByConnectUrl(targetTuple.toTarget().connectUrl); DiscoveryNode targetNode = target.discoveryNode; - Pair node = Pair.of(null, targetNode); - while (true) { - Pair owner = getOwnerNode(node); - if (owner == null) { - break; - } - DiscoveryNode ownerNode = owner.getRight(); - if (node.getRight().children.isEmpty()) { - ownerNode.children.remove(node.getRight()); - ownerNode.persist(); + if (nsNode.children.contains(targetNode)) { + nsNode.children.remove(targetNode); + } else { + Pair node = + queryForNode( + targetRef.getNamespace(), targetRef.getName(), targetRef.getKind()); + node.getRight().children.remove(targetNode); + node.getRight().persist(); + while (true) { + Pair owner = getOwnerNode(node); + if (owner == null) { + break; + } + DiscoveryNode ownerNode = owner.getRight(); + if (node.getRight().children.isEmpty()) { + ownerNode.children.remove(node.getRight()); + ownerNode.persist(); + } + node = owner; } - node = owner; } target.delete();