-
Notifications
You must be signed in to change notification settings - Fork 196
Open
Description
xref: fluxcd/pkg#959
When spec.serviceAccountName is specified, the controller confirms the existence of the ServiceAccount before attempting to impersonate it for reconciling the deletion:
if err = r.Client.Get(ctx, types.NamespacedName{
Namespace: obj.GetNamespace(),
Name: serviceAccount,
}, &corev1.ServiceAccount{}); err != nil {
if client.IgnoreNotFound(err) == nil {
// Without a ServiceAccount reference, we cannot confirm
// the ServiceAccount exists.
ctrl.LoggerFrom(ctx).Error(err, "skipping Helm release uninstallation")
return nil
}
conditions.MarkFalse(obj, meta.ReadyCondition, v2.UninstallFailedReason,
"failed to confirm ServiceAccount '%s' can be used to uninstall release: %s", serviceAccount, err)
return err
}There are several problems in this code:
- When the ServiceAccount does not exist, the error message is vague, there's no explanation of why the uninstallation was skipped:
skipping Helm release uninstallation. - The observability behavior is inconsistent with kustomize-controller, where we both print an error log and send an error event (which seems like the right behavior).
- The error behavior is inconsistent with kustomize-controller. If kustomize-controller fails to confirm the existence of the ServiceAccount due to an error that is not
not found, it reports the error log and event, but still allows theKustomizationobject to be finalized and deleted from etcd. If helm-controller fails to confirm the existence of the ServiceAccount due to an error that is notnot found, it blocks theHelmReleaseobject finalization and deletion from etcd (by triggering controller-runtime's retry with backoff). In this case I'm not sure which controller is doing the best option. - Similar to Bug:
runtime/client.(*Impersonator).CanImpersonatedoes not take kubeconfig into account pkg#959, a configuredspec.kubeConfigis not taken into account when confirming the existence of the ServiceAccount, with the difference that kustomize-controller will still try to confirm the existence, but in the wrong cluster (the current cluster, and not the remote one). The helm-controller will not try to confirm, and will simply go ahead and try to reconcile the deletion.
Metadata
Metadata
Assignees
Labels
No labels