Skip to content

Commit 5761a96

Browse files
committed
fixes diff
1 parent 057efee commit 5761a96

File tree

3 files changed

+264
-276
lines changed

3 files changed

+264
-276
lines changed

internal/controllers/remotedatabasenodeset/remote_objects.go

Lines changed: 120 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
332218
func (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-
416280
func (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

Comments
 (0)