@@ -106,6 +106,15 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
106106 case updates .Source .OCI != nil :
107107 password , err := r .getCredential (ctx , updates .Source .OCI .Password )
108108 if err != nil {
109+ if patchErr := r .patchStatusAndCondition (ctx , & mcp , v1alpha1 .FailedReconcileStatus , metav1.Condition {
110+ Type : CloudProfileAppliedConditionType ,
111+ Status : metav1 .ConditionFalse ,
112+ ObservedGeneration : mcp .Generation ,
113+ Reason : "GarbageCollectionFailed" ,
114+ Message : fmt .Sprintf ("failed to get credential for garbage collection: %s" , err ),
115+ }); patchErr != nil {
116+ return ctrl.Result {}, fmt .Errorf ("failed to patch ManagedCloudProfile status: %w (original error: %w)" , patchErr , err )
117+ }
109118 return ctrl.Result {}, err
110119 }
111120 src , err := OCIFactory (cloudprofilesync.OCIParams {
@@ -146,7 +155,19 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
146155 return ctrl.Result {}, fmt .Errorf ("failed to list source versions for garbage collection: %w" , err )
147156 }
148157
149- referencedVersions := r .getReferencedVersions (ctx , mcp .Name , updates .ImageName )
158+ referencedVersions , err := r .getReferencedVersions (ctx , mcp .Name , updates .ImageName )
159+ if err != nil {
160+ if patchErr := r .patchStatusAndCondition (ctx , & mcp , v1alpha1 .FailedReconcileStatus , metav1.Condition {
161+ Type : CloudProfileAppliedConditionType ,
162+ Status : metav1 .ConditionFalse ,
163+ ObservedGeneration : mcp .Generation ,
164+ Reason : "GarbageCollectionFailed" ,
165+ Message : fmt .Sprintf ("failed to determine referenced versions for garbage collection: %s" , err ),
166+ }); patchErr != nil {
167+ return ctrl.Result {}, fmt .Errorf ("failed to patch ManagedCloudProfile status: %w (original error: %w)" , patchErr , err )
168+ }
169+ return ctrl.Result {}, fmt .Errorf ("failed to determine referenced versions for garbage collection: %w" , err )
170+ }
150171
151172 cutoff := time .Now ().Add (- updates .GarbageCollection .MaxAge .Duration )
152173 versionsToDelete := make ([]string , 0 )
@@ -173,7 +194,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
173194 Status : metav1 .ConditionFalse ,
174195 ObservedGeneration : mcp .Generation ,
175196 Reason : "GarbageCollectionFailed" ,
176- Message : fmt .Sprintf ("failed to list source versions for garbage collection: %s" , err ),
197+ Message : fmt .Sprintf ("failed to delete image versions during garbage collection: %s" , err ),
177198 }); patchErr != nil {
178199 return ctrl.Result {}, fmt .Errorf ("failed to patch ManagedCloudProfile status: %w (original error: %w)" , patchErr , err )
179200 }
@@ -213,78 +234,61 @@ func (r *Reconciler) deleteVersion(ctx context.Context, cloudProfileName, imageN
213234 }
214235 if cp .Spec .ProviderConfig != nil {
215236 var cfg providercfg.CloudProfileConfig
216- if err := json .Unmarshal (cp .Spec .ProviderConfig .Raw , & cfg ); err == nil {
217- for i := range cfg .MachineImages {
218- if cfg .MachineImages [i ].Name != imageName {
219- continue
220- }
221- filtered := make ([]providercfg.MachineImageVersion , 0 , len (cfg .MachineImages [i ].Versions ))
222- for _ , mv := range cfg .MachineImages [i ].Versions {
223- found := false
224- for _ , version := range versions {
225- if strings .HasSuffix (mv .Image , ":" + version ) {
226- found = true
227- break
228- }
229- }
230- if ! found {
231- filtered = append (filtered , mv )
237+ if err := json .Unmarshal (cp .Spec .ProviderConfig .Raw , & cfg ); err != nil {
238+ return fmt .Errorf ("failed to unmarshal ProviderConfig: %w" , err )
239+ }
240+ for i := range cfg .MachineImages {
241+ if cfg .MachineImages [i ].Name != imageName {
242+ continue
243+ }
244+ filtered := make ([]providercfg.MachineImageVersion , 0 , len (cfg .MachineImages [i ].Versions ))
245+ for _ , mv := range cfg .MachineImages [i ].Versions {
246+ found := false
247+ for _ , version := range versions {
248+ if strings .HasSuffix (mv .Image , ":" + version ) {
249+ found = true
250+ break
232251 }
233252 }
234- cfg .MachineImages [i ].Versions = filtered
235- }
236- raw , err := json .Marshal (cfg )
237- if err == nil {
238- cp .Spec .ProviderConfig .Raw = raw
253+ if ! found {
254+ filtered = append (filtered , mv )
255+ }
239256 }
257+ cfg .MachineImages [i ].Versions = filtered
240258 }
259+ raw , err := json .Marshal (cfg )
260+ if err != nil {
261+ return fmt .Errorf ("failed to marshal ProviderConfig: %w" , err )
262+ }
263+ cp .Spec .ProviderConfig .Raw = raw
241264 }
242265
243266 return r .Update (ctx , & cp )
244267}
245268
246- func (r * Reconciler ) getReferencedVersions (ctx context.Context , cloudProfileName , imageName string ) map [string ]bool {
269+ func (r * Reconciler ) getReferencedVersions (ctx context.Context , cloudProfileName , imageName string ) ( map [string ]bool , error ) {
247270 referenced := make (map [string ]bool )
248271
249- var cp gardenerv1beta1.CloudProfile
250- if err := r .Get (ctx , types.NamespacedName {Name : cloudProfileName }, & cp ); err == nil {
251- if cp .Spec .ProviderConfig != nil {
252- var cfg providercfg.CloudProfileConfig
253- if err := json .Unmarshal (cp .Spec .ProviderConfig .Raw , & cfg ); err == nil {
254- for _ , img := range cfg .MachineImages {
255- if img .Name != imageName {
256- continue
257- }
258- for _ , v := range img .Versions {
259- if idx := strings .LastIndex (v .Image , ":" ); idx != - 1 {
260- version := v .Image [idx + 1 :]
261- referenced [version ] = true
262- }
263- }
264- }
265- }
266- }
272+ shootList := & gardenerv1beta1.ShootList {}
273+ if err := r .List (ctx , shootList , client .InNamespace (metav1 .NamespaceAll )); err != nil {
274+ return nil , fmt .Errorf ("failed to list Shoots: %w" , err )
267275 }
276+ for _ , shoot := range shootList .Items {
277+ if shoot .Spec .CloudProfile == nil || shoot .Spec .CloudProfile .Name != cloudProfileName {
278+ continue
279+ }
268280
269- shootList := & gardenerv1beta1.ShootList {}
270- if err := r .List (ctx , shootList , client .InNamespace (metav1 .NamespaceAll )); err == nil {
271- for _ , shoot := range shootList .Items {
272- if shoot .Spec .CloudProfile == nil || shoot .Spec .CloudProfile .Name != cloudProfileName {
281+ for _ , worker := range shoot .Spec .Provider .Workers {
282+ if worker .Machine .Image == nil || worker .Machine .Image .Name != imageName {
273283 continue
274284 }
275-
276- for _ , worker := range shoot .Spec .Provider .Workers {
277- if worker .Machine .Image == nil || worker .Machine .Image .Name != imageName {
278- continue
279- }
280- if worker .Machine .Image .Version != nil {
281- referenced [* worker .Machine .Image .Version ] = true
282- }
285+ if worker .Machine .Image .Version != nil {
286+ referenced [* worker .Machine .Image .Version ] = true
283287 }
284288 }
285289 }
286290
287- return referenced
291+ return referenced , nil
288292}
289293
290294func (r * Reconciler ) updateMachineImages (ctx context.Context , log logr.Logger , update v1alpha1.MachineImageUpdate , cpSpec * gardenerv1beta1.CloudProfileSpec ) error {
0 commit comments