Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 1 addition & 65 deletions internal/controller/operator/factory/finalize/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import (
)

type crObject interface {
GetLabels() map[string]string
SelectorLabels() map[string]string
PrefixedName() string
GetServiceAccountName() string
AsOwner() metav1.OwnerReference
Expand Down Expand Up @@ -110,62 +108,6 @@ func SafeDelete(ctx context.Context, rclient client.Client, r client.Object) err
return nil
}

// SafeDeleteForSelectorsWithFinalizer removes given object if it matches provided label selectors
func SafeDeleteForSelectorsWithFinalizer(ctx context.Context, rclient client.Client, r client.Object, selectors map[string]string, owner *metav1.OwnerReference) error {
objName, objNs := r.GetName(), r.GetNamespace()
if objName == "" || objNs == "" {
return fmt.Errorf("BUG: object name=%q or object namespace=%q cannot be empty", objName, objNs)
}
// reload object from API to properly remove finalizer
if err := rclient.Get(ctx, types.NamespacedName{
Namespace: objNs,
Name: objName,
}, r); err != nil {
// fast path
if k8serrors.IsNotFound(err) {
return nil
}
return err
}
if !isLabelsMatchSelectors(r.GetLabels(), selectors) {
// object has a different set of labels
// most probably it is not managed by operator
return nil
}
if !canBeRemoved(r, owner) {
return nil
}
if err := RemoveFinalizer(ctx, rclient, r); err != nil {
if !k8serrors.IsNotFound(err) {
return err
}
return nil
}
if err := rclient.Delete(ctx, r); err != nil {
if !k8serrors.IsNotFound(err) {
return err
}
}
return nil
}

func isLabelsMatchSelectors(objLabels map[string]string, selectorLabels map[string]string) bool {
for k, v := range selectorLabels {
isFound := false
objV, ok := objLabels[k]
if ok {
if objV != v {
return false
}
isFound = true
}
if !isFound {
return false
}
}
return true
}

// SafeDeleteWithFinalizer removes object, ignores notfound error.
func SafeDeleteWithFinalizer(ctx context.Context, rclient client.Client, r client.Object, owner *metav1.OwnerReference) error {
objName, objNs := r.GetName(), r.GetNamespace()
Expand Down Expand Up @@ -202,7 +144,7 @@ func SafeDeleteWithFinalizer(ctx context.Context, rclient client.Client, r clien
func deleteSA(ctx context.Context, rclient client.Client, cr crObject) error {
owner := cr.AsOwner()
sa := &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Namespace: cr.GetNamespace(), Name: cr.GetServiceAccountName()}}
return SafeDeleteForSelectorsWithFinalizer(ctx, rclient, sa, cr.SelectorLabels(), &owner)
return SafeDeleteWithFinalizer(ctx, rclient, sa, &owner)
}

func finalizePDB(ctx context.Context, rclient client.Client, cr crObject) error {
Expand All @@ -216,11 +158,5 @@ func removeConfigReloaderRole(ctx context.Context, rclient client.Client, cr crO
if err := removeFinalizeObjByName(ctx, rclient, &rbacv1.Role{}, cr.PrefixedName(), cr.GetNamespace()); err != nil {
return err
}
if err := SafeDelete(ctx, rclient, &rbacv1.RoleBinding{ObjectMeta: metav1.ObjectMeta{Name: cr.PrefixedName(), Namespace: cr.GetNamespace()}}); err != nil {
return err
}
if err := SafeDelete(ctx, rclient, &rbacv1.Role{ObjectMeta: metav1.ObjectMeta{Name: cr.PrefixedName(), Namespace: cr.GetNamespace()}}); err != nil {
return err
}
return nil
}
7 changes: 0 additions & 7 deletions internal/controller/operator/factory/finalize/vmagent.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,6 @@ func OnVMAgentDelete(ctx context.Context, rclient client.Client, cr *vmv1beta1.V
if err := removeFinalizeObjByName(ctx, rclient, &rbacv1.Role{}, cr.GetClusterRoleName(), cr.GetNamespace()); err != nil {
return err
}
if err := SafeDelete(ctx, rclient, &rbacv1.RoleBinding{ObjectMeta: metav1.ObjectMeta{Name: cr.GetClusterRoleName(), Namespace: cr.GetNamespace()}}); err != nil {
return err
}

if err := SafeDelete(ctx, rclient, &rbacv1.Role{ObjectMeta: metav1.ObjectMeta{Name: cr.GetClusterRoleName(), Namespace: cr.GetNamespace()}}); err != nil {
return err
}
}

if cr.Spec.AdditionalScrapeConfigs != nil {
Expand Down
3 changes: 0 additions & 3 deletions internal/controller/operator/factory/finalize/vmauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,6 @@ func OnVMAuthDelete(ctx context.Context, rclient client.Client, cr *vmv1beta1.VM
if err := removeFinalizeObjByName(ctx, rclient, httpRoute, cr.PrefixedName(), cr.Namespace); err != nil {
return err
}
if err := SafeDelete(ctx, rclient, httpRoute); err != nil {
return err
}
}

// check HPA
Expand Down
12 changes: 7 additions & 5 deletions test/e2e/vmcluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1509,8 +1509,8 @@ up{baz="bar"} 123
verify: func(cr *vmv1beta1.VMCluster) {
By("checking that update process runs as configured")
Eventually(func() int {
podList := &corev1.PodList{}
k8sClient.List(ctx, podList, &client.ListOptions{
var podList corev1.PodList
k8sClient.List(ctx, &podList, &client.ListOptions{
Namespace: namespace,
LabelSelector: labels.SelectorFromSet(cr.SelectorLabels(vmv1beta1.ClusterComponentStorage)),
})
Expand All @@ -1520,14 +1520,16 @@ up{baz="bar"} 123
podsUpdated++
}
}
return podsUpdated
}, eventualStatefulsetAppReadyTimeout).Should(BeNumerically("==", 4))
Eventually(func() int32 {
var pdb policyv1.PodDisruptionBudget
k8sClient.Get(ctx, types.NamespacedName{
Namespace: namespace,
Name: cr.PrefixedName(vmv1beta1.ClusterComponentStorage),
}, &pdb)
Expect(pdb.Status.CurrentHealthy).To(BeNumerically(">=", 3), "at least 3 pods should be healthy during the update")
return podsUpdated
}, eventualStatefulsetAppReadyTimeout).Should(BeNumerically("==", 4))
return pdb.Status.CurrentHealthy
}, eventualStatefulsetAppReadyTimeout).Should(BeNumerically(">=", 3))
},
},
),
Expand Down
Loading