Skip to content

Commit

Permalink
Clean up PVCs when canceling populator flows
Browse files Browse the repository at this point in the history
This patch will clean up the PVCs (final and prime) associated with VMs
that the migration was cancled for them.

Signed-off-by: Liran Rotenberg <[email protected]>
  • Loading branch information
liranr23 committed Oct 17, 2023
1 parent ca43ece commit cbb441b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
32 changes: 32 additions & 0 deletions pkg/controller/plan/kubevirt.go
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,38 @@ func (r *KubeVirt) SetPopulatorPodOwnership(vm *plan.VMStatus) (err error) {
return
}

// DeletePVCs deletes PVCs associated with the VM, including prime PVCs (populator flows)
func (r *KubeVirt) DeletePVCs(vm *plan.VMStatus) (err error) {
pvcs, err := r.getPVCs(vm.Ref)
for _, pvc := range pvcs {
primePVC := core.PersistentVolumeClaim{}
err = r.Destination.Client.Get(context.TODO(), client.ObjectKey{Namespace: r.Plan.Spec.TargetNamespace, Name: fmt.Sprintf("prime-%s", string(pvc.UID))}, &primePVC)
if err != nil {
continue
}
// Best effort deletion
err = r.DeleteObject(&primePVC, vm, "Deleted prime PVC.", "pvc")
if err != nil && k8serr.IsNotFound(err) {
err = nil
}
if err != nil {
return
}
err = r.DeleteObject(&pvc, vm, "Deleted PVC.", "pvc")
if err != nil && k8serr.IsNotFound(err) {
err = nil
}
if err != nil {
return
}
pvcCopy := pvc.DeepCopy()
pvc.Finalizers = nil
patch := client.MergeFrom(pvcCopy)
err = r.Destination.Client.Patch(context.TODO(), &pvc, patch)
}
return
}

// Delete any populator pods that belong to a VM's migration.
func (r *KubeVirt) DeletePopulatorPods(vm *plan.VMStatus) (err error) {
list, err := r.getPopulatorPods()
Expand Down
11 changes: 11 additions & 0 deletions pkg/controller/plan/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -423,13 +423,24 @@ func (r *Migration) Cancel() (err error) {
return
}

func (r *Migration) cleanUpPopulatorPVCs(vm *plan.VMStatus) (err error) {
err = r.kubevirt.DeletePVCs(vm)
return
}

// Delete left over migration resources associated with a VM.
func (r *Migration) cleanup(vm *plan.VMStatus) (err error) {
if !vm.HasCondition(Succeeded) {
err = r.kubevirt.DeleteVM(vm)
if err != nil {
return
}
if r.builder.SupportsVolumePopulators() {
err = r.cleanUpPopulatorPVCs(vm)
if err != nil {
return
}
}
}
err = r.deleteImporterPods(vm)
if err != nil {
Expand Down

0 comments on commit cbb441b

Please sign in to comment.