18
18
import io .csviri .operator .resourceglue .dependent .GenericResourceDiscriminator ;
19
19
import io .csviri .operator .resourceglue .templating .GenericTemplateHandler ;
20
20
import io .fabric8 .kubernetes .api .model .GenericKubernetesResource ;
21
+ import io .fabric8 .kubernetes .api .model .HasMetadata ;
21
22
import io .fabric8 .kubernetes .client .KubernetesClientException ;
22
23
import io .fabric8 .kubernetes .client .dsl .base .PatchContext ;
23
24
import io .fabric8 .kubernetes .client .dsl .base .PatchType ;
@@ -51,6 +52,9 @@ public UpdateControl<Glue> reconcile(Glue primary,
51
52
log .debug ("Reconciling glue. name: {} namespace: {}" ,
52
53
primary .getMetadata ().getName (), primary .getMetadata ().getNamespace ());
53
54
registerRelatedResourceInformers (context , primary );
55
+ if (deletedGlueIfParentMarkedForDeletion (context , primary )) {
56
+ return UpdateControl .noUpdate ();
57
+ }
54
58
addFinalizersToParentResource (primary , context );
55
59
if (ownersBeingDeleted (primary , context )) {
56
60
return UpdateControl .noUpdate ();
@@ -63,6 +67,16 @@ public UpdateControl<Glue> reconcile(Glue primary,
63
67
return UpdateControl .noUpdate ();
64
68
}
65
69
70
+ private boolean deletedGlueIfParentMarkedForDeletion (Context <Glue > context , Glue primary ) {
71
+ var parent = getParentRelatedResource (primary , context );
72
+ if (parent .map (HasMetadata ::isMarkedForDeletion ).orElse (false )) {
73
+ context .getClient ().resource (primary ).delete ();
74
+ return true ;
75
+ } else {
76
+ return false ;
77
+ }
78
+ }
79
+
66
80
67
81
/**
68
82
* If a parent gets deleted, the glue is reconciled still, but we don't want that in that case.
@@ -217,25 +231,14 @@ private Condition toCondition(ConditionSpec condition) {
217
231
218
232
// todo docs
219
233
private void addFinalizersToParentResource (Glue primary , Context <Glue > context ) {
220
- var parentRelated = primary .getSpec ().getRelatedResources ().stream ()
221
- .filter (r -> r .getName ().equals (PARENT_RELATED_RESOURCE_NAME ))
222
- .findAny ();
223
- parentRelated .ifPresent (r -> {
224
- var relatedResources = Utils .getRelatedResources (primary , r , context );
225
- if (relatedResources .size () > 1 ) {
226
- throw new IllegalStateException (
227
- "parent related resource contains more resourceNames for glue name: "
228
- + primary .getMetadata ().getName ()
229
- + " namespace: " + primary .getMetadata ().getNamespace ());
230
- }
231
- // theoretically can happen that parent was deleted meanwhile
232
- if (relatedResources .isEmpty ()) {
233
- return ;
234
- }
235
- var parent = relatedResources .entrySet ().iterator ().next ().getValue ();
234
+ var parent = getParentRelatedResource (primary , context );
235
+
236
+ parent .ifPresent (p -> {
237
+ log .warn ("Adding finalizer to parent. Glue name: {} namespace: {}" ,
238
+ primary .getMetadata ().getName (), primary .getMetadata ().getNamespace ());
236
239
String finalizer = parentFinalizer (primary .getMetadata ().getName ());
237
- if (!parent .getMetadata ().getFinalizers ().contains (finalizer )) {
238
- var res = getResourceForSSAFrom (parent );
240
+ if (!p .getMetadata ().getFinalizers ().contains (finalizer )) {
241
+ var res = getResourceForSSAFrom (p );
239
242
res .getMetadata ().getFinalizers ().add (finalizer );
240
243
context .getClient ().resource (res )
241
244
.patch (new PatchContext .Builder ()
@@ -248,33 +251,43 @@ private void addFinalizersToParentResource(Glue primary, Context<Glue> context)
248
251
}
249
252
250
253
private void removeFinalizerForParent (Glue primary , Context <Glue > context ) {
254
+ var parent = getParentRelatedResource (primary , context );
255
+ parent .ifPresentOrElse (p -> {
256
+ log .warn ("Removing finalizer from parent. Glue name: {} namespace: {}" ,
257
+ primary .getMetadata ().getName (), primary .getMetadata ().getNamespace ());
258
+ String finalizer = parentFinalizer (primary .getMetadata ().getName ());
259
+ if (p .getMetadata ().getFinalizers ().contains (finalizer )) {
260
+ var res = getResourceForSSAFrom (p );
261
+ context .getClient ().resource (res )
262
+ .patch (new PatchContext .Builder ()
263
+ .withFieldManager (context .getControllerConfiguration ().fieldManager ())
264
+ .withForce (true )
265
+ .withPatchType (PatchType .SERVER_SIDE_APPLY )
266
+ .build ());
267
+ }
268
+ }, () -> log .warn (
269
+ "Parent resource expected to be present on cleanup. Glue name: {} namespace: {}" ,
270
+ primary .getMetadata ().getName (), primary .getMetadata ().getNamespace ()));
271
+ }
272
+
273
+ private Optional <GenericKubernetesResource > getParentRelatedResource (Glue primary ,
274
+ Context <Glue > context ) {
251
275
var parentRelated = primary .getSpec ().getRelatedResources ().stream ()
252
276
.filter (r -> r .getName ().equals (PARENT_RELATED_RESOURCE_NAME ))
253
277
.findAny ();
254
- parentRelated .ifPresent (r -> {
278
+
279
+ return parentRelated .flatMap (r -> {
255
280
var relatedResources = Utils .getRelatedResources (primary , r , context );
256
281
if (relatedResources .size () > 1 ) {
257
282
throw new IllegalStateException (
258
283
"parent related resource contains more resourceNames for glue name: "
259
284
+ primary .getMetadata ().getName ()
260
285
+ " namespace: " + primary .getMetadata ().getNamespace ());
261
286
}
262
- // theoretically can happen that parent was deleted meanwhile
263
287
if (relatedResources .isEmpty ()) {
264
- log .warn ("Parent resource expected to be present on cleanup. Glue name: {} namespace: {}" ,
265
- primary .getMetadata ().getName (), primary .getMetadata ().getNamespace ());
266
- return ;
267
- }
268
- var parent = relatedResources .entrySet ().iterator ().next ().getValue ();
269
- String finalizer = parentFinalizer (primary .getMetadata ().getName ());
270
- if (parent .getMetadata ().getFinalizers ().contains (finalizer )) {
271
- var res = getResourceForSSAFrom (parent );
272
- context .getClient ().resource (res )
273
- .patch (new PatchContext .Builder ()
274
- .withFieldManager (context .getControllerConfiguration ().fieldManager ())
275
- .withForce (true )
276
- .withPatchType (PatchType .SERVER_SIDE_APPLY )
277
- .build ());
288
+ return Optional .empty ();
289
+ } else {
290
+ return Optional .of (relatedResources .entrySet ().iterator ().next ().getValue ());
278
291
}
279
292
});
280
293
}
0 commit comments