Skip to content

Commit 3b18c09

Browse files
eofffdanilrwx
authored andcommitted
fix(images): fix image deletion connected to stopped VMs (#1669)
Signed-off-by: Valeriy Khorunzhin <[email protected]>
1 parent 7ddc7ff commit 3b18c09

File tree

4 files changed

+69
-30
lines changed

4 files changed

+69
-30
lines changed

images/virtualization-artifact/pkg/common/vm/vm.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,18 @@ limitations under the License.
1717
package vm
1818

1919
import (
20+
"context"
21+
"fmt"
2022
"strings"
2123

24+
corev1 "k8s.io/api/core/v1"
2225
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
"k8s.io/apimachinery/pkg/labels"
27+
"k8s.io/apimachinery/pkg/types"
28+
virtv1 "kubevirt.io/api/core/v1"
29+
"sigs.k8s.io/controller-runtime/pkg/client"
2330

31+
"github.com/deckhouse/virtualization-controller/pkg/common/object"
2432
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
2533
"github.com/deckhouse/virtualization/api/core/v1alpha2"
2634
"github.com/deckhouse/virtualization/api/core/v1alpha2/vmcondition"
@@ -82,3 +90,30 @@ func RestartRequired(vm *v1alpha2.VirtualMachine) bool {
8290
func IsComputeContainer(name string) bool {
8391
return strings.HasSuffix(name, VMContainerNameSuffix)
8492
}
93+
94+
func IsVMActive(ctx context.Context, cli client.Client, vm v1alpha2.VirtualMachine) (bool, error) {
95+
kvvm, err := object.FetchObject(ctx, types.NamespacedName{Name: vm.Name, Namespace: vm.Namespace}, cli, &virtv1.VirtualMachine{})
96+
if err != nil {
97+
return false, fmt.Errorf("error getting kvvms: %w", err)
98+
}
99+
if kvvm != nil && kvvm.Status.StateChangeRequests != nil {
100+
return true, nil
101+
}
102+
103+
podList := corev1.PodList{}
104+
err = cli.List(ctx, &podList, &client.ListOptions{
105+
Namespace: vm.GetNamespace(),
106+
LabelSelector: labels.SelectorFromSet(map[string]string{virtv1.VirtualMachineNameLabel: vm.GetName()}),
107+
})
108+
if err != nil {
109+
return false, fmt.Errorf("unable to list virt-launcher Pod for VM %q: %w", vm.GetName(), err)
110+
}
111+
112+
for _, pod := range podList.Items {
113+
if pod.Status.Phase == corev1.PodRunning {
114+
return true, nil
115+
}
116+
}
117+
118+
return false, nil
119+
}

images/virtualization-artifact/pkg/controller/cvi/internal/attachee.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2525
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2626

27+
commonvm "github.com/deckhouse/virtualization-controller/pkg/common/vm"
2728
"github.com/deckhouse/virtualization-controller/pkg/logger"
2829
"github.com/deckhouse/virtualization/api/core/v1alpha2"
2930
)
@@ -68,6 +69,21 @@ func (h AttacheeHandler) hasAttachedVM(ctx context.Context, cvi client.Object) (
6869
}
6970

7071
for _, vm := range vms.Items {
72+
if vm.Status.Phase == "" {
73+
continue
74+
}
75+
76+
if vm.Status.Phase == v1alpha2.MachineStopped {
77+
vmIsActive, err := commonvm.IsVMActive(ctx, h.client, vm)
78+
if err != nil {
79+
return false, err
80+
}
81+
82+
if !vmIsActive {
83+
continue
84+
}
85+
}
86+
7187
if h.isCVIAttachedToVM(cvi.GetName(), vm) {
7288
return true, nil
7389
}

images/virtualization-artifact/pkg/controller/vd/internal/inuse.go

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@ import (
2323

2424
corev1 "k8s.io/api/core/v1"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26-
"k8s.io/apimachinery/pkg/labels"
2726
"k8s.io/apimachinery/pkg/types"
28-
virtv1 "kubevirt.io/api/core/v1"
2927
"sigs.k8s.io/controller-runtime/pkg/client"
3028
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3129

3230
"github.com/deckhouse/virtualization-controller/pkg/common/annotations"
3331
"github.com/deckhouse/virtualization-controller/pkg/common/object"
3432
commonvd "github.com/deckhouse/virtualization-controller/pkg/common/vd"
33+
commonvm "github.com/deckhouse/virtualization-controller/pkg/common/vm"
3534
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
3635
"github.com/deckhouse/virtualization/api/core/v1alpha2"
3736
"github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition"
@@ -182,7 +181,7 @@ func (h InUseHandler) getVirtualMachineUsageMap(ctx context.Context, vd *v1alpha
182181
case v1alpha2.MachinePending:
183182
usageMap[vm.GetName()] = true
184183
case v1alpha2.MachineStopped:
185-
vmIsActive, err := h.isVMActive(ctx, vm)
184+
vmIsActive, err := commonvm.IsVMActive(ctx, h.client, vm)
186185
if err != nil {
187186
return nil, err
188187
}
@@ -196,33 +195,6 @@ func (h InUseHandler) getVirtualMachineUsageMap(ctx context.Context, vd *v1alpha
196195
return usageMap, nil
197196
}
198197

199-
func (h InUseHandler) isVMActive(ctx context.Context, vm v1alpha2.VirtualMachine) (bool, error) {
200-
kvvm, err := object.FetchObject(ctx, types.NamespacedName{Name: vm.Name, Namespace: vm.Namespace}, h.client, &virtv1.VirtualMachine{})
201-
if err != nil {
202-
return false, fmt.Errorf("error getting kvvms: %w", err)
203-
}
204-
if kvvm != nil && kvvm.Status.StateChangeRequests != nil {
205-
return true, nil
206-
}
207-
208-
podList := corev1.PodList{}
209-
err = h.client.List(ctx, &podList, &client.ListOptions{
210-
Namespace: vm.GetNamespace(),
211-
LabelSelector: labels.SelectorFromSet(map[string]string{virtv1.VirtualMachineNameLabel: vm.GetName()}),
212-
})
213-
if err != nil {
214-
return false, fmt.Errorf("unable to list virt-launcher Pod for VM %q: %w", vm.GetName(), err)
215-
}
216-
217-
for _, pod := range podList.Items {
218-
if pod.Status.Phase == corev1.PodRunning {
219-
return true, nil
220-
}
221-
}
222-
223-
return false, nil
224-
}
225-
226198
func (h InUseHandler) updateAttachedVirtualMachinesStatus(vd *v1alpha2.VirtualDisk, usageMap map[string]bool) {
227199
currentlyMountedVM := commonvd.GetCurrentlyMountedVMName(vd)
228200

images/virtualization-artifact/pkg/controller/vi/internal/attachee.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2525
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2626

27+
commonvm "github.com/deckhouse/virtualization-controller/pkg/common/vm"
2728
"github.com/deckhouse/virtualization-controller/pkg/logger"
2829
"github.com/deckhouse/virtualization/api/core/v1alpha2"
2930
)
@@ -74,6 +75,21 @@ func (h AttacheeHandler) hasAttachedVM(ctx context.Context, vi client.Object) (b
7475
}
7576

7677
for _, vm := range vms.Items {
78+
if vm.Status.Phase == "" {
79+
continue
80+
}
81+
82+
if vm.Status.Phase == v1alpha2.MachineStopped {
83+
vmIsActive, err := commonvm.IsVMActive(ctx, h.client, vm)
84+
if err != nil {
85+
return false, err
86+
}
87+
88+
if !vmIsActive {
89+
continue
90+
}
91+
}
92+
7793
if h.isVIAttachedToVM(vi.GetName(), vm) {
7894
return true, nil
7995
}

0 commit comments

Comments
 (0)