@@ -146,7 +146,19 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
146146 return ctrl.Result {}, fmt .Errorf ("failed to list source versions for garbage collection: %w" , err )
147147 }
148148
149- referencedVersions := r .getReferencedVersions (ctx , mcp .Name , updates .ImageName )
149+ referencedVersions , err := r .getReferencedVersions (ctx , mcp .Name , updates .ImageName )
150+ if err != nil {
151+ if patchErr := r .patchStatusAndCondition (ctx , & mcp , v1alpha1 .FailedReconcileStatus , metav1.Condition {
152+ Type : CloudProfileAppliedConditionType ,
153+ Status : metav1 .ConditionFalse ,
154+ ObservedGeneration : mcp .Generation ,
155+ Reason : "GarbageCollectionFailed" ,
156+ Message : fmt .Sprintf ("failed to determine referenced versions for garbage collection: %s" , err ),
157+ }); patchErr != nil {
158+ return ctrl.Result {}, fmt .Errorf ("failed to patch ManagedCloudProfile status: %w (original error: %w)" , patchErr , err )
159+ }
160+ return ctrl.Result {}, fmt .Errorf ("failed to determine referenced versions for garbage collection: %w" , err )
161+ }
150162
151163 cutoff := time .Now ().Add (- updates .GarbageCollection .MaxAge .Duration )
152164 versionsToDelete := make ([]string , 0 )
@@ -173,7 +185,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
173185 Status : metav1 .ConditionFalse ,
174186 ObservedGeneration : mcp .Generation ,
175187 Reason : "GarbageCollectionFailed" ,
176- Message : fmt .Sprintf ("failed to list source versions for garbage collection: %s" , err ),
188+ Message : fmt .Sprintf ("failed to delete image versions during garbage collection: %s" , err ),
177189 }); patchErr != nil {
178190 return ctrl.Result {}, fmt .Errorf ("failed to patch ManagedCloudProfile status: %w (original error: %w)" , patchErr , err )
179191 }
@@ -213,78 +225,61 @@ func (r *Reconciler) deleteVersion(ctx context.Context, cloudProfileName, imageN
213225 }
214226 if cp .Spec .ProviderConfig != nil {
215227 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 )
228+ if err := json .Unmarshal (cp .Spec .ProviderConfig .Raw , & cfg ); err != nil {
229+ return fmt .Errorf ("failed to unmarshal ProviderConfig: %w" , err )
230+ }
231+ for i := range cfg .MachineImages {
232+ if cfg .MachineImages [i ].Name != imageName {
233+ continue
234+ }
235+ filtered := make ([]providercfg.MachineImageVersion , 0 , len (cfg .MachineImages [i ].Versions ))
236+ for _ , mv := range cfg .MachineImages [i ].Versions {
237+ found := false
238+ for _ , version := range versions {
239+ if strings .HasSuffix (mv .Image , ":" + version ) {
240+ found = true
241+ break
232242 }
233243 }
234- cfg .MachineImages [i ].Versions = filtered
235- }
236- raw , err := json .Marshal (cfg )
237- if err == nil {
238- cp .Spec .ProviderConfig .Raw = raw
244+ if ! found {
245+ filtered = append (filtered , mv )
246+ }
239247 }
248+ cfg .MachineImages [i ].Versions = filtered
249+ }
250+ raw , err := json .Marshal (cfg )
251+ if err != nil {
252+ return fmt .Errorf ("failed to marshal ProviderConfig: %w" , err )
240253 }
254+ cp .Spec .ProviderConfig .Raw = raw
241255 }
242256
243257 return r .Update (ctx , & cp )
244258}
245259
246- func (r * Reconciler ) getReferencedVersions (ctx context.Context , cloudProfileName , imageName string ) map [string ]bool {
260+ func (r * Reconciler ) getReferencedVersions (ctx context.Context , cloudProfileName , imageName string ) ( map [string ]bool , error ) {
247261 referenced := make (map [string ]bool )
248262
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- }
263+ shootList := & gardenerv1beta1.ShootList {}
264+ if err := r .List (ctx , shootList , client .InNamespace (metav1 .NamespaceAll )); err != nil {
265+ return nil , fmt .Errorf ("failed to list Shoots: %w" , err )
267266 }
267+ for _ , shoot := range shootList .Items {
268+ if shoot .Spec .CloudProfile == nil || shoot .Spec .CloudProfile .Name != cloudProfileName {
269+ continue
270+ }
268271
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 {
272+ for _ , worker := range shoot .Spec .Provider .Workers {
273+ if worker .Machine .Image == nil || worker .Machine .Image .Name != imageName {
273274 continue
274275 }
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- }
276+ if worker .Machine .Image .Version != nil {
277+ referenced [* worker .Machine .Image .Version ] = true
283278 }
284279 }
285280 }
286281
287- return referenced
282+ return referenced , nil
288283}
289284
290285func (r * Reconciler ) updateMachineImages (ctx context.Context , log logr.Logger , update v1alpha1.MachineImageUpdate , cpSpec * gardenerv1beta1.CloudProfileSpec ) error {
0 commit comments