|
10 | 10 | import java.time.Duration; |
11 | 11 | import java.util.ArrayList; |
12 | 12 | import java.util.HashMap; |
| 13 | +import java.util.LinkedList; |
13 | 14 | import java.util.List; |
14 | 15 | import java.util.Map; |
15 | 16 | import java.util.function.Consumer; |
16 | 17 | import java.util.function.Function; |
17 | 18 | import java.util.stream.Stream; |
18 | 19 |
|
| 20 | +import io.fabric8.kubernetes.client.dsl.NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable; |
19 | 21 | import org.junit.jupiter.api.extension.ExtensionContext; |
20 | 22 | import org.slf4j.Logger; |
21 | 23 | import org.slf4j.LoggerFactory; |
@@ -48,6 +50,7 @@ public class LocallyRunOperatorExtension extends AbstractOperatorExtension { |
48 | 50 | private final List<Class<? extends CustomResource>> additionalCustomResourceDefinitions; |
49 | 51 | private final Map<Reconciler, RegisteredController> registeredControllers; |
50 | 52 | private final Map<String, String> crdMappings; |
| 53 | + private static final LinkedList<AppliedCRD> appliedCRDs = new LinkedList<>(); |
51 | 54 |
|
52 | 55 | private LocallyRunOperatorExtension( |
53 | 56 | List<ReconcilerSpec> reconcilers, |
@@ -144,6 +147,7 @@ private static void applyCrd(String crdString, String path, KubernetesClient cli |
144 | 147 | LOGGER.debug("Applying CRD: {}", crdString); |
145 | 148 | final var crd = client.load(new ByteArrayInputStream(crdString.getBytes())); |
146 | 149 | crd.serverSideApply(); |
| 150 | + appliedCRDs.add(new AppliedCRD(crdString, path)); |
147 | 151 | Thread.sleep(CRD_READY_WAIT); // readiness is not applicable for CRD, just wait a little |
148 | 152 | LOGGER.debug("Applied CRD with path: {}", path); |
149 | 153 | } catch (InterruptedException ex) { |
@@ -304,8 +308,29 @@ protected void after(ExtensionContext context) { |
304 | 308 | } |
305 | 309 | } |
306 | 310 | localPortForwards.clear(); |
| 311 | + |
| 312 | + var kubernetesClient = getKubernetesClient(); |
| 313 | + |
| 314 | + while (!appliedCRDs.isEmpty()) { |
| 315 | + deleteCrd(appliedCRDs.poll(), kubernetesClient); |
| 316 | + } |
| 317 | + |
| 318 | + kubernetesClient.close(); |
| 319 | + } |
| 320 | + |
| 321 | + private void deleteCrd(AppliedCRD appliedCRD, KubernetesClient client) { |
| 322 | + try { |
| 323 | + LOGGER.debug("Deleting CRD: {}", appliedCRD.crdString); |
| 324 | + final var crd = client.load(new ByteArrayInputStream(appliedCRD.crdString.getBytes())); |
| 325 | + crd.withTimeoutInMillis(10000).delete(); |
| 326 | + LOGGER.debug("Deleted CRD with path: {}", appliedCRD.path); |
| 327 | + } catch (Exception ex) { |
| 328 | + throw new IllegalStateException("Cannot delete CRD yaml: " + appliedCRD.path, ex); |
| 329 | + } |
307 | 330 | } |
308 | 331 |
|
| 332 | + private record AppliedCRD(String crdString, String path) {} |
| 333 | + |
309 | 334 | @SuppressWarnings("rawtypes") |
310 | 335 | public static class Builder extends AbstractBuilder<Builder> { |
311 | 336 | private final List<ReconcilerSpec> reconcilers; |
|
0 commit comments