Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions internal/controller/controllers/preprovisioningimage_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -769,11 +769,20 @@ func (r *PreprovisioningImageReconciler) handlePreprovisioningImageDeletion(ctx
return ctrl.Result{RequeueAfter: longerRequeueAfterOnError}, err
}

// PreprovisioningImage should wait for a BMH with automated cleaning enabled to be deleted
// PreprovisioningImage should wait for a BMH with automated cleaning enabled to be deleted or finish deprovisioning
if bmh.Spec.AutomatedCleaningMode != metal3_v1alpha1.CleaningModeDisabled {
log.Infof("Cannot delete PreprovisioningImage yet: BMH %s/%s with automatedCleaningMode=%s exists and requires the image for deprovisioning",
bmh.Namespace, bmh.Name, bmh.Spec.AutomatedCleaningMode)
return ctrl.Result{Requeue: true}, nil
if bmh.DeletionTimestamp.IsZero() {
log.Infof("Cannot delete PreprovisioningImage yet: BMH %s/%s with automatedCleaningMode=%s is not being deleted",
bmh.Namespace, bmh.Name, bmh.Spec.AutomatedCleaningMode)
return ctrl.Result{Requeue: true}, nil
}
// already deprovisioned is true when the BMH is either in state powering off before delete or deleting
alreadyDeprovisioned := funk.Contains([]metal3_v1alpha1.ProvisioningState{metal3_v1alpha1.StatePoweringOffBeforeDelete, metal3_v1alpha1.StateDeleting}, bmh.Status.Provisioning.State)
if !alreadyDeprovisioned {
log.Infof("Cannot delete PreprovisioningImage yet: BMH %s/%s with automatedCleaningMode=%s has not finished deprovisioning yet. Current state: %s",
bmh.Namespace, bmh.Name, bmh.Spec.AutomatedCleaningMode, bmh.Status.Provisioning.State)
return ctrl.Result{Requeue: true}, nil
}
}

// Safe to delete, remove finalizer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1366,6 +1366,7 @@ var _ = Describe("PreprovisioningImage deletion protection", func() {

// UpdateBMH to set metadata cleaning enabled
bmh.Spec.AutomatedCleaningMode = metal3_v1alpha1.CleaningModeMetadata
bmh.Status.Provisioning.State = metal3_v1alpha1.StateDeprovisioning
bmh.Finalizers = []string{"arbitraryfinalizer"}
Expect(c.Update(ctx, bmh)).To(Succeed())
// Set BMH to be deleting
Expand Down Expand Up @@ -1401,6 +1402,46 @@ var _ = Describe("PreprovisioningImage deletion protection", func() {
Expect(k8serrors.IsNotFound(c.Get(ctx, key, ppi))).To(BeTrue())
})

It("allows deletion when BMH finished deprovisioning with state deleting", func() {
Expect(c.Create(ctx, ppi)).To(Succeed())
// Delete ppi
Expect(c.Delete(ctx, ppi)).To(Succeed())
// Set BMH to be deleting
bmh.Spec.AutomatedCleaningMode = metal3_v1alpha1.CleaningModeMetadata
bmh.Status.Provisioning.State = metal3_v1alpha1.StateDeleting
Expect(c.Update(ctx, bmh)).To(Succeed())
Expect(c.Delete(ctx, bmh)).To(Succeed())

result, err := pr.Reconcile(ctx, newPreprovisioningImageRequest(ppi))

Expect(err).To(BeNil())
Expect(result).To(Equal(ctrl.Result{}))

// Verify ppi was deleted
key := types.NamespacedName{Name: ppi.Name, Namespace: ppi.Namespace}
Expect(k8serrors.IsNotFound(c.Get(ctx, key, ppi))).To(BeTrue())
})

It("allows deletion when BMH finished deprovisioning with state powering off before delete", func() {
Expect(c.Create(ctx, ppi)).To(Succeed())
// Delete ppi
Expect(c.Delete(ctx, ppi)).To(Succeed())
// Set BMH to be deleting
bmh.Spec.AutomatedCleaningMode = metal3_v1alpha1.CleaningModeMetadata
bmh.Status.Provisioning.State = metal3_v1alpha1.StatePoweringOffBeforeDelete
Expect(c.Update(ctx, bmh)).To(Succeed())
Expect(c.Delete(ctx, bmh)).To(Succeed())

result, err := pr.Reconcile(ctx, newPreprovisioningImageRequest(ppi))

Expect(err).To(BeNil())
Expect(result).To(Equal(ctrl.Result{}))

// Verify ppi was deleted
key := types.NamespacedName{Name: ppi.Name, Namespace: ppi.Namespace}
Expect(k8serrors.IsNotFound(c.Get(ctx, key, ppi))).To(BeTrue())
})

It("blocks deletion when BMH has metadata cleaning enabled but is NOT being deleted", func() {
Expect(c.Create(ctx, ppi)).To(Succeed())
// Delete ppi
Expand Down