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 ) {
@@ -290,6 +294,14 @@ protected void before(ExtensionContext context) {
290
294
protected void after (ExtensionContext context ) {
291
295
super .after (context );
292
296
297
+ var kubernetesClient = getKubernetesClient ();
298
+
299
+ while (!appliedCRDs .isEmpty ()) {
300
+ deleteCrd (appliedCRDs .poll (), kubernetesClient );
301
+ }
302
+
303
+ kubernetesClient .close ();
304
+
293
305
try {
294
306
this .operator .stop ();
295
307
} catch (Exception e ) {
@@ -306,6 +318,19 @@ protected void after(ExtensionContext context) {
306
318
localPortForwards .clear ();
307
319
}
308
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 (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
+
309
334
@ SuppressWarnings ("rawtypes" )
310
335
public static class Builder extends AbstractBuilder <Builder > {
311
336
private final List <ReconcilerSpec > reconcilers ;
0 commit comments