@@ -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,83 @@ 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
240249 }
250+ raw , err := json .Marshal (cfg )
251+ if err != nil {
252+ return fmt .Errorf ("failed to marshal ProviderConfig: %w" , err )
253+ }
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
249263 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+ if err := r .Get (ctx , types.NamespacedName {Name : cloudProfileName }, & cp ); err != nil {
265+ return nil , fmt .Errorf ("failed to get CloudProfile: %w" , err )
266+ }
267+ if cp .Spec .ProviderConfig != nil {
268+ var cfg providercfg.CloudProfileConfig
269+ if err := json .Unmarshal (cp .Spec .ProviderConfig .Raw , & cfg ); err != nil {
270+ return nil , fmt .Errorf ("failed to unmarshal ProviderConfig: %w" , err )
271+ }
272+ for _ , img := range cfg .MachineImages {
273+ if img .Name != imageName {
274+ continue
275+ }
276+ for _ , v := range img .Versions {
277+ if idx := strings .LastIndex (v .Image , ":" ); idx != - 1 {
278+ version := v .Image [idx + 1 :]
279+ referenced [version ] = true
264280 }
265281 }
266282 }
267283 }
268284
269285 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 {
286+ if err := r .List (ctx , shootList , client .InNamespace (metav1 .NamespaceAll )); err != nil {
287+ return nil , fmt .Errorf ("failed to list Shoots: %w" , err )
288+ }
289+ for _ , shoot := range shootList .Items {
290+ if shoot .Spec .CloudProfile == nil || shoot .Spec .CloudProfile .Name != cloudProfileName {
291+ continue
292+ }
293+
294+ for _ , worker := range shoot .Spec .Provider .Workers {
295+ if worker .Machine .Image == nil || worker .Machine .Image .Name != imageName {
273296 continue
274297 }
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- }
298+ if worker .Machine .Image .Version != nil {
299+ referenced [* worker .Machine .Image .Version ] = true
283300 }
284301 }
285302 }
286303
287- return referenced
304+ return referenced , nil
288305}
289306
290307func (r * Reconciler ) updateMachineImages (ctx context.Context , log logr.Logger , update v1alpha1.MachineImageUpdate , cpSpec * gardenerv1beta1.CloudProfileSpec ) error {
0 commit comments