@@ -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+ }
0 commit comments