Skip to content

Commit adf32f7

Browse files
committed
chore(vm): add system migration policy (#2156)
Signed-off-by: Dmitry Lopatin <dmitry.lopatin@flant.com>
1 parent 3f721d0 commit adf32f7

4 files changed

Lines changed: 79 additions & 3 deletions

File tree

images/virtualization-artifact/cmd/virtualization-controller/main.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"log/slog"
2223
"os"
@@ -28,6 +29,7 @@ import (
2829
"github.com/spf13/pflag"
2930
resourcev1 "k8s.io/api/resource/v1"
3031
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
32+
apierrors "k8s.io/apimachinery/pkg/api/errors"
3133
apiruntime "k8s.io/apimachinery/pkg/runtime"
3234
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3335
virtv1 "kubevirt.io/api/core/v1"
@@ -311,6 +313,18 @@ func main() {
311313
log.Error(err.Error())
312314
os.Exit(1)
313315
}
316+
317+
systemMigrationPolicy := getSystemMigrationPolicyAnnotation(ctx, preManagerClient)
318+
switch {
319+
case systemMigrationPolicy == "":
320+
appconfig.ResetSystemMigrationPolicyOverride()
321+
case appconfig.SetSystemMigrationPolicyOverride(systemMigrationPolicy):
322+
log.Info("System migration policy override is set", "value", systemMigrationPolicy)
323+
default:
324+
appconfig.ResetSystemMigrationPolicyOverride()
325+
log.Warn("System migration policy override has invalid value, override disabled", "value", systemMigrationPolicy)
326+
}
327+
314328
mCtrl, err := migration.NewController(preManagerClient, log)
315329
if err != nil {
316330
log.Error(err.Error())
@@ -508,3 +522,19 @@ func getEnv(env, defaultEnv string) string {
508522
}
509523
return defaultEnv
510524
}
525+
526+
func getSystemMigrationPolicyAnnotation(ctx context.Context, cli client.Client) string {
527+
moduleConfigName := "virtualization"
528+
systemMigrationPolicyAnnotation := "virtualization.deckhouse.io/system-migration-policy"
529+
530+
moduleConfig := &mcapi.ModuleConfig{}
531+
err := cli.Get(ctx, client.ObjectKey{Name: moduleConfigName}, moduleConfig)
532+
if err != nil {
533+
if !apierrors.IsNotFound(err) {
534+
slog.Default().Error("failed to get ModuleConfig virtualization", logger.SlogErr(err))
535+
}
536+
return ""
537+
}
538+
539+
return moduleConfig.GetAnnotations()[systemMigrationPolicyAnnotation]
540+
}

images/virtualization-artifact/pkg/config/load_live_migration_settings.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,40 @@ import (
2525
const (
2626
DefaultLiveMigrationPolicy = v1alpha2.PreferSafeMigrationPolicy
2727
)
28+
29+
var systemMigrationPolicyOverride v1alpha2.LiveMigrationPolicy
30+
31+
func SetSystemMigrationPolicyOverride(rawPolicy string) bool {
32+
policy := v1alpha2.LiveMigrationPolicy(rawPolicy)
33+
if !isValidLiveMigrationPolicy(policy) {
34+
systemMigrationPolicyOverride = ""
35+
return false
36+
}
37+
systemMigrationPolicyOverride = policy
38+
return true
39+
}
40+
41+
func GetSystemMigrationPolicyOverride() (v1alpha2.LiveMigrationPolicy, bool) {
42+
if systemMigrationPolicyOverride == "" {
43+
return "", false
44+
}
45+
return systemMigrationPolicyOverride, true
46+
}
47+
48+
func ResetSystemMigrationPolicyOverride() {
49+
systemMigrationPolicyOverride = ""
50+
}
51+
52+
func isValidLiveMigrationPolicy(policy v1alpha2.LiveMigrationPolicy) bool {
53+
switch policy {
54+
case v1alpha2.ManualMigrationPolicy,
55+
v1alpha2.NeverMigrationPolicy,
56+
v1alpha2.AlwaysSafeMigrationPolicy,
57+
v1alpha2.PreferSafeMigrationPolicy,
58+
v1alpha2.AlwaysForcedMigrationPolicy,
59+
v1alpha2.PreferForcedMigrationPolicy:
60+
return true
61+
default:
62+
return false
63+
}
64+
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,18 @@ func AutoConvergeForPolicy(policy v1alpha2.LiveMigrationPolicy) (autoConverge *b
3939
// Also, autoConverge value may be overridden from VMOP.
4040
func CalculateEffectivePolicy(vm v1alpha2.VirtualMachine, vmop *v1alpha2.VirtualMachineOperation) (effectivePolicy v1alpha2.LiveMigrationPolicy, autoConverge bool, err error) {
4141
effectivePolicy = config.DefaultLiveMigrationPolicy
42+
overridePolicy, hasSystemOverride := config.GetSystemMigrationPolicyOverride()
4243

43-
if vm.Spec.LiveMigrationPolicy != "" {
44+
if hasSystemOverride {
45+
effectivePolicy = overridePolicy
46+
} else if vm.Spec.LiveMigrationPolicy != "" {
4447
effectivePolicy = vm.Spec.LiveMigrationPolicy
4548
}
4649

4750
autoConvergePtr := AutoConvergeForPolicy(effectivePolicy)
4851

49-
// Override autoConverge value.
50-
if vmop != nil {
52+
// VMOP force may override autoConverge only when system override is not set.
53+
if vmop != nil && !hasSystemOverride {
5154
switch effectivePolicy {
5255
case v1alpha2.PreferSafeMigrationPolicy, v1alpha2.PreferForcedMigrationPolicy:
5356
if vmop.Spec.Force != nil {

templates/virtualization-controller/rbac-for-us.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ rules:
111111
- patch
112112
- list
113113
- watch
114+
- apiGroups:
115+
- deckhouse.io
116+
resources:
117+
- moduleconfigs
118+
verbs:
119+
- get
114120
- apiGroups:
115121
- cdi.internal.virtualization.deckhouse.io
116122
resources:

0 commit comments

Comments
 (0)