Skip to content

Commit 30a64bd

Browse files
danilrwxfl64
authored andcommitted
fix(vm): livemigration force handling for PreferForced/AlwaysForced (#2179)
Fixes live migration force handling in CLI and controller policy evaluation. --------- Signed-off-by: Daniil Antoshin <daniil.antoshin@flant.com> Signed-off-by: Pavel Tishkov <pavel.tishkov@flant.com>
1 parent 7fc1be0 commit 30a64bd

4 files changed

Lines changed: 20 additions & 18 deletions

File tree

images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,10 @@ var _ = Describe("LifecycleHandler", func() {
152152
),
153153

154154
// AlwaysForced cases.
155-
Entry("should become Failed for AlwaysForced and force=nil",
155+
Entry("is ok for AlwaysForced and force=nil",
156156
newVMOPEvictPending(),
157157
v1alpha2.AlwaysForcedMigrationPolicy,
158-
v1alpha2.VMOPPhaseFailed,
158+
v1alpha2.VMOPPhasePending,
159159
),
160160
Entry("should become Failed for AlwaysForced and force=false",
161161
newVMOPEvictPending(vmopbuilder.WithForce(ptr.To(false))),

images/virtualization-artifact/pkg/livemigration/policy.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,7 @@ func CalculateEffectivePolicy(vm v1alpha2.VirtualMachine, vmop *v1alpha2.Virtual
4949
// Override autoConverge value.
5050
if vmop != nil {
5151
switch effectivePolicy {
52-
case v1alpha2.PreferSafeMigrationPolicy:
53-
if vmop.Spec.Force != nil {
54-
autoConvergePtr = vmop.Spec.Force
55-
}
56-
case v1alpha2.PreferForcedMigrationPolicy:
52+
case v1alpha2.PreferSafeMigrationPolicy, v1alpha2.PreferForcedMigrationPolicy:
5753
if vmop.Spec.Force != nil {
5854
autoConvergePtr = vmop.Spec.Force
5955
}
@@ -62,8 +58,8 @@ func CalculateEffectivePolicy(vm v1alpha2.VirtualMachine, vmop *v1alpha2.Virtual
6258
return effectivePolicy, *autoConvergePtr, fmt.Errorf("force=true is not applicable for VM liveMigrationPolicy %s", effectivePolicy)
6359
}
6460
case v1alpha2.AlwaysForcedMigrationPolicy:
65-
if vmop.Spec.Force == nil || !*vmop.Spec.Force {
66-
return effectivePolicy, *autoConvergePtr, fmt.Errorf("force=true is required for VM liveMigrationPolicy %s", effectivePolicy)
61+
if vmop.Spec.Force != nil && !*vmop.Spec.Force {
62+
return effectivePolicy, *autoConvergePtr, fmt.Errorf("force=false is not applicable for VM liveMigrationPolicy %s", effectivePolicy)
6763
}
6864
}
6965
}

src/cli/internal/cmd/lifecycle/lifecycle.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
k8serrors "k8s.io/apimachinery/pkg/api/errors"
3131
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3232
"k8s.io/apimachinery/pkg/types"
33+
"k8s.io/utils/ptr"
3334

3435
"github.com/deckhouse/virtualization/api/client/kubeclient"
3536
"github.com/deckhouse/virtualization/src/cli/internal/clientconfig"
@@ -106,7 +107,8 @@ func (l *Lifecycle) Run(cmd *cobra.Command, args []string) error {
106107
if err != nil {
107108
return err
108109
}
109-
mgr := l.getManager(client)
110+
forceSet := cmd.Flags().Changed(forceFlag)
111+
mgr := l.getManager(client, forceSet)
110112

111113
ctx, cancel := context.WithTimeout(context.Background(), l.opts.Timeout)
112114
defer cancel()
@@ -166,12 +168,17 @@ func (l *Lifecycle) getNameNamespace(defaultNamespace string, args []string) (st
166168
return name, namespace, nil
167169
}
168170

169-
func (l *Lifecycle) getManager(client kubeclient.Client) Manager {
171+
func (l *Lifecycle) getManager(client kubeclient.Client, forceSet bool) Manager {
172+
var forcePtr *bool
173+
if forceSet {
174+
forcePtr = ptr.To(l.opts.Force)
175+
}
176+
170177
return vmop.New(
171178
client,
172179
vmop.WithCreateOnly(l.opts.CreateOnly),
173180
vmop.WithWaitComplete(l.opts.WaitComplete),
174-
vmop.WithForce(l.opts.Force),
181+
vmop.WithForce(forcePtr),
175182
)
176183
}
177184

src/cli/internal/cmd/lifecycle/vmop/vmop.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
"k8s.io/apimachinery/pkg/fields"
2727
"k8s.io/apimachinery/pkg/types"
28-
"k8s.io/utils/ptr"
2928

3029
"github.com/deckhouse/virtualization/api/client/kubeclient"
3130
"github.com/deckhouse/virtualization/api/core/v1alpha2"
@@ -38,7 +37,7 @@ type VirtualMachineOperation struct {
3837
}
3938

4039
type options struct {
41-
force bool
40+
force *bool
4241
waitComplete bool
4342
createOnly bool
4443
}
@@ -56,7 +55,7 @@ func New(client kubeclient.Client, opts ...func(*VirtualMachineOperation)) *Virt
5655
return vmop
5756
}
5857

59-
func WithForce(force bool) func(*VirtualMachineOperation) {
58+
func WithForce(force *bool) func(*VirtualMachineOperation) {
6059
return func(o *VirtualMachineOperation) {
6160
o.options.force = force
6261
}
@@ -80,7 +79,7 @@ func (v VirtualMachineOperation) Stop(ctx context.Context, vmName, vmNamespace s
8079
}
8180

8281
func (v VirtualMachineOperation) Start(ctx context.Context, vmName, vmNamespace string) (msg string, err error) {
83-
vmop := v.newVMOP(vmName, vmNamespace, v1alpha2.VMOPTypeStart, false)
82+
vmop := v.newVMOP(vmName, vmNamespace, v1alpha2.VMOPTypeStart, nil)
8483
return v.do(ctx, vmop, v.options.createOnly, v.options.waitComplete)
8584
}
8685

@@ -237,7 +236,7 @@ func (v VirtualMachineOperation) isPhaseOrFailed(vmop *v1alpha2.VirtualMachineOp
237236
return vmop.Status.Phase == phase || vmop.Status.Phase == v1alpha2.VMOPPhaseFailed
238237
}
239238

240-
func (v VirtualMachineOperation) newVMOP(vmName, vmNamespace string, t v1alpha2.VMOPType, force bool) *v1alpha2.VirtualMachineOperation {
239+
func (v VirtualMachineOperation) newVMOP(vmName, vmNamespace string, t v1alpha2.VMOPType, force *bool) *v1alpha2.VirtualMachineOperation {
241240
return &v1alpha2.VirtualMachineOperation{
242241
TypeMeta: metav1.TypeMeta{
243242
Kind: v1alpha2.VirtualMachineOperationKind,
@@ -250,7 +249,7 @@ func (v VirtualMachineOperation) newVMOP(vmName, vmNamespace string, t v1alpha2.
250249
Spec: v1alpha2.VirtualMachineOperationSpec{
251250
Type: t,
252251
VirtualMachine: vmName,
253-
Force: ptr.To(force),
252+
Force: force,
254253
},
255254
}
256255
}

0 commit comments

Comments
 (0)