Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package main

import (
"context"
"fmt"
"strconv"

"github.com/deckhouse/module-sdk/pkg"
"github.com/deckhouse/module-sdk/pkg/registry"
"k8s.io/utils/ptr"

"hooks/pkg/settings"
)

const (
snapshotModuleConfig = "module-config"
moduleConfigJQFilter = `"annotations":{"name": .metadata.annotations}`
migrationsPerNodeAnnotationKey = "virtualization.deckhouse.io/parallel-outbound-migrations-per-node"
migrationsPerNodeValuesPath = "virtualization.internal.dvcr.garbageCollectionModeEnabled"
defaultMigrationsPerNode = 1
)

var _ = registry.RegisterFunc(config, reconcile)

var config = &pkg.HookConfig{
OnBeforeHelm: &pkg.OrderedConfig{Order: 10},
Kubernetes: []pkg.KubernetesConfig{
{
Name: snapshotModuleConfig,
APIVersion: "deckhouse.io/v1alpha1",
Kind: "ModuleConfig",
NameSelector: &pkg.NameSelector{
MatchNames: []string{"virtualization"},
},
ExecuteHookOnSynchronization: ptr.To(true),
ExecuteHookOnEvents: ptr.To(true),
JqFilter: moduleConfigJQFilter,
},
},

Queue: fmt.Sprintf("modules/%s", settings.ModuleName),
}

func reconcile(_ context.Context, input *pkg.HookInput) error {
parallelOutboundMigrationsPerNode, err := parallelOutboundMigrationsPerNodeFromSnapshot(input)
if err != nil {
return err
}
input.Values.Set(migrationsPerNodeValuesPath, parallelOutboundMigrationsPerNode)
return nil
}

func parallelOutboundMigrationsPerNodeFromSnapshot(input *pkg.HookInput) (int, error) {
snap := input.Snapshots.Get(snapshotModuleConfig)
if len(snap) < 1 {
return -1, fmt.Errorf("moduleConfig is missing, something wrong with Deckhouse configuration")
}

var annos map[string]string
err := snap[0].UnmarshalTo(&annos)
if err != nil {
return -1, fmt.Errorf("failed to unmarshal moduleConfig annotations: %w", err)
}

if val, ok := annos[migrationsPerNodeAnnotationKey]; ok {
if valInt, err := strconv.Atoi(val); err == nil {
return valInt, nil
}
}

return defaultMigrationsPerNode, nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package main

import (
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

func TestParallelOutboundMigrationsPerNode(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "ParallelOutboundMigrationsPerNode Suite")
}
14 changes: 14 additions & 0 deletions templates/kubevirt/_kubevirt_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,17 @@ spec:
{{- end -}}
{{- end -}}
{{- end -}}

{{- define "parallelOutboundMigrationsPerNode" -}}
{{- $perNode := 1 -}}
{{- $mc := lookup "deckhouse.io/v1alpha1" "ModuleConfig" "" "virtualization" -}}
{{- if $mc -}}
{{- if $mc.metadata.annotations -}}
{{- $perNodeStr := index $mc.metadata.annotations "virtualization.deckhouse.io/parallel-outbound-migrations-per-node" -}}
{{- if and $perNodeStr (regexMatch "^[0-9]+$" $perNodeStr) -}}
{{- $perNode = int $perNodeStr -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $perNode -}}
{{- end -}}
2 changes: 1 addition & 1 deletion templates/kubevirt/kubevirt.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ spec:
bandwidthPerMigration: 640Mi
completionTimeoutPerGiB: 800
parallelMigrationsPerCluster: {{ include "kubevirt.parallel_migrations_per_cluster" . }}
parallelOutboundMigrationsPerNode: 1
parallelOutboundMigrationsPerNode: {{ include "parallelOutboundMigrationsPerNode" . | int }}
progressTimeout: 150
smbios:
manufacturer: Flant
Expand Down
Loading