Skip to content

Commit 1e38ff4

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

2 files changed

Lines changed: 69 additions & 55 deletions

File tree

controllers/managedcloudprofile_controller.go

Lines changed: 50 additions & 55 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,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

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

controllers/managedcloudprofile_controller_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,24 @@ var _ = Describe("The ManagedCloudProfile reconciler", func() {
338338
cloudProfile.Spec.ProviderConfig = &runtime.RawExtension{Raw: raw}
339339
Expect(k8sClient.Create(ctx, &cloudProfile)).To(Succeed())
340340

341+
// Create a Shoot that references version "1.0.0"
342+
var shoot gardenerv1beta1.Shoot
343+
shoot.Name = "test-shoot-preserve"
344+
shoot.Namespace = metav1.NamespaceDefault
345+
shoot.Spec.CloudProfile = &gardenerv1beta1.CloudProfileReference{Name: cloudProfile.Name}
346+
shoot.Spec.Provider.Workers = []gardenerv1beta1.Worker{
347+
{
348+
Name: "worker1",
349+
Machine: gardenerv1beta1.Machine{
350+
Image: &gardenerv1beta1.ShootMachineImage{
351+
Name: "preserve-image",
352+
Version: ptr.To("1.0.0"),
353+
},
354+
},
355+
},
356+
}
357+
Expect(k8sClient.Create(ctx, &shoot)).To(Succeed())
358+
341359
var mcp v1alpha1.ManagedCloudProfile
342360
mcp.Name = "test-gc-preserve"
343361
mcp.Spec.CloudProfile = v1alpha1.CloudProfileSpec{
@@ -391,6 +409,7 @@ var _ = Describe("The ManagedCloudProfile reconciler", func() {
391409

392410
Expect(k8sClient.Delete(ctx, &mcp)).To(Succeed())
393411
Expect(k8sClient.Delete(ctx, &cloudProfile)).To(Succeed())
412+
Expect(k8sClient.Delete(ctx, &shoot)).To(Succeed())
394413
})
395414

396415
It("preserves machine image versions referenced by Shoot workers", func(ctx SpecContext) {

0 commit comments

Comments
 (0)