Skip to content

Commit 8cb8455

Browse files
fixed comments and improved error handling
1 parent e5daea6 commit 8cb8455

1 file changed

Lines changed: 67 additions & 50 deletions

File tree

controllers/managedcloudprofile_controller.go

Lines changed: 67 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

290307
func (r *Reconciler) updateMachineImages(ctx context.Context, log logr.Logger, update v1alpha1.MachineImageUpdate, cpSpec *gardenerv1beta1.CloudProfileSpec) error {

0 commit comments

Comments
 (0)