@@ -171,7 +171,7 @@ func (r *Reconciler) syncRemoteObjects(
171171 remoteDatabaseNodeSet .SetPrimaryResourceAnnotations (updatedObj )
172172 // Remote object existing in local cluster, сheck the need for an update
173173 // Get diff resources and compare bytes by k8s-objectmatcher PatchMaker
174- patched , err := r .patchObject (ctx , localObj , updatedObj )
174+ patched , err := r .patchRemoteObject (ctx , localObj , updatedObj )
175175 if err != nil {
176176 r .Recorder .Event (
177177 remoteDatabaseNodeSet ,
@@ -215,120 +215,6 @@ func (r *Reconciler) syncRemoteObjects(
215215 return r .updateRemoteResourcesStatus (ctx , remoteDatabaseNodeSet )
216216}
217217
218- func (r * Reconciler ) removeUnusedRemoteObjects (
219- ctx context.Context ,
220- remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
221- remoteObjects []client.Object ,
222- ) (bool , ctrl.Result , error ) {
223- r .Log .Info ("running step removeUnusedRemoteObjects" )
224- // We should check every remote resource to need existence in cluster
225- // Get processed remote resources from object Status
226- candidatesToDelete := []v1alpha1.RemoteResource {}
227-
228- // Check RemoteResource usage in local DatabaseNodeSet object
229- for _ , remoteResource := range remoteDatabaseNodeSet .Status .RemoteResources {
230- exist , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , remoteResource , remoteObjects )
231- if err != nil {
232- r .Recorder .Event (
233- remoteDatabaseNodeSet ,
234- corev1 .EventTypeWarning ,
235- "ControllerError" ,
236- fmt .Sprintf ("Failed to check usage in current DatabaseNodeSet: %v" , err ),
237- )
238- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
239- }
240- if ! exist {
241- candidatesToDelete = append (candidatesToDelete , remoteResource )
242- }
243- }
244-
245- // Сhecking to avoid unnecessary List request
246- //nolint:nestif
247- if len (candidatesToDelete ) > 0 {
248- // Get remote objects from another DatabaseNodeSet spec
249- remoteObjectsFromAnother , err := r .getRemoteObjectsFromAnother (ctx , remoteDatabaseNodeSet )
250- if err != nil {
251- r .Recorder .Event (
252- remoteDatabaseNodeSet ,
253- corev1 .EventTypeWarning ,
254- "ControllerError" ,
255- fmt .Sprintf ("Failed to get remote objects from another DatabaseNodeSets: %v" , err ),
256- )
257- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
258- }
259- // Check RemoteResource usage in another objects
260- for _ , remoteResource := range candidatesToDelete {
261- remoteObj , err := resources .ConvertRemoteResourceToObject (remoteResource , remoteDatabaseNodeSet .Namespace )
262- if err != nil {
263- r .Recorder .Event (
264- remoteDatabaseNodeSet ,
265- corev1 .EventTypeWarning ,
266- "ControllerError" ,
267- fmt .Sprintf ("Failed to convert RemoteResource %s with name %s to object: %v" , remoteResource .Kind , remoteResource .Name , err ),
268- )
269- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
270- }
271-
272- if err := r .Client .Get (ctx , types.NamespacedName {
273- Name : remoteObj .GetName (),
274- Namespace : remoteObj .GetNamespace (),
275- }, remoteObj ); err != nil {
276- if apierrors .IsNotFound (err ) {
277- continue
278- }
279- r .Recorder .Event (
280- remoteDatabaseNodeSet ,
281- corev1 .EventTypeWarning ,
282- "ControllerError" ,
283- fmt .Sprintf ("Failed to get RemoteResource %s with name %s as object: %v" , remoteResource .Kind , remoteResource .Name , err ),
284- )
285- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
286- }
287-
288- existInDatabase , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , remoteResource , remoteObjectsFromAnother )
289- if err != nil {
290- r .Recorder .Event (
291- remoteDatabaseNodeSet ,
292- corev1 .EventTypeWarning ,
293- "ControllerError" ,
294- fmt .Sprintf ("Failed to check RemoteResource usage in another DatabaseNodeSets: %v" , err ),
295- )
296- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
297- }
298-
299- // Skip resource deletion because it using in some Storage
300- // check by existence of annotation `ydb.tech/primary-resource-storage`
301- _ , existInStorage := remoteObj .GetAnnotations ()[ydbannotations .PrimaryResourceStorageAnnotation ]
302-
303- if existInDatabase || existInStorage {
304- // Only remove annotation to unbind remote objects from Database
305- // Another DatabaseNodeSet receive an event and reattach it
306- if err := r .unbindRemoteObject (ctx , remoteDatabaseNodeSet , remoteObj ); err != nil {
307- r .Recorder .Event (
308- remoteDatabaseNodeSet ,
309- corev1 .EventTypeWarning ,
310- "ControllerError" ,
311- fmt .Sprintf ("Failed to unbind remote object from DatabaseNodeSet: %v" , err ),
312- )
313- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
314- }
315- } else {
316- // Delete unused remote object from namespace
317- if err := r .deleteRemoteObject (ctx , remoteDatabaseNodeSet , remoteObj ); err != nil {
318- r .Recorder .Event (
319- remoteDatabaseNodeSet ,
320- corev1 .EventTypeWarning ,
321- "ControllerError" ,
322- fmt .Sprintf ("Failed to delete remote object from namespace: %v" , err ),
323- )
324- }
325- }
326- }
327- }
328-
329- return r .updateRemoteResourcesStatus (ctx , remoteDatabaseNodeSet )
330- }
331-
332218func (r * Reconciler ) updateRemoteResourcesStatus (
333219 ctx context.Context ,
334220 remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
@@ -391,28 +277,6 @@ func (r *Reconciler) updateRemoteResourcesStatus(
391277 return Continue , ctrl.Result {Requeue : false }, nil
392278}
393279
394- func (r * Reconciler ) checkRemoteResourceUsage (
395- remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
396- remoteResource v1alpha1.RemoteResource ,
397- remoteObjects []client.Object ,
398- ) (bool , error ) {
399- for _ , remoteObj := range remoteObjects {
400- remoteObjGVK , err := apiutil .GVKForObject (remoteObj , r .Scheme )
401- if err != nil {
402- return false , err
403- }
404- if resources .EqualRemoteResourceWithObject (
405- & remoteResource ,
406- remoteDatabaseNodeSet .Namespace ,
407- remoteObj ,
408- remoteObjGVK ,
409- ) {
410- return true , nil
411- }
412- }
413- return false , nil
414- }
415-
416280func (r * Reconciler ) getRemoteObjectsFromAnother (
417281 ctx context.Context ,
418282 remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
@@ -457,7 +321,7 @@ func (r *Reconciler) getRemoteObjectsFromAnother(
457321 return remoteObjects , nil
458322}
459323
460- func (r * Reconciler ) patchObject (
324+ func (r * Reconciler ) patchRemoteObject (
461325 ctx context.Context ,
462326 localObj , remoteObj client.Object ,
463327) (bool , error ) {
@@ -550,3 +414,121 @@ func (r *Reconciler) deleteRemoteObject(
550414 )
551415 return nil
552416}
417+
418+ func (r * Reconciler ) removeUnusedRemoteObjects (
419+ ctx context.Context ,
420+ remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
421+ remoteObjects []client.Object ,
422+ ) (bool , ctrl.Result , error ) {
423+ r .Log .Info ("running step removeUnusedRemoteObjects" )
424+ // We should check every remote resource to need existence in cluster
425+ // Get processed remote resources from object Status
426+ candidatesToDelete := []v1alpha1.RemoteResource {}
427+
428+ // Check RemoteResource usage in local DatabaseNodeSet object
429+ for _ , remoteResource := range remoteDatabaseNodeSet .Status .RemoteResources {
430+ exist , err := resources .CheckRemoteResourceUsage (
431+ remoteDatabaseNodeSet .Namespace , r .Scheme , remoteResource , remoteObjects ,
432+ )
433+ if err != nil {
434+ r .Recorder .Event (
435+ remoteDatabaseNodeSet ,
436+ corev1 .EventTypeWarning ,
437+ "ControllerError" ,
438+ fmt .Sprintf ("Failed to check usage in current DatabaseNodeSet: %v" , err ),
439+ )
440+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
441+ }
442+ if ! exist {
443+ candidatesToDelete = append (candidatesToDelete , remoteResource )
444+ }
445+ }
446+
447+ // Сhecking to avoid unnecessary List request
448+ //nolint:nestif
449+ if len (candidatesToDelete ) > 0 {
450+ // Get remote objects from another DatabaseNodeSet spec
451+ remoteObjectsFromAnother , err := r .getRemoteObjectsFromAnother (ctx , remoteDatabaseNodeSet )
452+ if err != nil {
453+ r .Recorder .Event (
454+ remoteDatabaseNodeSet ,
455+ corev1 .EventTypeWarning ,
456+ "ControllerError" ,
457+ fmt .Sprintf ("Failed to get remote objects from another DatabaseNodeSets: %v" , err ),
458+ )
459+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
460+ }
461+ // Check RemoteResource usage in another objects
462+ for _ , remoteResource := range candidatesToDelete {
463+ remoteObj , err := resources .ConvertRemoteResourceToObject (remoteResource , remoteDatabaseNodeSet .Namespace )
464+ if err != nil {
465+ r .Recorder .Event (
466+ remoteDatabaseNodeSet ,
467+ corev1 .EventTypeWarning ,
468+ "ControllerError" ,
469+ fmt .Sprintf ("Failed to convert RemoteResource %s with name %s to object: %v" , remoteResource .Kind , remoteResource .Name , err ),
470+ )
471+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
472+ }
473+
474+ if err := r .Client .Get (ctx , types.NamespacedName {
475+ Name : remoteObj .GetName (),
476+ Namespace : remoteObj .GetNamespace (),
477+ }, remoteObj ); err != nil {
478+ if apierrors .IsNotFound (err ) {
479+ continue
480+ }
481+ r .Recorder .Event (
482+ remoteDatabaseNodeSet ,
483+ corev1 .EventTypeWarning ,
484+ "ControllerError" ,
485+ fmt .Sprintf ("Failed to get RemoteResource %s with name %s as object: %v" , remoteResource .Kind , remoteResource .Name , err ),
486+ )
487+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
488+ }
489+
490+ existInDatabase , err := resources .CheckRemoteResourceUsage (
491+ remoteDatabaseNodeSet .Namespace , r .Scheme , remoteResource , remoteObjectsFromAnother ,
492+ )
493+ if err != nil {
494+ r .Recorder .Event (
495+ remoteDatabaseNodeSet ,
496+ corev1 .EventTypeWarning ,
497+ "ControllerError" ,
498+ fmt .Sprintf ("Failed to check RemoteResource usage in another DatabaseNodeSets: %v" , err ),
499+ )
500+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
501+ }
502+
503+ // Skip resource deletion because it using in some Storage
504+ // check by existence of annotation `ydb.tech/primary-resource-storage`
505+ _ , existInStorage := remoteObj .GetAnnotations ()[ydbannotations .PrimaryResourceStorageAnnotation ]
506+
507+ if existInDatabase || existInStorage {
508+ // Only remove annotation to unbind remote objects from Database
509+ // Another DatabaseNodeSet receive an event and reattach it
510+ if err := r .unbindRemoteObject (ctx , remoteDatabaseNodeSet , remoteObj ); err != nil {
511+ r .Recorder .Event (
512+ remoteDatabaseNodeSet ,
513+ corev1 .EventTypeWarning ,
514+ "ControllerError" ,
515+ fmt .Sprintf ("Failed to unbind remote object from DatabaseNodeSet: %v" , err ),
516+ )
517+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
518+ }
519+ } else {
520+ // Delete unused remote object from namespace
521+ if err := r .deleteRemoteObject (ctx , remoteDatabaseNodeSet , remoteObj ); err != nil {
522+ r .Recorder .Event (
523+ remoteDatabaseNodeSet ,
524+ corev1 .EventTypeWarning ,
525+ "ControllerError" ,
526+ fmt .Sprintf ("Failed to delete remote object from namespace: %v" , err ),
527+ )
528+ }
529+ }
530+ }
531+ }
532+
533+ return r .updateRemoteResourcesStatus (ctx , remoteDatabaseNodeSet )
534+ }
0 commit comments