1010import java .time .Duration ;
1111import java .util .ArrayList ;
1212import java .util .HashMap ;
13+ import java .util .LinkedList ;
1314import java .util .List ;
1415import java .util .Map ;
1516import java .util .function .Consumer ;
1617import java .util .function .Function ;
1718import java .util .stream .Stream ;
1819
20+ import io .fabric8 .kubernetes .client .dsl .NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable ;
1921import org .junit .jupiter .api .extension .ExtensionContext ;
2022import org .slf4j .Logger ;
2123import org .slf4j .LoggerFactory ;
@@ -48,6 +50,7 @@ public class LocallyRunOperatorExtension extends AbstractOperatorExtension {
4850 private final List <Class <? extends CustomResource >> additionalCustomResourceDefinitions ;
4951 private final Map <Reconciler , RegisteredController > registeredControllers ;
5052 private final Map <String , String > crdMappings ;
53+ private static final LinkedList <AppliedCRD > appliedCRDs = new LinkedList <>();
5154
5255 private LocallyRunOperatorExtension (
5356 List <ReconcilerSpec > reconcilers ,
@@ -144,6 +147,7 @@ private static void applyCrd(String crdString, String path, KubernetesClient cli
144147 LOGGER .debug ("Applying CRD: {}" , crdString );
145148 final var crd = client .load (new ByteArrayInputStream (crdString .getBytes ()));
146149 crd .serverSideApply ();
150+ appliedCRDs .add (new AppliedCRD (crdString , path ));
147151 Thread .sleep (CRD_READY_WAIT ); // readiness is not applicable for CRD, just wait a little
148152 LOGGER .debug ("Applied CRD with path: {}" , path );
149153 } catch (InterruptedException ex ) {
@@ -290,6 +294,14 @@ protected void before(ExtensionContext context) {
290294 protected void after (ExtensionContext context ) {
291295 super .after (context );
292296
297+ var kubernetesClient = getKubernetesClient ();
298+
299+ while (!appliedCRDs .isEmpty ()) {
300+ deleteCrd (appliedCRDs .poll (), kubernetesClient );
301+ }
302+
303+ kubernetesClient .close ();
304+
293305 try {
294306 this .operator .stop ();
295307 } catch (Exception e ) {
@@ -306,6 +318,19 @@ protected void after(ExtensionContext context) {
306318 localPortForwards .clear ();
307319 }
308320
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 (50000000 ).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+ }
330+ }
331+
332+ private record AppliedCRD (String crdString , String path ) {}
333+
309334 @ SuppressWarnings ("rawtypes" )
310335 public static class Builder extends AbstractBuilder <Builder > {
311336 private final List <ReconcilerSpec > reconcilers ;
0 commit comments