From fa9ca40f9b32d8d4d281b14cef66349cfe415ac2 Mon Sep 17 00:00:00 2001 From: Liran Rotenberg Date: Wed, 6 Sep 2023 18:22:30 +0300 Subject: [PATCH] Clean importer pods on success Multiple importer pods may be created during warm migrations. This patch cleans up all of them for the migrated VM once the migration completes successfully. Signed-off-by: Liran Rotenberg --- pkg/controller/plan/kubevirt.go | 75 ++++++++++++++++++++++++-------- pkg/controller/plan/migration.go | 11 ++--- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/pkg/controller/plan/kubevirt.go b/pkg/controller/plan/kubevirt.go index a2129d994..0ce5fe03a 100644 --- a/pkg/controller/plan/kubevirt.go +++ b/pkg/controller/plan/kubevirt.go @@ -219,6 +219,36 @@ func (r *KubeVirt) GetImporterPod(pvc core.PersistentVolumeClaim) (pod *core.Pod return } +// Get the importer pods for a PersistentVolumeClaim. +func (r *KubeVirt) GetImporterPods(pvc core.PersistentVolumeClaim) (pods []core.Pod, err error) { + pods = []core.Pod{} + if _, ok := pvc.Annotations[AnnImporterPodName]; !ok { + return + } + + podList := &core.PodList{} + + err = r.Destination.Client.List( + context.TODO(), + podList, + &client.ListOptions{ + Namespace: r.Plan.Spec.TargetNamespace, + LabelSelector: labels.SelectorFromSet(map[string]string{"app": "containerized-data-importer"}), + }, + ) + if err != nil { + err = liberr.Wrap(err) + return + } + for _, pod := range podList.Items { + if strings.Contains(pod.Name, fmt.Sprintf("importer-%s-%s", r.Plan.Name, pvc.Annotations[kVM])) { + pods = append(pods, pod) + } + } + + return +} + // Delete the DataVolumes associated with the VM. func (r *KubeVirt) DeleteDataVolumes(vm *plan.VMStatus) (err error) { dvs, err := r.getDVs(vm) @@ -235,27 +265,36 @@ func (r *KubeVirt) DeleteDataVolumes(vm *plan.VMStatus) (err error) { return } -// Delete the importer pod for a PersistentVolumeClaim. -func (r *KubeVirt) DeleteImporterPod(pvc core.PersistentVolumeClaim) (err error) { - var pod *core.Pod - var found bool - pod, found, err = r.GetImporterPod(pvc) - if err != nil || !found { - return - } - err = r.Destination.Client.Delete(context.TODO(), pod) +// Delete the importer pods for a PersistentVolumeClaim. +func (r *KubeVirt) DeleteImporterPods(pvc core.PersistentVolumeClaim) (err error) { + pods, err := r.GetImporterPods(pvc) if err != nil { - err = liberr.Wrap(err) return } - r.Log.Info( - "Deleted importer pod.", - "pod", - path.Join( - pod.Namespace, - pod.Name), - "pvc", - pvc.Name) + for _, pod := range pods { + err = r.Destination.Client.Delete(context.TODO(), &pod) + if err != nil { + err = liberr.Wrap(err) + r.Log.Error( + err, + "Deleting importer pod failed.", + "pod", + path.Join( + pod.Namespace, + pod.Name), + "pvc", + pvc.Name) + continue + } + r.Log.Info( + "Deleted importer pod.", + "pod", + path.Join( + pod.Namespace, + pod.Name), + "pvc", + pvc.Name) + } return } diff --git a/pkg/controller/plan/migration.go b/pkg/controller/plan/migration.go index 66b771a53..78b410fc9 100644 --- a/pkg/controller/plan/migration.go +++ b/pkg/controller/plan/migration.go @@ -478,7 +478,7 @@ func (r *Migration) deleteImporterPods(vm *plan.VMStatus) (err error) { return } for _, pvc := range pvcs { - err = r.kubevirt.DeleteImporterPod(pvc) + err = r.kubevirt.DeleteImporterPods(pvc) if err != nil { return } @@ -748,14 +748,15 @@ func (r *Migration) execute(vm *plan.VMStatus) (err error) { // Removing unnecessary DataVolumes err = r.kubevirt.DeleteDataVolumes(vm) if err != nil { - step.AddError(err.Error()) - err = nil - break + err = liberr.Wrap(err) } err = r.kubevirt.DeletePVCConsumerPod(vm) if err != nil { err = liberr.Wrap(err) - return + } + err = r.deleteImporterPods(vm) + if err != nil { + err = liberr.Wrap(err) } step.MarkCompleted() step.Phase = Completed