Skip to content

Commit 7bb00a2

Browse files
authored
Merge pull request #2668 from k8s-infra-cherrypick-robot/cherry-pick-2661-to-release-1.5
[release-1.5] Add finalizer to AzureClusterIdentity
2 parents 3f999a1 + 8ef4183 commit 7bb00a2

File tree

4 files changed

+75
-12
lines changed

4 files changed

+75
-12
lines changed

controllers/azurecluster_controller.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,10 @@ func (acr *AzureClusterReconciler) Reconcile(ctx context.Context, req ctrl.Reque
159159
}
160160

161161
if azureCluster.Spec.IdentityRef != nil {
162-
identity, err := GetClusterIdentityFromRef(ctx, acr.Client, azureCluster.Namespace, azureCluster.Spec.IdentityRef)
162+
err := EnsureClusterIdentity(ctx, acr.Client, azureCluster, azureCluster.Spec.IdentityRef, infrav1.ClusterFinalizer)
163163
if err != nil {
164164
return reconcile.Result{}, err
165165
}
166-
if !scope.IsClusterNamespaceAllowed(ctx, acr.Client, identity.Spec.AllowedNamespaces, azureCluster.Namespace) {
167-
conditions.MarkFalse(azureCluster, infrav1.NetworkInfrastructureReadyCondition, infrav1.NamespaceNotAllowedByIdentity, clusterv1.ConditionSeverityError, "")
168-
return reconcile.Result{}, errors.New("AzureClusterIdentity list of allowed namespaces doesn't include current cluster namespace")
169-
}
170166
} else {
171167
log.Info(fmt.Sprintf("WARNING, %s", deprecatedManagerCredsWarning))
172168
acr.Recorder.Eventf(azureCluster, corev1.EventTypeWarning, "AzureClusterIdentity", deprecatedManagerCredsWarning)
@@ -298,7 +294,15 @@ func (acr *AzureClusterReconciler) reconcileDelete(ctx context.Context, clusterS
298294
}
299295

300296
// Cluster is deleted so remove the finalizer.
301-
controllerutil.RemoveFinalizer(clusterScope.AzureCluster, infrav1.ClusterFinalizer)
297+
controllerutil.RemoveFinalizer(azureCluster, infrav1.ClusterFinalizer)
298+
299+
if azureCluster.Spec.IdentityRef != nil {
300+
// Cluster is deleted so remove the identity finalizer.
301+
err := RemoveClusterIdentityFinalizer(ctx, acr.Client, azureCluster, azureCluster.Spec.IdentityRef, infrav1.ClusterFinalizer)
302+
if err != nil {
303+
return reconcile.Result{}, err
304+
}
305+
}
302306

303307
return reconcile.Result{}, nil
304308
}

controllers/helpers.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ import (
4242
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4343
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4444
"sigs.k8s.io/cluster-api/util"
45+
"sigs.k8s.io/cluster-api/util/conditions"
46+
"sigs.k8s.io/cluster-api/util/patch"
4547
ctrl "sigs.k8s.io/controller-runtime"
4648
"sigs.k8s.io/controller-runtime/pkg/client"
4749
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4850
"sigs.k8s.io/controller-runtime/pkg/controller"
51+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4952
"sigs.k8s.io/controller-runtime/pkg/handler"
5053
)
5154

@@ -597,3 +600,49 @@ func GetClusterIdentityFromRef(ctx context.Context, c client.Client, azureCluste
597600
}
598601
return nil, nil
599602
}
603+
604+
func clusterIdentityFinalizer(prefix, clusterNamespace, clusterName string) string {
605+
return fmt.Sprintf("%s/%s-%s", prefix, clusterNamespace, clusterName)
606+
}
607+
608+
// EnsureClusterIdentity ensures that the identity ref is allowed in the namespace and sets a finalizer.
609+
func EnsureClusterIdentity(ctx context.Context, c client.Client, object conditions.Setter, identityRef *corev1.ObjectReference, finalizerPrefix string) error {
610+
name := object.GetName()
611+
namespace := object.GetNamespace()
612+
identity, err := GetClusterIdentityFromRef(ctx, c, namespace, identityRef)
613+
if err != nil {
614+
return err
615+
}
616+
if !scope.IsClusterNamespaceAllowed(ctx, c, identity.Spec.AllowedNamespaces, namespace) {
617+
conditions.MarkFalse(object, infrav1.NetworkInfrastructureReadyCondition, infrav1.NamespaceNotAllowedByIdentity, clusterv1.ConditionSeverityError, "")
618+
return errors.New("AzureClusterIdentity list of allowed namespaces doesn't include current cluster namespace")
619+
}
620+
identityHelper, err := patch.NewHelper(identity, c)
621+
if err != nil {
622+
return errors.Wrap(err, "failed to init patch helper")
623+
}
624+
// If the AzureClusterIdentity doesn't have our finalizer, add it.
625+
controllerutil.AddFinalizer(identity, clusterIdentityFinalizer(finalizerPrefix, namespace, name))
626+
// Register the finalizer immediately to avoid orphaning Azure resources on delete.
627+
return identityHelper.Patch(ctx, identity)
628+
}
629+
630+
// RemoveClusterIdentityFinalizer removes the finalizer on an AzureClusterIdentity.
631+
func RemoveClusterIdentityFinalizer(ctx context.Context, c client.Client, object client.Object, identityRef *corev1.ObjectReference, finalizerPrefix string) error {
632+
name := object.GetName()
633+
namespace := object.GetNamespace()
634+
identity, err := GetClusterIdentityFromRef(ctx, c, namespace, identityRef)
635+
if err != nil {
636+
return err
637+
}
638+
identityHelper, err := patch.NewHelper(identity, c)
639+
if err != nil {
640+
return errors.Wrap(err, "failed to init patch helper")
641+
}
642+
controllerutil.RemoveFinalizer(identity, clusterIdentityFinalizer(finalizerPrefix, namespace, name))
643+
err = identityHelper.Patch(ctx, identity)
644+
if err != nil {
645+
return errors.Wrap(err, "failed to patch AzureClusterIdentity")
646+
}
647+
return nil
648+
}

exp/api/v1beta1/azuremanagedcontrolplane_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import (
2424
)
2525

2626
const (
27+
// ManagedClusterFinalizer allows Reconcile to clean up Azure resources associated with the AzureManagedControlPlane before
28+
// removing it from the apiserver.
29+
ManagedClusterFinalizer = "azuremanagedcontrolplane.infrastructure.cluster.x-k8s.io"
30+
2731
// PrivateDNSZoneModeSystem represents mode System for azuremanagedcontrolplane.
2832
PrivateDNSZoneModeSystem string = "System"
2933

exp/controllers/azuremanagedcontrolplane_controller.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,10 @@ func (amcpr *AzureManagedControlPlaneReconciler) Reconcile(ctx context.Context,
181181

182182
// check if the control plane's namespace is allowed for this identity and update owner references for the identity.
183183
if azureControlPlane.Spec.IdentityRef != nil {
184-
identity, err := infracontroller.GetClusterIdentityFromRef(ctx, amcpr.Client, azureControlPlane.Namespace, azureControlPlane.Spec.IdentityRef)
184+
err := infracontroller.EnsureClusterIdentity(ctx, amcpr.Client, azureControlPlane, azureControlPlane.Spec.IdentityRef, infrav1exp.ManagedClusterFinalizer)
185185
if err != nil {
186186
return reconcile.Result{}, err
187187
}
188-
if !scope.IsClusterNamespaceAllowed(ctx, amcpr.Client, identity.Spec.AllowedNamespaces, azureControlPlane.Namespace) {
189-
return reconcile.Result{}, errors.New("AzureClusterIdentity list of allowed namespaces doesn't include current azure managed control plane namespace")
190-
}
191188
} else {
192189
warningMessage := ("You're using deprecated functionality: ")
193190
warningMessage += ("Using Azure credentials from the manager environment is deprecated and will be removed in future releases. ")
@@ -228,8 +225,10 @@ func (amcpr *AzureManagedControlPlaneReconciler) reconcileNormal(ctx context.Con
228225

229226
log.Info("Reconciling AzureManagedControlPlane")
230227

228+
// Remove deprecated Cluster finalizer if it exists.
229+
controllerutil.RemoveFinalizer(scope.ControlPlane, infrav1.ClusterFinalizer)
231230
// If the AzureManagedControlPlane doesn't have our finalizer, add it.
232-
controllerutil.AddFinalizer(scope.ControlPlane, infrav1.ClusterFinalizer)
231+
controllerutil.AddFinalizer(scope.ControlPlane, infrav1exp.ManagedClusterFinalizer)
233232
// Register the finalizer immediately to avoid orphaning Azure resources on delete
234233
if err := scope.PatchObject(ctx); err != nil {
235234
amcpr.Recorder.Eventf(scope.ControlPlane, corev1.EventTypeWarning, "AzureManagedControlPlane unavailable", "failed to patch resource: %s", err)
@@ -275,7 +274,14 @@ func (amcpr *AzureManagedControlPlaneReconciler) reconcileDelete(ctx context.Con
275274
}
276275

277276
// Cluster is deleted so remove the finalizer.
278-
controllerutil.RemoveFinalizer(scope.ControlPlane, infrav1.ClusterFinalizer)
277+
controllerutil.RemoveFinalizer(scope.ControlPlane, infrav1exp.ManagedClusterFinalizer)
278+
279+
if scope.ControlPlane.Spec.IdentityRef != nil {
280+
err := infracontroller.RemoveClusterIdentityFinalizer(ctx, amcpr.Client, scope.ControlPlane, scope.ControlPlane.Spec.IdentityRef, infrav1exp.ManagedClusterFinalizer)
281+
if err != nil {
282+
return reconcile.Result{}, err
283+
}
284+
}
279285

280286
return reconcile.Result{}, nil
281287
}

0 commit comments

Comments
 (0)