@@ -27,6 +27,7 @@ import (
2727 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2929 "k8s.io/apimachinery/pkg/runtime"
30+ "k8s.io/apimachinery/pkg/runtime/schema"
3031 "k8s.io/klog/v2"
3132 infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1alpha1"
3233 "sigs.k8s.io/cluster-api-provider-azure/exp/mutators"
@@ -52,6 +53,7 @@ type watcher interface {
5253
5354type resourceStatusObject interface {
5455 client.Object
56+ GetResourceStatuses () []infrav1exp.ResourceStatus
5557 SetResourceStatuses ([]infrav1exp.ResourceStatus )
5658}
5759
@@ -98,6 +100,28 @@ func (r *ResourceReconciler) Reconcile(ctx context.Context) error {
98100 })
99101 }
100102
103+ for _ , oldStatus := range r .owner .GetResourceStatuses () {
104+ needsDelete := true
105+ for _ , newStatus := range newResourceStatuses {
106+ if oldStatus .Resource .Group == newStatus .Resource .Group &&
107+ oldStatus .Resource .Kind == newStatus .Resource .Kind &&
108+ oldStatus .Resource .Name == newStatus .Resource .Name {
109+ needsDelete = false
110+ break
111+ }
112+ }
113+
114+ if needsDelete {
115+ updatedStatus , err := r .deleteResource (ctx , oldStatus .Resource )
116+ if err != nil {
117+ return err
118+ }
119+ if updatedStatus != nil {
120+ newResourceStatuses = append (newResourceStatuses , * updatedStatus )
121+ }
122+ }
123+ }
124+
101125 r .owner .SetResourceStatuses (newResourceStatuses )
102126
103127 return nil
@@ -141,50 +165,61 @@ func (r *ResourceReconciler) Delete(ctx context.Context) error {
141165
142166 var newResourceStatuses []infrav1exp.ResourceStatus
143167
144- for _ , spec := range r .resources {
145- spec .SetNamespace (r .owner .GetNamespace ())
146- gvk := spec .GroupVersionKind ()
147-
148- log := log .WithValues ("resource" , klog .KObj (spec ), "resourceVersion" , gvk .GroupVersion (), "resourceKind" , gvk .Kind )
149-
150- log .V (4 ).Info ("deleting resource" )
151- err := r .Client .Delete (ctx , spec )
152- if apierrors .IsNotFound (err ) {
153- log .V (4 ).Info ("resource has been deleted" )
154- continue
155- }
168+ for _ , spec := range r .owner .GetResourceStatuses () {
169+ newStatus , err := r .deleteResource (ctx , spec .Resource )
156170 if err != nil {
157- return fmt .Errorf ("failed to delete resource: %w" , err )
158- }
159-
160- err = r .Client .Get (ctx , client .ObjectKeyFromObject (spec ), spec )
161- if apierrors .IsNotFound (err ) {
162- log .V (4 ).Info ("resource has been deleted" )
163- continue
171+ return err
164172 }
165- if err != nil {
166- return fmt . Errorf ( "failed to get resource: %w" , err )
173+ if newStatus != nil {
174+ newResourceStatuses = append ( newResourceStatuses , * newStatus )
167175 }
168- ready , err := readyStatus (ctx , spec )
169- if err != nil {
170- return fmt .Errorf ("failed to get ready status: %w" , err )
171- }
172- newResourceStatuses = append (newResourceStatuses , infrav1exp.ResourceStatus {
173- Resource : infrav1exp.StatusResource {
174- Group : gvk .Group ,
175- Version : gvk .Version ,
176- Kind : gvk .Kind ,
177- Name : spec .GetName (),
178- },
179- Ready : ready ,
180- })
181176 }
182177
183178 r .owner .SetResourceStatuses (newResourceStatuses )
184179
185180 return nil
186181}
187182
183+ func (r * ResourceReconciler ) deleteResource (ctx context.Context , resource infrav1exp.StatusResource ) (* infrav1exp.ResourceStatus , error ) {
184+ ctx , log , done := tele .StartSpanWithLogger (ctx , "controllers.ResourceReconciler.deleteResource" )
185+ defer done ()
186+
187+ spec := & unstructured.Unstructured {}
188+ spec .SetGroupVersionKind (schema.GroupVersionKind {Group : resource .Group , Version : resource .Version , Kind : resource .Kind })
189+ spec .SetNamespace (r .owner .GetNamespace ())
190+ spec .SetName (resource .Name )
191+
192+ log = log .WithValues ("resource" , klog .KObj (spec ), "resourceVersion" , spec .GroupVersionKind ().GroupVersion (), "resourceKind" , spec .GetKind ())
193+
194+ log .V (4 ).Info ("deleting resource" )
195+ err := r .Client .Delete (ctx , spec )
196+ if apierrors .IsNotFound (err ) {
197+ log .V (4 ).Info ("resource has been deleted" )
198+ return nil , nil
199+ }
200+ if err != nil {
201+ return nil , fmt .Errorf ("failed to delete resource: %w" , err )
202+ }
203+
204+ err = r .Client .Get (ctx , client .ObjectKeyFromObject (spec ), spec )
205+ if apierrors .IsNotFound (err ) {
206+ log .V (4 ).Info ("resource has been deleted" )
207+ return nil , nil
208+ }
209+ if err != nil {
210+ return nil , fmt .Errorf ("failed to get resource: %w" , err )
211+ }
212+ ready , err := readyStatus (ctx , spec )
213+ if err != nil {
214+ return nil , fmt .Errorf ("failed to get ready status: %w" , err )
215+ }
216+
217+ return & infrav1exp.ResourceStatus {
218+ Resource : resource ,
219+ Ready : ready ,
220+ }, nil
221+ }
222+
188223func readyStatus (ctx context.Context , u * unstructured.Unstructured ) (bool , error ) {
189224 _ , log , done := tele .StartSpanWithLogger (ctx , "controllers.ResourceReconciler.readyStatus" )
190225 defer done ()
0 commit comments