From 1eba4dc0377afd8a49ae186cbfab373d5801be7e Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Tue, 1 Jul 2025 20:49:32 +0300 Subject: [PATCH 1/6] refactor Signed-off-by: Yaroslav Borbat --- images/virtualization-artifact/Taskfile.yaml | 3 + .../cmd/virtualization-controller/app/app.go | 171 ++++++++ .../app/controller.go | 140 +++++++ .../virtualization-controller/app/scheme.go | 50 +++ .../cmd/virtualization-controller/main.go | 362 +--------------- images/virtualization-artifact/go.mod | 13 +- images/virtualization-artifact/go.sum | 45 +- .../pkg/common/consts.go | 5 - .../pkg/config/apis/Taskfile.yaml | 7 + .../componentconfig/doc.go} | 13 +- .../apis/componentconfig/install/install.go | 32 ++ .../config/apis/componentconfig/register.go | 50 +++ .../pkg/config/apis/componentconfig/types.go | 89 ++++ .../apis/componentconfig/v1alpha1/doc.go | 24 ++ .../apis/componentconfig/v1alpha1/register.go | 58 +++ .../apis/componentconfig/v1alpha1/types.go | 89 ++++ .../v1alpha1/zz_generated.conversion.go | 392 ++++++++++++++++++ .../v1alpha1/zz_generated.deepcopy.go | 206 +++++++++ .../componentconfig/zz_generated.deepcopy.go | 206 +++++++++ .../pkg/config/apis/hack/boilerplate.go.txt | 15 + .../pkg/config/apis/hack/update-codegen.sh | 29 ++ .../pkg/config/config.go | 176 ++++++++ .../pkg/config/config_test.go | 76 ++++ .../pkg/config/legacy.go | 46 ++ .../pkg/config/load_dvcr_settings.go | 92 ---- .../pkg/config/load_gc_settings.go | 84 ---- .../pkg/config/load_import_settings.go | 83 ---- .../config/load_vd_storage_class_settings.go | 47 --- .../config/load_vi_storage_class_settings.go | 51 --- .../pkg/controller/cvi/cvi_controller.go | 1 + .../pkg/controller/vm/gc.go | 9 +- .../vmiplease/vmiplease_controller.go | 11 +- .../pkg/controller/vmop/gc.go | 9 +- .../pkg/migration/migration.go | 1 + .../virtualization-controller/_helpers.tpl | 89 ---- .../virtualization-controller/config.yaml | 69 +++ .../virtualization-controller/deployment.yaml | 17 + 37 files changed, 2012 insertions(+), 848 deletions(-) create mode 100644 images/virtualization-artifact/cmd/virtualization-controller/app/app.go create mode 100644 images/virtualization-artifact/cmd/virtualization-controller/app/controller.go create mode 100644 images/virtualization-artifact/cmd/virtualization-controller/app/scheme.go create mode 100644 images/virtualization-artifact/pkg/config/apis/Taskfile.yaml rename images/virtualization-artifact/pkg/config/{load_live_migration_settings.go => apis/componentconfig/doc.go} (68%) create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/install/install.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/register.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/types.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/doc.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/register.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/types.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.conversion.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go create mode 100644 images/virtualization-artifact/pkg/config/apis/componentconfig/zz_generated.deepcopy.go create mode 100644 images/virtualization-artifact/pkg/config/apis/hack/boilerplate.go.txt create mode 100755 images/virtualization-artifact/pkg/config/apis/hack/update-codegen.sh create mode 100644 images/virtualization-artifact/pkg/config/config.go create mode 100644 images/virtualization-artifact/pkg/config/config_test.go create mode 100644 images/virtualization-artifact/pkg/config/legacy.go delete mode 100644 images/virtualization-artifact/pkg/config/load_dvcr_settings.go delete mode 100644 images/virtualization-artifact/pkg/config/load_gc_settings.go delete mode 100644 images/virtualization-artifact/pkg/config/load_import_settings.go delete mode 100644 images/virtualization-artifact/pkg/config/load_vd_storage_class_settings.go delete mode 100644 images/virtualization-artifact/pkg/config/load_vi_storage_class_settings.go create mode 100644 templates/virtualization-controller/config.yaml diff --git a/images/virtualization-artifact/Taskfile.yaml b/images/virtualization-artifact/Taskfile.yaml index 295590344d..15f29fd567 100644 --- a/images/virtualization-artifact/Taskfile.yaml +++ b/images/virtualization-artifact/Taskfile.yaml @@ -7,6 +7,9 @@ includes: api: taskfile: ../../api/Taskfile.dist.yaml dir: ../../api + config: + taskfile: pkg/config/apis/Taskfile.yaml + dir: pkg/config/apis vars: BaseNamespace: d8-virtualization diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/app.go b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go new file mode 100644 index 0000000000..980c8e58f7 --- /dev/null +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go @@ -0,0 +1,171 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "fmt" + "runtime" + + deckhouselog "github.com/deckhouse/deckhouse/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + apiruntime "k8s.io/apimachinery/pkg/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/controller-runtime/pkg/client/config" + + virtualizationconfig "github.com/deckhouse/virtualization-controller/pkg/config" + "github.com/deckhouse/virtualization-controller/pkg/controller/indexer" + mc "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig" + "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization-controller/pkg/migration" + "github.com/deckhouse/virtualization-controller/pkg/version" + "github.com/deckhouse/virtualization/api/client/kubeclient" +) + +func NewVirtualizationControllerCommand() *cobra.Command { + opts := &options{} + cmd := &cobra.Command{ + Use: "virtualization-controller", + Short: "virtualization-controller", + Long: "virtualization-controller", + Args: cobra.NoArgs, + SilenceErrors: true, + SilenceUsage: true, + RunE: opts.run, + } + + opts.AddFlags(cmd.Flags()) + return cmd +} + +type options struct { + Config string + PprofBindAddr string + MetricsBindAddr string + LogLevel string + LogOutput string + LogFormat string + LogDebugControllerList []string + LogDebugVerbosity int + LeaderElection bool +} + +func (o *options) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.Config, "config", "/etc/virtualization-controller/config.yaml", "path to config file") + fs.StringVar(&o.PprofBindAddr, "pprof-bind-address", "", "enable pprof") + fs.StringVar(&o.MetricsBindAddr, "metrics-bind-address", "8080", "metric bind address") + fs.StringVar(&o.LogLevel, "log-level", "info", "log level") + fs.StringVar(&o.LogOutput, "log-output", "", "log output") + fs.StringVar(&o.LogFormat, "log-format", "json", "log format") + fs.StringSliceVar(&o.LogDebugControllerList, "log-debug-controller-list", nil, "log debug controller list") + fs.IntVar(&o.LogDebugVerbosity, "log-debug-verbosity", 0, "log debug verbosity") + fs.BoolVar(&o.LeaderElection, "leader-election", true, "enable leader election") +} + +func (o *options) run(cmd *cobra.Command, _ []string) error { + log := logger.NewLogger(o.LogLevel, o.LogOutput, o.LogDebugVerbosity) + logger.SetDefaultLogger(log) + + printVersion(log) + + configuration, err := virtualizationconfig.Load(o.Config) + if err != nil { + return err + } + + cfg, err := config.GetConfig() + if err != nil { + return fmt.Errorf("failed to get config: %w", err) + } + + // Override content type to JSON so proxy can rewrite payloads. + cfg.ContentType = apiruntime.ContentTypeJSON + cfg.NegotiatedSerializer = clientgoscheme.Codecs.WithoutConversion() + + scheme, err := newScheme() + if err != nil { + return err + } + + managerOpts := manager.Options{ + LeaderElection: o.LeaderElection, + LeaderElectionNamespace: configuration.Spec.Namespace, + LeaderElectionID: "d8-virtualization-controller", + LeaderElectionResourceLock: "leases", + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: o.MetricsBindAddr, + }, + PprofBindAddress: o.PprofBindAddr, + } + + mgr, err := manager.New(cfg, managerOpts) + if err != nil { + return fmt.Errorf("failed to create manager: %w", err) + } + + virtualizationClient, err := kubeclient.GetClientFromRESTConfig(cfg) + if err != nil { + return fmt.Errorf("failed to create virtualization kubeclient: %w", err) + } + + log.Info("Registering Components.") + onlyMigrationClient, err := client.New(cfg, client.Options{Scheme: scheme}) + if err != nil { + return fmt.Errorf("failed to create onlyMigrationClient: %w", err) + } + + mCtrl, err := migration.NewController(onlyMigrationClient, log) + if err != nil { + return fmt.Errorf("failed to create migration controller: %w", err) + } + ctx := cmd.Context() + mCtrl.Run(ctx) + + if err = indexer.IndexALL(ctx, mgr); err != nil { + return fmt.Errorf("failed to index all resources: %w", err) + } + + for controllerName, setupController := range controllers { + loggerForController := logger.NewControllerLogger(controllerName, o.LogLevel, o.LogOutput, o.LogDebugVerbosity, o.LogDebugControllerList) + err = setupController(ctx, mgr, loggerForController, configuration.DeepCopy(), virtualizationClient) + if err != nil { + return fmt.Errorf("failed to setup %s controller: %w", controllerName, err) + } + } + + if err = mc.SetupWebhookWithManager(mgr); err != nil { + return fmt.Errorf("failed to setup module config webhook: %w", err) + } + + log.Info("Starting the Manager.") + + if err = mgr.Start(ctx); err != nil { + return fmt.Errorf("manager exired non-zero: %w", err) + } + return nil +} + +func printVersion(log *deckhouselog.Logger) { + log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) + log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) + log.Info(fmt.Sprintf("Edition: %s", version.GetEdition())) +} diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go new file mode 100644 index 0000000000..e29af39bb4 --- /dev/null +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go @@ -0,0 +1,140 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "context" + + "github.com/deckhouse/deckhouse/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + + "github.com/deckhouse/virtualization-controller/pkg/config" + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" + "github.com/deckhouse/virtualization-controller/pkg/controller/cvi" + "github.com/deckhouse/virtualization-controller/pkg/controller/evacuation" + "github.com/deckhouse/virtualization-controller/pkg/controller/livemigration" + "github.com/deckhouse/virtualization-controller/pkg/controller/vd" + "github.com/deckhouse/virtualization-controller/pkg/controller/vdsnapshot" + "github.com/deckhouse/virtualization-controller/pkg/controller/vi" + "github.com/deckhouse/virtualization-controller/pkg/controller/vm" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmbda" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmclass" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmip" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmiplease" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmop" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmrestore" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmsnapshot" + workloadupdater "github.com/deckhouse/virtualization-controller/pkg/controller/workload-updater" + "github.com/deckhouse/virtualization/api/client/kubeclient" +) + +var controllers = map[string]func( + ctx context.Context, + mgr manager.Manager, + log *log.Logger, + configuration *componentconfig.VirtualizationControllerConfiguration, + virtualizationClient kubeclient.Client, +) error{ + cvi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := cvi.NewController(ctx, + mgr, + log, + configuration.Spec.ImportSettings.ImporterImage, + configuration.Spec.ImportSettings.UploaderImage, + configuration.Spec.ImportSettings.Requirements, + config.ToLegacyDVCR(configuration), + configuration.Spec.Namespace) + return err + }, + vd.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vd.NewController( + ctx, + mgr, + log, + configuration.Spec.ImportSettings.ImporterImage, + configuration.Spec.ImportSettings.UploaderImage, + configuration.Spec.ImportSettings.Requirements, + config.ToLegacyDVCR(configuration), + config.ToLegacyVirtualDiskStorageClassSettings(configuration)) + return err + }, + vi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vi.NewController( + ctx, + mgr, + log, + configuration.Spec.ImportSettings.ImporterImage, + configuration.Spec.ImportSettings.UploaderImage, + configuration.Spec.ImportSettings.BounderImage, + configuration.Spec.ImportSettings.Requirements, + config.ToLegacyDVCR(configuration), + config.ToLegacyVirtualImageStorageClassSettings(configuration)) + return err + }, + vm.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vm.SetupController( + ctx, + mgr, + log, + config.ToLegacyDVCR(configuration), + configuration.Spec.FirmwareImage) + }, + vm.GCVMMigrationControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vm.SetupGC(mgr, log, configuration.Spec.GarbageCollector.VMIMigration) + }, + vmbda.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vmbda.NewController(ctx, mgr, virtualizationClient, log, configuration.Spec.Namespace) + return err + }, + vmip.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vmip.NewController(ctx, mgr, virtualizationClient, log, configuration.Spec.VirtualMachineCIDRs) + return err + }, + vmiplease.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vmiplease.NewController(ctx, mgr, log, configuration.Spec.VirtualMachineIPLeasesRetentionDuration) + return err + }, + vmclass.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vmclass.NewController(ctx, mgr, configuration.Spec.Namespace, log) + return err + }, + vdsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + _, err := vdsnapshot.NewController(ctx, mgr, log, virtualizationClient) + return err + }, + vmsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vmsnapshot.NewController(ctx, mgr, log, virtualizationClient) + }, + vmrestore.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vmrestore.NewController(ctx, mgr, log) + }, + vmop.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vmop.SetupController(ctx, mgr, log) + }, + vmop.GCControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return vmop.SetupGC(mgr, log, configuration.Spec.GarbageCollector.VMOP) + }, + livemigration.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return livemigration.SetupController(ctx, mgr, log) + }, + workloadupdater.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return workloadupdater.SetupController(ctx, mgr, log, configuration.Spec.FirmwareImage, configuration.Spec.Namespace, configuration.Spec.VirtControllerName) + }, + evacuation.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + return evacuation.SetupController(ctx, mgr, virtualizationClient, log) + }, +} diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/scheme.go b/images/virtualization-artifact/cmd/virtualization-controller/app/scheme.go new file mode 100644 index 0000000000..bb27d57762 --- /dev/null +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/scheme.go @@ -0,0 +1,50 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "fmt" + + vsv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" + extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + virtv1 "kubevirt.io/api/core/v1" + cdiv1beta1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" + + mcapi "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig/api" + virtv2alpha1 "github.com/deckhouse/virtualization/api/core/v1alpha2" +) + +func newScheme() (*runtime.Scheme, error) { + scheme := runtime.NewScheme() + for _, f := range []func(*runtime.Scheme) error{ + clientgoscheme.AddToScheme, + extv1.AddToScheme, + virtv2alpha1.AddToScheme, + cdiv1beta1.AddToScheme, + virtv1.AddToScheme, + vsv1.AddToScheme, + mcapi.AddToScheme, + } { + err := f(scheme) + if err != nil { + return nil, fmt.Errorf("failed to add to scheme: %w", err) + } + } + return scheme, nil +} diff --git a/images/virtualization-artifact/cmd/virtualization-controller/main.go b/images/virtualization-artifact/cmd/virtualization-controller/main.go index 05b5816fdb..9106956ceb 100644 --- a/images/virtualization-artifact/cmd/virtualization-controller/main.go +++ b/images/virtualization-artifact/cmd/virtualization-controller/main.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,372 +17,18 @@ limitations under the License. package main import ( - "flag" "fmt" - "log/slog" "os" - "runtime" - "strconv" - "strings" - vsv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" - extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiruntime "k8s.io/apimachinery/pkg/runtime" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - virtv1 "kubevirt.io/api/core/v1" - cdiv1beta1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/manager/signals" - metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - "github.com/deckhouse/deckhouse/pkg/log" - appconfig "github.com/deckhouse/virtualization-controller/pkg/config" - "github.com/deckhouse/virtualization-controller/pkg/controller/cvi" - "github.com/deckhouse/virtualization-controller/pkg/controller/evacuation" - "github.com/deckhouse/virtualization-controller/pkg/controller/indexer" - "github.com/deckhouse/virtualization-controller/pkg/controller/livemigration" - mc "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig" - mcapi "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig/api" - "github.com/deckhouse/virtualization-controller/pkg/controller/vd" - "github.com/deckhouse/virtualization-controller/pkg/controller/vdsnapshot" - "github.com/deckhouse/virtualization-controller/pkg/controller/vi" - "github.com/deckhouse/virtualization-controller/pkg/controller/vm" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmbda" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmclass" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmip" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmiplease" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmop" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmrestore" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmsnapshot" - workloadupdater "github.com/deckhouse/virtualization-controller/pkg/controller/workload-updater" - "github.com/deckhouse/virtualization-controller/pkg/logger" - "github.com/deckhouse/virtualization-controller/pkg/migration" - "github.com/deckhouse/virtualization-controller/pkg/version" - "github.com/deckhouse/virtualization/api/client/kubeclient" - virtv2alpha1 "github.com/deckhouse/virtualization/api/core/v1alpha2" -) - -const ( - logDebugControllerListEnv = "LOG_DEBUG_CONTROLLER_LIST" - logDebugVerbosityEnv = "LOG_DEBUG_VERBOSITY" - logFormatEnv = "LOG_FORMAT" - logLevelEnv = "LOG_LEVEL" - logOutputEnv = "LOG_OUTPUT" - - metricsBindAddrEnv = "METRICS_BIND_ADDRESS" - podNamespaceEnv = "POD_NAMESPACE" - pprofBindAddrEnv = "PPROF_BIND_ADDRESS" - virtualMachineCIDRsEnv = "VIRTUAL_MACHINE_CIDRS" - virtualMachineIPLeasesRetentionDurationEnv = "VIRTUAL_MACHINE_IP_LEASES_RETENTION_DURATION" - - FirmwareImageEnv = "FIRMWARE_IMAGE" - VirtControllerNameEnv = "VIRT_CONTROLLER_NAME" + "github.com/deckhouse/virtualization-controller/cmd/virtualization-controller/app" ) func main() { - var logLevel string - flag.StringVar(&logLevel, "log-level", os.Getenv(logLevelEnv), "log level") - - var err error - var defaultDebugVerbosity int64 - logDebugVerbosityRaw := os.Getenv(logDebugVerbosityEnv) - if logDebugVerbosityRaw != "" { - defaultDebugVerbosity, err = strconv.ParseInt(logDebugVerbosityRaw, 10, 64) - if err != nil { - slog.Default().Error(err.Error()) - os.Exit(1) - } - } - - var logDebugControllerList []string - fmt.Print(len(logDebugControllerList)) - logDebugControllerListRaw := os.Getenv(logDebugControllerListEnv) - if logDebugControllerListRaw != "" { - logDebugControllerListRaw = strings.ReplaceAll(logDebugControllerListRaw, " ", "") - logDebugControllerList = strings.Split(logDebugControllerListRaw, ",") - } - - var logDebugVerbosity int - flag.IntVar(&logDebugVerbosity, "log-debug-verbosity", int(defaultDebugVerbosity), "log debug verbosity") - - var logOutput string - flag.StringVar(&logOutput, "log-output", os.Getenv(logOutputEnv), "log output") - - var pprofBindAddr string - flag.StringVar(&pprofBindAddr, "pprof-bind-address", os.Getenv(pprofBindAddrEnv), "enable pprof") - - var metricsBindAddr string - flag.StringVar(&metricsBindAddr, "metrics-bind-address", getEnv(metricsBindAddrEnv, ":8080"), "metric bind address") - - var firmwareImage string - flag.StringVar(&firmwareImage, "firmware-image", os.Getenv(FirmwareImageEnv), "Firmware image") - - var virtControllerName string - flag.StringVar(&virtControllerName, "virt-controller-name", getEnv(VirtControllerNameEnv, "virt-controller"), "Virt controller name") - - flag.Parse() - - log := logger.NewLogger(logLevel, logOutput, logDebugVerbosity) - logger.SetDefaultLogger(log) - - printVersion(log) - - if firmwareImage == "" { - log.Error("firmware image is required") - os.Exit(1) - } - - if virtControllerName == "" { - log.Error("virt-controller name is required") - os.Exit(1) - } - - controllerNamespace, err := appconfig.GetRequiredEnvVar(podNamespaceEnv) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - dvcrSettings, err := appconfig.LoadDVCRSettingsFromEnvs(controllerNamespace) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - importSettings, err := appconfig.LoadImportSettingsFromEnv() - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - gcSettings, err := appconfig.LoadGcSettings() - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - viStorageClassSettings := appconfig.LoadVirtualImageStorageClassSettings() - vdStorageClassSettings := appconfig.LoadVirtualDiskStorageClassSettings() - - // Get a config to talk to the apiserver - cfg, err := config.GetConfig() - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - // Override content type to JSON so proxy can rewrite payloads. - cfg.ContentType = apiruntime.ContentTypeJSON - cfg.NegotiatedSerializer = clientgoscheme.Codecs.WithoutConversion() - - leaderElectionNS := os.Getenv(podNamespaceEnv) - if leaderElectionNS == "" { - leaderElectionNS = "default" - } - - // Setup scheme for all resources - scheme := apiruntime.NewScheme() - - for _, f := range []func(*apiruntime.Scheme) error{ - clientgoscheme.AddToScheme, - extv1.AddToScheme, - virtv2alpha1.AddToScheme, - cdiv1beta1.AddToScheme, - virtv1.AddToScheme, - vsv1.AddToScheme, - mcapi.AddToScheme, - } { - err = f(scheme) - if err != nil { - log.Error("Failed to add to scheme", logger.SlogErr(err)) - os.Exit(1) - } - } - - managerOpts := manager.Options{ - // This controller watches resources in all namespaces. - LeaderElection: true, - LeaderElectionNamespace: leaderElectionNS, - LeaderElectionID: "d8-virt-operator-leader-election-helper", - LeaderElectionResourceLock: "leases", - Scheme: scheme, - Metrics: metricsserver.Options{ - BindAddress: metricsBindAddr, - }, - } - if pprofBindAddr != "" { - managerOpts.PprofBindAddress = pprofBindAddr - } - - vmCIDRsRaw := os.Getenv(virtualMachineCIDRsEnv) - if vmCIDRsRaw == "" { - log.Error("Failed to get virtualMachineCIDRs: virtualMachineCIDRs not found, but required") - os.Exit(1) - } - virtualMachineCIDRs := strings.Split(vmCIDRsRaw, ",") - - virtualMachineIPLeasesRetentionDuration := os.Getenv(virtualMachineIPLeasesRetentionDurationEnv) - if virtualMachineIPLeasesRetentionDuration == "" { - log.Info("virtualMachineIPLeasesRetentionDuration not found -> set default value '10m'") - virtualMachineIPLeasesRetentionDuration = "10m" - } - - // Create a new Manager to provide shared dependencies and start components - mgr, err := manager.New(cfg, managerOpts) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - virtClient, err := kubeclient.GetClientFromRESTConfig(cfg) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - log.Info("Registering Components.") - - // Setup context to gracefully handle termination. ctx := signals.SetupSignalHandler() - - onlyMigrationClient, err := client.New(cfg, client.Options{Scheme: scheme}) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } - mCtrl, err := migration.NewController(onlyMigrationClient, log) - if err != nil { - log.Error(err.Error()) + if err := app.NewVirtualizationControllerCommand().ExecuteContext(ctx); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } - mCtrl.Run(ctx) - - if err = indexer.IndexALL(ctx, mgr); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - cviLogger := logger.NewControllerLogger(cvi.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = cvi.NewController(ctx, mgr, cviLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.Requirements, dvcrSettings, controllerNamespace); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vdLogger := logger.NewControllerLogger(vd.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vd.NewController(ctx, mgr, vdLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.Requirements, dvcrSettings, vdStorageClassSettings); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - viLogger := logger.NewControllerLogger(vi.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vi.NewController(ctx, mgr, viLogger, importSettings.ImporterImage, importSettings.UploaderImage, importSettings.BounderImage, importSettings.Requirements, dvcrSettings, viStorageClassSettings); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmLogger := logger.NewControllerLogger(vm.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if err = vm.SetupController(ctx, mgr, vmLogger, dvcrSettings, firmwareImage); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - if err = vm.SetupGC(mgr, vmLogger, gcSettings.VMIMigration); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmbdaLogger := logger.NewControllerLogger(vmbda.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vmbda.NewController(ctx, mgr, virtClient, vmbdaLogger, controllerNamespace); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmipLogger := logger.NewControllerLogger(vmip.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vmip.NewController(ctx, mgr, virtClient, vmipLogger, virtualMachineCIDRs); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmipleaseLogger := logger.NewControllerLogger(vmiplease.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vmiplease.NewController(ctx, mgr, vmipleaseLogger, virtualMachineIPLeasesRetentionDuration); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmclassLogger := logger.NewControllerLogger(vmclass.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vmclass.NewController(ctx, mgr, controllerNamespace, vmclassLogger); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vdsnapshotLogger := logger.NewControllerLogger(vdsnapshot.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if _, err = vdsnapshot.NewController(ctx, mgr, vdsnapshotLogger, virtClient); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmsnapshotLogger := logger.NewControllerLogger(vmsnapshot.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if err = vmsnapshot.NewController(ctx, mgr, vmsnapshotLogger, virtClient); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmrestoreLogger := logger.NewControllerLogger(vmrestore.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if err = vmrestore.NewController(ctx, mgr, vmrestoreLogger); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - vmopLogger := logger.NewControllerLogger(vmop.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if err = vmop.SetupController(ctx, mgr, vmopLogger); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - if err = vmop.SetupGC(mgr, vmopLogger, gcSettings.VMOP); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - liveMigrationLogger := logger.NewControllerLogger(livemigration.ControllerName, logLevel, logOutput, logDebugVerbosity, logDebugControllerList) - if err = livemigration.SetupController(ctx, mgr, liveMigrationLogger); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - if err = mc.SetupWebhookWithManager(mgr); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - if err = workloadupdater.SetupController(ctx, mgr, log, firmwareImage, controllerNamespace, virtControllerName); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - if err = evacuation.SetupController(ctx, mgr, virtClient, log); err != nil { - log.Error(err.Error()) - os.Exit(1) - } - - log.Info("Starting the Manager.") - - // Start the Manager - if err = mgr.Start(ctx); err != nil { - log.Error("Manager exited non-zero", logger.SlogErr(err)) - os.Exit(1) - } -} - -func printVersion(log *log.Logger) { - log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) - log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) - log.Info(fmt.Sprintf("Edition: %s", version.GetEdition())) -} - -func getEnv(env, defaultEnv string) string { - if e, found := os.LookupEnv(env); found { - return e - } - return defaultEnv } diff --git a/images/virtualization-artifact/go.mod b/images/virtualization-artifact/go.mod index 6f7ae8fa2f..191f7d8c4f 100644 --- a/images/virtualization-artifact/go.mod +++ b/images/virtualization-artifact/go.mod @@ -21,13 +21,13 @@ require ( go.uber.org/zap v1.26.0 k8s.io/api v0.30.2 k8s.io/apiextensions-apiserver v0.30.0 - k8s.io/apimachinery v0.30.2 + k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.30.0 k8s.io/client-go v0.30.0 - k8s.io/code-generator v0.30.0 + k8s.io/code-generator v0.31.0 k8s.io/component-base v0.30.0 k8s.io/component-helpers v0.29.2 - k8s.io/klog/v2 v2.120.1 + k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 k8s.io/utils v0.0.0-20240423183400-0849a56e8f22 kubevirt.io/api v1.3.1 @@ -52,7 +52,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/docker/docker v25.0.6+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -63,7 +63,7 @@ require ( github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -133,7 +133,6 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect - k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect k8s.io/kms v0.30.0 // indirect kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 // indirect @@ -152,6 +151,6 @@ replace ( k8s.io/apimachinery => k8s.io/apimachinery v0.29.2 k8s.io/apiserver => k8s.io/apiserver v0.29.2 k8s.io/client-go => k8s.io/client-go v0.29.2 - k8s.io/code-generator => k8s.io/code-generator v0.29.2 + k8s.io/code-generator => k8s.io/code-generator v0.31.0 k8s.io/component-base => k8s.io/component-base v0.29.2 ) diff --git a/images/virtualization-artifact/go.sum b/images/virtualization-artifact/go.sum index 037ef54b54..6e895e5102 100644 --- a/images/virtualization-artifact/go.sum +++ b/images/virtualization-artifact/go.sum @@ -25,9 +25,15 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -39,8 +45,9 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckhouse/deckhouse/pkg/log v0.0.0-20250226105106-176cd3afcdd5 h1:PsN1E0oxC/+4zdA977txrqUCuObFL3HAuu5Xnud8m8c= github.com/deckhouse/deckhouse/pkg/log v0.0.0-20250226105106-176cd3afcdd5/go.mod h1:Mk5HRzkc5pIcDIZ2JJ6DPuuqnwhXVkb3you8M8Mg+4w= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= @@ -72,6 +79,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= @@ -81,6 +89,7 @@ github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -98,12 +107,16 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -146,6 +159,7 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -167,6 +181,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rH github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -191,6 +206,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kubernetes-csi/external-snapshotter/client/v6 v6.3.0 h1:qS4r4ljINLWKJ9m9Ge3Q3sGZ/eIoDVDT2RhAdQFHb1k= github.com/kubernetes-csi/external-snapshotter/client/v6 v6.3.0/go.mod h1:oGXx2XTEzs9ikW2V6IC1dD8trgjRsS/Mvc2JRiC618Y= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -236,6 +252,8 @@ github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3Ro github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -258,12 +276,16 @@ github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRah github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/openshift/custom-resource-status v1.1.2 h1:C3DL44LEbvlbItfd8mT5jWrqPfHnSOQoQf/sypqA6A4= github.com/openshift/custom-resource-status v1.1.2/go.mod h1:DB/Mf2oTeiAmVVX1gN+NEqweonAPY0TKUwADizj8+ZA= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -309,6 +331,7 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -407,6 +430,7 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -424,10 +448,14 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= @@ -445,6 +473,7 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -468,6 +497,9 @@ golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= @@ -499,6 +531,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -537,15 +570,14 @@ k8s.io/apiserver v0.29.2 h1:+Z9S0dSNr+CjnVXQePG8TcBWHr3Q7BmAr7NraHvsMiQ= k8s.io/apiserver v0.29.2/go.mod h1:B0LieKVoyU7ykQvPFm7XSdIHaCHSzCzQWPFa5bqbeMQ= k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= -k8s.io/code-generator v0.29.2 h1:c9/iw2KnNpw2IRV+wwuG/Wns2TjPSgjWzbbjTevyiHI= -k8s.io/code-generator v0.29.2/go.mod h1:FwFi3C9jCrmbPjekhaCYcYG1n07CYiW1+PAPCockaos= +k8s.io/code-generator v0.31.0 h1:w607nrMi1KeDKB3/F/J4lIoOgAwc+gV9ZKew4XRfMp8= +k8s.io/code-generator v0.31.0/go.mod h1:84y4w3es8rOJOUUP1rLsIiGlO1JuEaPFXQPA9e/K6U0= k8s.io/component-base v0.29.2 h1:lpiLyuvPA9yV1aQwGLENYyK7n/8t6l3nn3zAtFTJYe8= k8s.io/component-base v0.29.2/go.mod h1:BfB3SLrefbZXiBfbM+2H1dlat21Uewg/5qtKOl8degM= k8s.io/component-helpers v0.29.2 h1:1kTIanIdqUVG2nW3e2ENVEaYbZKphqPgEdCmJvk71aw= k8s.io/component-helpers v0.29.2/go.mod h1:gFc/p60rYtpD8UCcNfPCmbokHT2uy0yDpmr/KKUMNAw= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= @@ -554,8 +586,9 @@ k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kms v0.30.0 h1:ZlnD/ei5lpvUlPw6eLfVvH7d8i9qZ6HwUQgydNVks8g= k8s.io/kms v0.30.0/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= diff --git a/images/virtualization-artifact/pkg/common/consts.go b/images/virtualization-artifact/pkg/common/consts.go index fb16ef545b..79def51857 100644 --- a/images/virtualization-artifact/pkg/common/consts.go +++ b/images/virtualization-artifact/pkg/common/consts.go @@ -33,11 +33,6 @@ const ( // UploaderPort provides a constant to use as a port for uploader Service UploaderPort = 80 // ImporterPodImageNameVar is a name of variable with the image name for the importer Pod - ImporterPodImageNameVar = "IMPORTER_IMAGE" - // UploaderPodImageNameVar is a name of variable with the image name for the uploader Pod - UploaderPodImageNameVar = "UPLOADER_IMAGE" - // BounderPodImageNameVar is a name of variable with the image name for the bounder Pod - BounderPodImageNameVar = "BOUNDER_IMAGE" // ImporterCertDir is where the configmap containing certs will be mounted ImporterCertDir = "/certs" // ImporterProxyCertDir is where the configmap containing proxy certs will be mounted diff --git a/images/virtualization-artifact/pkg/config/apis/Taskfile.yaml b/images/virtualization-artifact/pkg/config/apis/Taskfile.yaml new file mode 100644 index 0000000000..0800327d1e --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/Taskfile.yaml @@ -0,0 +1,7 @@ +version: "3" + +tasks: + generate: + desc: "Generate component config" + cmds: + - hack/update-codegen.sh diff --git a/images/virtualization-artifact/pkg/config/load_live_migration_settings.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/doc.go similarity index 68% rename from images/virtualization-artifact/pkg/config/load_live_migration_settings.go rename to images/virtualization-artifact/pkg/config/apis/componentconfig/doc.go index a345f9acbf..f57ffd9322 100644 --- a/images/virtualization-artifact/pkg/config/load_live_migration_settings.go +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/doc.go @@ -14,14 +14,5 @@ See the License for the specific language governing permissions and limitations under the License. */ -package config - -import ( - "github.com/deckhouse/virtualization/api/core/v1alpha2" -) - -// TODO(future) live migration settings will be here. Now just a place for the default policy. - -const ( - DefaultLiveMigrationPolicy = v1alpha2.PreferSafeMigrationPolicy -) +// +k8s:deepcopy-gen=package,register +package componentconfig diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/install/install.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/install/install.go new file mode 100644 index 0000000000..29a8f5dcb7 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/install/install.go @@ -0,0 +1,32 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package install + +import ( + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig/v1alpha1" +) + +// Install registers the API group and adds types to a scheme +func Install(scheme *runtime.Scheme) { + utilruntime.Must(componentconfig.AddToScheme(scheme)) + utilruntime.Must(v1alpha1.AddToScheme(scheme)) + utilruntime.Must(scheme.SetVersionPriority(v1alpha1.SchemeGroupVersion)) +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/register.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/register.go new file mode 100644 index 0000000000..d70b238b12 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/register.go @@ -0,0 +1,50 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package componentconfig + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// GroupName is the group name used in this package +const GroupName = "configuration.virtualization.deckhouse.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} + +// Kind takes an unqualified kind and returns a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &VirtualizationControllerConfiguration{}, + ) + return nil +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/types.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/types.go new file mode 100644 index 0000000000..423206ee4a --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/types.go @@ -0,0 +1,89 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package componentconfig + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +kubebuilder:object:root=true +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type VirtualizationControllerConfiguration struct { + metav1.TypeMeta `json:",inline"` + Spec VirtualizationControllerConfigurationSpec +} + +type VirtualizationControllerConfigurationSpec struct { + Namespace string + FirmwareImage string + VirtControllerName string + VirtualMachineCIDRs []string + VirtualMachineIPLeasesRetentionDuration metav1.Duration + GarbageCollector GarbageCollector + VirtualImageStorageClassSettings VirtualImageStorageClassSettings + VirtualDiskStorageClassSettings VirtualDiskStorageClassSettings + ImportSettings ImportSettings + DVCR DVCR + Ingress Ingress +} + +type GarbageCollector struct { + VMOP BaseGCSettings + VMIMigration BaseGCSettings +} + +type BaseGCSettings struct { + TTL metav1.Duration + Schedule string +} + +type VirtualImageStorageClassSettings struct { + AllowedStorageClassNames []string + DefaultStorageClassName string + StorageClassName string +} + +type VirtualDiskStorageClassSettings struct { + AllowedStorageClassNames []string + DefaultStorageClassName string +} + +type ImportSettings struct { + ImporterImage string + UploaderImage string + BounderImage string + Requirements corev1.ResourceRequirements +} + +type DVCR struct { + // AuthSecret is a name of the Secret with docker authentication. + AuthSecret string + // CertsSecret is a name of the TLS Secret with DVCR certificates (only CA cert is used). + CertsSecret string + // RegistryURL is a registry hostname with optional endpoint. + RegistryURL string + // InsecureTLS specifies if registry is insecure (trust all certificates). Works for destination only. + InsecureTLS bool +} + +type Ingress struct { + Host string + TLSSecret string + Class string +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/doc.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/doc.go new file mode 100644 index 0000000000..7646a912fb --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/doc.go @@ -0,0 +1,24 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package,register +// +k8s:openapi-gen=true +// +k8s:conversion-gen=github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig + +// Package v1alpha1 is the v1alpha1 version of the virtualization's componentconfig API +// +groupName=virtualizationcomponentconfig + +package v1alpha1 diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/register.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/register.go new file mode 100644 index 0000000000..78dbe76862 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/register.go @@ -0,0 +1,58 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" +) + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + AddToScheme = SchemeBuilder.AddToScheme +) + +const ( + GroupVersion = "v1alpha1" +) + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: componentconfig.GroupName, Version: GroupVersion} + +// Kind takes an unqualified kind and returns a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +func init() { + localSchemeBuilder.Register(addKnownTypes) +} + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &VirtualizationControllerConfiguration{}, + ) + return nil +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/types.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/types.go new file mode 100644 index 0000000000..7daa8f8288 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/types.go @@ -0,0 +1,89 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +kubebuilder:object:root=true +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type VirtualizationControllerConfiguration struct { + metav1.TypeMeta `json:",inline"` + Spec VirtualizationControllerConfigurationSpec `json:"spec"` +} + +type VirtualizationControllerConfigurationSpec struct { + Namespace string `json:"namespace"` + FirmwareImage string `json:"firmwareImage"` + VirtControllerName string `json:"virtControllerName"` + VirtualMachineCIDRs []string `json:"virtualMachineCIDRs"` + VirtualMachineIPLeasesRetentionDuration metav1.Duration `json:"virtualMachineIPLeasesRetentionDuration,omitempty"` + GarbageCollector GarbageCollector `json:"garbageCollector,omitempty"` + VirtualImageStorageClassSettings VirtualImageStorageClassSettings `json:"virtualImageStorageClassSettings,omitempty"` + VirtualDiskStorageClassSettings VirtualDiskStorageClassSettings `json:"virtualDiskStorageClassSettings,omitempty"` + ImportSettings ImportSettings `json:"importSettings"` + DVCR DVCR `json:"dvcr"` + Ingress Ingress `json:"ingress"` +} + +type GarbageCollector struct { + VMOP BaseGCSettings `json:"vmop,omitempty"` + VMIMigration BaseGCSettings `json:"vmiMigration,omitempty"` +} + +type BaseGCSettings struct { + TTL metav1.Duration `json:"ttl,omitempty"` + Schedule string `json:"schedule,omitempty"` +} + +type VirtualImageStorageClassSettings struct { + AllowedStorageClassNames []string `json:"allowedStorageClassNames,omitempty"` + DefaultStorageClassName string `json:"defaultStorageClassName,omitempty"` + StorageClassName string `json:"storageClassName,omitempty"` +} + +type VirtualDiskStorageClassSettings struct { + AllowedStorageClassNames []string `json:"allowedStorageClassNames,omitempty"` + DefaultStorageClassName string `json:"defaultStorageClassName,omitempty"` +} + +type ImportSettings struct { + ImporterImage string `json:"importerImage"` + UploaderImage string `json:"uploaderImage"` + BounderImage string `json:"bounderImage"` + Requirements corev1.ResourceRequirements `json:"requirements,omitempty"` +} + +type DVCR struct { + // AuthSecret is a name of the Secret with docker authentication. + AuthSecret string `json:"authSecret"` + // CertsSecret is a name of the TLS Secret with DVCR certificates (only CA cert is used). + CertsSecret string `json:"certsSecret,omitempty"` + // RegistryURL is a registry hostname with optional endpoint. + RegistryURL string `json:"registryURL,omitempty"` + // InsecureTLS specifies if registry is insecure (trust all certificates). Works for destination only. + InsecureTLS bool `json:"insecureTLS,omitempty"` +} + +type Ingress struct { + Host string `json:"host"` + TLSSecret string `json:"tlsSecret,omitempty"` + Class string `json:"class,omitempty"` +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.conversion.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.conversion.go new file mode 100644 index 0000000000..d281145dde --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.conversion.go @@ -0,0 +1,392 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by conversion-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + unsafe "unsafe" + + componentconfig "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*BaseGCSettings)(nil), (*componentconfig.BaseGCSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(a.(*BaseGCSettings), b.(*componentconfig.BaseGCSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.BaseGCSettings)(nil), (*BaseGCSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(a.(*componentconfig.BaseGCSettings), b.(*BaseGCSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*DVCR)(nil), (*componentconfig.DVCR)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_DVCR_To_componentconfig_DVCR(a.(*DVCR), b.(*componentconfig.DVCR), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.DVCR)(nil), (*DVCR)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_DVCR_To_v1alpha1_DVCR(a.(*componentconfig.DVCR), b.(*DVCR), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*GarbageCollector)(nil), (*componentconfig.GarbageCollector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector(a.(*GarbageCollector), b.(*componentconfig.GarbageCollector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.GarbageCollector)(nil), (*GarbageCollector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector(a.(*componentconfig.GarbageCollector), b.(*GarbageCollector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ImportSettings)(nil), (*componentconfig.ImportSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings(a.(*ImportSettings), b.(*componentconfig.ImportSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.ImportSettings)(nil), (*ImportSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings(a.(*componentconfig.ImportSettings), b.(*ImportSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*Ingress)(nil), (*componentconfig.Ingress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_Ingress_To_componentconfig_Ingress(a.(*Ingress), b.(*componentconfig.Ingress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.Ingress)(nil), (*Ingress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_Ingress_To_v1alpha1_Ingress(a.(*componentconfig.Ingress), b.(*Ingress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*VirtualDiskStorageClassSettings)(nil), (*componentconfig.VirtualDiskStorageClassSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings(a.(*VirtualDiskStorageClassSettings), b.(*componentconfig.VirtualDiskStorageClassSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.VirtualDiskStorageClassSettings)(nil), (*VirtualDiskStorageClassSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings(a.(*componentconfig.VirtualDiskStorageClassSettings), b.(*VirtualDiskStorageClassSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*VirtualImageStorageClassSettings)(nil), (*componentconfig.VirtualImageStorageClassSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings(a.(*VirtualImageStorageClassSettings), b.(*componentconfig.VirtualImageStorageClassSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.VirtualImageStorageClassSettings)(nil), (*VirtualImageStorageClassSettings)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings(a.(*componentconfig.VirtualImageStorageClassSettings), b.(*VirtualImageStorageClassSettings), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*VirtualizationControllerConfiguration)(nil), (*componentconfig.VirtualizationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VirtualizationControllerConfiguration_To_componentconfig_VirtualizationControllerConfiguration(a.(*VirtualizationControllerConfiguration), b.(*componentconfig.VirtualizationControllerConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.VirtualizationControllerConfiguration)(nil), (*VirtualizationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_VirtualizationControllerConfiguration_To_v1alpha1_VirtualizationControllerConfiguration(a.(*componentconfig.VirtualizationControllerConfiguration), b.(*VirtualizationControllerConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*VirtualizationControllerConfigurationSpec)(nil), (*componentconfig.VirtualizationControllerConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec(a.(*VirtualizationControllerConfigurationSpec), b.(*componentconfig.VirtualizationControllerConfigurationSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*componentconfig.VirtualizationControllerConfigurationSpec)(nil), (*VirtualizationControllerConfigurationSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec(a.(*componentconfig.VirtualizationControllerConfigurationSpec), b.(*VirtualizationControllerConfigurationSpec), scope) + }); err != nil { + return err + } + return nil +} + +func autoConvert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(in *BaseGCSettings, out *componentconfig.BaseGCSettings, s conversion.Scope) error { + out.TTL = in.TTL + out.Schedule = in.Schedule + return nil +} + +// Convert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings is an autogenerated conversion function. +func Convert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(in *BaseGCSettings, out *componentconfig.BaseGCSettings, s conversion.Scope) error { + return autoConvert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(in, out, s) +} + +func autoConvert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(in *componentconfig.BaseGCSettings, out *BaseGCSettings, s conversion.Scope) error { + out.TTL = in.TTL + out.Schedule = in.Schedule + return nil +} + +// Convert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings is an autogenerated conversion function. +func Convert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(in *componentconfig.BaseGCSettings, out *BaseGCSettings, s conversion.Scope) error { + return autoConvert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(in, out, s) +} + +func autoConvert_v1alpha1_DVCR_To_componentconfig_DVCR(in *DVCR, out *componentconfig.DVCR, s conversion.Scope) error { + out.AuthSecret = in.AuthSecret + out.CertsSecret = in.CertsSecret + out.RegistryURL = in.RegistryURL + out.InsecureTLS = in.InsecureTLS + return nil +} + +// Convert_v1alpha1_DVCR_To_componentconfig_DVCR is an autogenerated conversion function. +func Convert_v1alpha1_DVCR_To_componentconfig_DVCR(in *DVCR, out *componentconfig.DVCR, s conversion.Scope) error { + return autoConvert_v1alpha1_DVCR_To_componentconfig_DVCR(in, out, s) +} + +func autoConvert_componentconfig_DVCR_To_v1alpha1_DVCR(in *componentconfig.DVCR, out *DVCR, s conversion.Scope) error { + out.AuthSecret = in.AuthSecret + out.CertsSecret = in.CertsSecret + out.RegistryURL = in.RegistryURL + out.InsecureTLS = in.InsecureTLS + return nil +} + +// Convert_componentconfig_DVCR_To_v1alpha1_DVCR is an autogenerated conversion function. +func Convert_componentconfig_DVCR_To_v1alpha1_DVCR(in *componentconfig.DVCR, out *DVCR, s conversion.Scope) error { + return autoConvert_componentconfig_DVCR_To_v1alpha1_DVCR(in, out, s) +} + +func autoConvert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector(in *GarbageCollector, out *componentconfig.GarbageCollector, s conversion.Scope) error { + if err := Convert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(&in.VMOP, &out.VMOP, s); err != nil { + return err + } + if err := Convert_v1alpha1_BaseGCSettings_To_componentconfig_BaseGCSettings(&in.VMIMigration, &out.VMIMigration, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector is an autogenerated conversion function. +func Convert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector(in *GarbageCollector, out *componentconfig.GarbageCollector, s conversion.Scope) error { + return autoConvert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector(in, out, s) +} + +func autoConvert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector(in *componentconfig.GarbageCollector, out *GarbageCollector, s conversion.Scope) error { + if err := Convert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(&in.VMOP, &out.VMOP, s); err != nil { + return err + } + if err := Convert_componentconfig_BaseGCSettings_To_v1alpha1_BaseGCSettings(&in.VMIMigration, &out.VMIMigration, s); err != nil { + return err + } + return nil +} + +// Convert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector is an autogenerated conversion function. +func Convert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector(in *componentconfig.GarbageCollector, out *GarbageCollector, s conversion.Scope) error { + return autoConvert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector(in, out, s) +} + +func autoConvert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings(in *ImportSettings, out *componentconfig.ImportSettings, s conversion.Scope) error { + out.ImporterImage = in.ImporterImage + out.UploaderImage = in.UploaderImage + out.BounderImage = in.BounderImage + out.Requirements = in.Requirements + return nil +} + +// Convert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings is an autogenerated conversion function. +func Convert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings(in *ImportSettings, out *componentconfig.ImportSettings, s conversion.Scope) error { + return autoConvert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings(in, out, s) +} + +func autoConvert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings(in *componentconfig.ImportSettings, out *ImportSettings, s conversion.Scope) error { + out.ImporterImage = in.ImporterImage + out.UploaderImage = in.UploaderImage + out.BounderImage = in.BounderImage + out.Requirements = in.Requirements + return nil +} + +// Convert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings is an autogenerated conversion function. +func Convert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings(in *componentconfig.ImportSettings, out *ImportSettings, s conversion.Scope) error { + return autoConvert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings(in, out, s) +} + +func autoConvert_v1alpha1_Ingress_To_componentconfig_Ingress(in *Ingress, out *componentconfig.Ingress, s conversion.Scope) error { + out.Host = in.Host + out.TLSSecret = in.TLSSecret + out.Class = in.Class + return nil +} + +// Convert_v1alpha1_Ingress_To_componentconfig_Ingress is an autogenerated conversion function. +func Convert_v1alpha1_Ingress_To_componentconfig_Ingress(in *Ingress, out *componentconfig.Ingress, s conversion.Scope) error { + return autoConvert_v1alpha1_Ingress_To_componentconfig_Ingress(in, out, s) +} + +func autoConvert_componentconfig_Ingress_To_v1alpha1_Ingress(in *componentconfig.Ingress, out *Ingress, s conversion.Scope) error { + out.Host = in.Host + out.TLSSecret = in.TLSSecret + out.Class = in.Class + return nil +} + +// Convert_componentconfig_Ingress_To_v1alpha1_Ingress is an autogenerated conversion function. +func Convert_componentconfig_Ingress_To_v1alpha1_Ingress(in *componentconfig.Ingress, out *Ingress, s conversion.Scope) error { + return autoConvert_componentconfig_Ingress_To_v1alpha1_Ingress(in, out, s) +} + +func autoConvert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings(in *VirtualDiskStorageClassSettings, out *componentconfig.VirtualDiskStorageClassSettings, s conversion.Scope) error { + out.AllowedStorageClassNames = *(*[]string)(unsafe.Pointer(&in.AllowedStorageClassNames)) + out.DefaultStorageClassName = in.DefaultStorageClassName + return nil +} + +// Convert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings is an autogenerated conversion function. +func Convert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings(in *VirtualDiskStorageClassSettings, out *componentconfig.VirtualDiskStorageClassSettings, s conversion.Scope) error { + return autoConvert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings(in, out, s) +} + +func autoConvert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings(in *componentconfig.VirtualDiskStorageClassSettings, out *VirtualDiskStorageClassSettings, s conversion.Scope) error { + out.AllowedStorageClassNames = *(*[]string)(unsafe.Pointer(&in.AllowedStorageClassNames)) + out.DefaultStorageClassName = in.DefaultStorageClassName + return nil +} + +// Convert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings is an autogenerated conversion function. +func Convert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings(in *componentconfig.VirtualDiskStorageClassSettings, out *VirtualDiskStorageClassSettings, s conversion.Scope) error { + return autoConvert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings(in, out, s) +} + +func autoConvert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings(in *VirtualImageStorageClassSettings, out *componentconfig.VirtualImageStorageClassSettings, s conversion.Scope) error { + out.AllowedStorageClassNames = *(*[]string)(unsafe.Pointer(&in.AllowedStorageClassNames)) + out.DefaultStorageClassName = in.DefaultStorageClassName + out.StorageClassName = in.StorageClassName + return nil +} + +// Convert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings is an autogenerated conversion function. +func Convert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings(in *VirtualImageStorageClassSettings, out *componentconfig.VirtualImageStorageClassSettings, s conversion.Scope) error { + return autoConvert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings(in, out, s) +} + +func autoConvert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings(in *componentconfig.VirtualImageStorageClassSettings, out *VirtualImageStorageClassSettings, s conversion.Scope) error { + out.AllowedStorageClassNames = *(*[]string)(unsafe.Pointer(&in.AllowedStorageClassNames)) + out.DefaultStorageClassName = in.DefaultStorageClassName + out.StorageClassName = in.StorageClassName + return nil +} + +// Convert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings is an autogenerated conversion function. +func Convert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings(in *componentconfig.VirtualImageStorageClassSettings, out *VirtualImageStorageClassSettings, s conversion.Scope) error { + return autoConvert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings(in, out, s) +} + +func autoConvert_v1alpha1_VirtualizationControllerConfiguration_To_componentconfig_VirtualizationControllerConfiguration(in *VirtualizationControllerConfiguration, out *componentconfig.VirtualizationControllerConfiguration, s conversion.Scope) error { + if err := Convert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha1_VirtualizationControllerConfiguration_To_componentconfig_VirtualizationControllerConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_VirtualizationControllerConfiguration_To_componentconfig_VirtualizationControllerConfiguration(in *VirtualizationControllerConfiguration, out *componentconfig.VirtualizationControllerConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_VirtualizationControllerConfiguration_To_componentconfig_VirtualizationControllerConfiguration(in, out, s) +} + +func autoConvert_componentconfig_VirtualizationControllerConfiguration_To_v1alpha1_VirtualizationControllerConfiguration(in *componentconfig.VirtualizationControllerConfiguration, out *VirtualizationControllerConfiguration, s conversion.Scope) error { + if err := Convert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_componentconfig_VirtualizationControllerConfiguration_To_v1alpha1_VirtualizationControllerConfiguration is an autogenerated conversion function. +func Convert_componentconfig_VirtualizationControllerConfiguration_To_v1alpha1_VirtualizationControllerConfiguration(in *componentconfig.VirtualizationControllerConfiguration, out *VirtualizationControllerConfiguration, s conversion.Scope) error { + return autoConvert_componentconfig_VirtualizationControllerConfiguration_To_v1alpha1_VirtualizationControllerConfiguration(in, out, s) +} + +func autoConvert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec(in *VirtualizationControllerConfigurationSpec, out *componentconfig.VirtualizationControllerConfigurationSpec, s conversion.Scope) error { + out.Namespace = in.Namespace + out.FirmwareImage = in.FirmwareImage + out.VirtControllerName = in.VirtControllerName + out.VirtualMachineCIDRs = *(*[]string)(unsafe.Pointer(&in.VirtualMachineCIDRs)) + out.VirtualMachineIPLeasesRetentionDuration = in.VirtualMachineIPLeasesRetentionDuration + if err := Convert_v1alpha1_GarbageCollector_To_componentconfig_GarbageCollector(&in.GarbageCollector, &out.GarbageCollector, s); err != nil { + return err + } + if err := Convert_v1alpha1_VirtualImageStorageClassSettings_To_componentconfig_VirtualImageStorageClassSettings(&in.VirtualImageStorageClassSettings, &out.VirtualImageStorageClassSettings, s); err != nil { + return err + } + if err := Convert_v1alpha1_VirtualDiskStorageClassSettings_To_componentconfig_VirtualDiskStorageClassSettings(&in.VirtualDiskStorageClassSettings, &out.VirtualDiskStorageClassSettings, s); err != nil { + return err + } + if err := Convert_v1alpha1_ImportSettings_To_componentconfig_ImportSettings(&in.ImportSettings, &out.ImportSettings, s); err != nil { + return err + } + if err := Convert_v1alpha1_DVCR_To_componentconfig_DVCR(&in.DVCR, &out.DVCR, s); err != nil { + return err + } + if err := Convert_v1alpha1_Ingress_To_componentconfig_Ingress(&in.Ingress, &out.Ingress, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec is an autogenerated conversion function. +func Convert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec(in *VirtualizationControllerConfigurationSpec, out *componentconfig.VirtualizationControllerConfigurationSpec, s conversion.Scope) error { + return autoConvert_v1alpha1_VirtualizationControllerConfigurationSpec_To_componentconfig_VirtualizationControllerConfigurationSpec(in, out, s) +} + +func autoConvert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec(in *componentconfig.VirtualizationControllerConfigurationSpec, out *VirtualizationControllerConfigurationSpec, s conversion.Scope) error { + out.Namespace = in.Namespace + out.FirmwareImage = in.FirmwareImage + out.VirtControllerName = in.VirtControllerName + out.VirtualMachineCIDRs = *(*[]string)(unsafe.Pointer(&in.VirtualMachineCIDRs)) + out.VirtualMachineIPLeasesRetentionDuration = in.VirtualMachineIPLeasesRetentionDuration + if err := Convert_componentconfig_GarbageCollector_To_v1alpha1_GarbageCollector(&in.GarbageCollector, &out.GarbageCollector, s); err != nil { + return err + } + if err := Convert_componentconfig_VirtualImageStorageClassSettings_To_v1alpha1_VirtualImageStorageClassSettings(&in.VirtualImageStorageClassSettings, &out.VirtualImageStorageClassSettings, s); err != nil { + return err + } + if err := Convert_componentconfig_VirtualDiskStorageClassSettings_To_v1alpha1_VirtualDiskStorageClassSettings(&in.VirtualDiskStorageClassSettings, &out.VirtualDiskStorageClassSettings, s); err != nil { + return err + } + if err := Convert_componentconfig_ImportSettings_To_v1alpha1_ImportSettings(&in.ImportSettings, &out.ImportSettings, s); err != nil { + return err + } + if err := Convert_componentconfig_DVCR_To_v1alpha1_DVCR(&in.DVCR, &out.DVCR, s); err != nil { + return err + } + if err := Convert_componentconfig_Ingress_To_v1alpha1_Ingress(&in.Ingress, &out.Ingress, s); err != nil { + return err + } + return nil +} + +// Convert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec is an autogenerated conversion function. +func Convert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec(in *componentconfig.VirtualizationControllerConfigurationSpec, out *VirtualizationControllerConfigurationSpec, s conversion.Scope) error { + return autoConvert_componentconfig_VirtualizationControllerConfigurationSpec_To_v1alpha1_VirtualizationControllerConfigurationSpec(in, out, s) +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 0000000000..0c9273b9b9 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,206 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BaseGCSettings) DeepCopyInto(out *BaseGCSettings) { + *out = *in + out.TTL = in.TTL + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaseGCSettings. +func (in *BaseGCSettings) DeepCopy() *BaseGCSettings { + if in == nil { + return nil + } + out := new(BaseGCSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DVCR) DeepCopyInto(out *DVCR) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DVCR. +func (in *DVCR) DeepCopy() *DVCR { + if in == nil { + return nil + } + out := new(DVCR) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GarbageCollector) DeepCopyInto(out *GarbageCollector) { + *out = *in + out.VMOP = in.VMOP + out.VMIMigration = in.VMIMigration + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GarbageCollector. +func (in *GarbageCollector) DeepCopy() *GarbageCollector { + if in == nil { + return nil + } + out := new(GarbageCollector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImportSettings) DeepCopyInto(out *ImportSettings) { + *out = *in + in.Requirements.DeepCopyInto(&out.Requirements) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImportSettings. +func (in *ImportSettings) DeepCopy() *ImportSettings { + if in == nil { + return nil + } + out := new(ImportSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Ingress) DeepCopyInto(out *Ingress) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. +func (in *Ingress) DeepCopy() *Ingress { + if in == nil { + return nil + } + out := new(Ingress) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualDiskStorageClassSettings) DeepCopyInto(out *VirtualDiskStorageClassSettings) { + *out = *in + if in.AllowedStorageClassNames != nil { + in, out := &in.AllowedStorageClassNames, &out.AllowedStorageClassNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualDiskStorageClassSettings. +func (in *VirtualDiskStorageClassSettings) DeepCopy() *VirtualDiskStorageClassSettings { + if in == nil { + return nil + } + out := new(VirtualDiskStorageClassSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualImageStorageClassSettings) DeepCopyInto(out *VirtualImageStorageClassSettings) { + *out = *in + if in.AllowedStorageClassNames != nil { + in, out := &in.AllowedStorageClassNames, &out.AllowedStorageClassNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualImageStorageClassSettings. +func (in *VirtualImageStorageClassSettings) DeepCopy() *VirtualImageStorageClassSettings { + if in == nil { + return nil + } + out := new(VirtualImageStorageClassSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualizationControllerConfiguration) DeepCopyInto(out *VirtualizationControllerConfiguration) { + *out = *in + out.TypeMeta = in.TypeMeta + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualizationControllerConfiguration. +func (in *VirtualizationControllerConfiguration) DeepCopy() *VirtualizationControllerConfiguration { + if in == nil { + return nil + } + out := new(VirtualizationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VirtualizationControllerConfiguration) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualizationControllerConfigurationSpec) DeepCopyInto(out *VirtualizationControllerConfigurationSpec) { + *out = *in + if in.VirtualMachineCIDRs != nil { + in, out := &in.VirtualMachineCIDRs, &out.VirtualMachineCIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.VirtualMachineIPLeasesRetentionDuration = in.VirtualMachineIPLeasesRetentionDuration + out.GarbageCollector = in.GarbageCollector + in.VirtualImageStorageClassSettings.DeepCopyInto(&out.VirtualImageStorageClassSettings) + in.VirtualDiskStorageClassSettings.DeepCopyInto(&out.VirtualDiskStorageClassSettings) + in.ImportSettings.DeepCopyInto(&out.ImportSettings) + out.DVCR = in.DVCR + out.Ingress = in.Ingress + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualizationControllerConfigurationSpec. +func (in *VirtualizationControllerConfigurationSpec) DeepCopy() *VirtualizationControllerConfigurationSpec { + if in == nil { + return nil + } + out := new(VirtualizationControllerConfigurationSpec) + in.DeepCopyInto(out) + return out +} diff --git a/images/virtualization-artifact/pkg/config/apis/componentconfig/zz_generated.deepcopy.go b/images/virtualization-artifact/pkg/config/apis/componentconfig/zz_generated.deepcopy.go new file mode 100644 index 0000000000..f5d864dd3d --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/componentconfig/zz_generated.deepcopy.go @@ -0,0 +1,206 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package componentconfig + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BaseGCSettings) DeepCopyInto(out *BaseGCSettings) { + *out = *in + out.TTL = in.TTL + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaseGCSettings. +func (in *BaseGCSettings) DeepCopy() *BaseGCSettings { + if in == nil { + return nil + } + out := new(BaseGCSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DVCR) DeepCopyInto(out *DVCR) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DVCR. +func (in *DVCR) DeepCopy() *DVCR { + if in == nil { + return nil + } + out := new(DVCR) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GarbageCollector) DeepCopyInto(out *GarbageCollector) { + *out = *in + out.VMOP = in.VMOP + out.VMIMigration = in.VMIMigration + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GarbageCollector. +func (in *GarbageCollector) DeepCopy() *GarbageCollector { + if in == nil { + return nil + } + out := new(GarbageCollector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImportSettings) DeepCopyInto(out *ImportSettings) { + *out = *in + in.Requirements.DeepCopyInto(&out.Requirements) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImportSettings. +func (in *ImportSettings) DeepCopy() *ImportSettings { + if in == nil { + return nil + } + out := new(ImportSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Ingress) DeepCopyInto(out *Ingress) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. +func (in *Ingress) DeepCopy() *Ingress { + if in == nil { + return nil + } + out := new(Ingress) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualDiskStorageClassSettings) DeepCopyInto(out *VirtualDiskStorageClassSettings) { + *out = *in + if in.AllowedStorageClassNames != nil { + in, out := &in.AllowedStorageClassNames, &out.AllowedStorageClassNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualDiskStorageClassSettings. +func (in *VirtualDiskStorageClassSettings) DeepCopy() *VirtualDiskStorageClassSettings { + if in == nil { + return nil + } + out := new(VirtualDiskStorageClassSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualImageStorageClassSettings) DeepCopyInto(out *VirtualImageStorageClassSettings) { + *out = *in + if in.AllowedStorageClassNames != nil { + in, out := &in.AllowedStorageClassNames, &out.AllowedStorageClassNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualImageStorageClassSettings. +func (in *VirtualImageStorageClassSettings) DeepCopy() *VirtualImageStorageClassSettings { + if in == nil { + return nil + } + out := new(VirtualImageStorageClassSettings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualizationControllerConfiguration) DeepCopyInto(out *VirtualizationControllerConfiguration) { + *out = *in + out.TypeMeta = in.TypeMeta + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualizationControllerConfiguration. +func (in *VirtualizationControllerConfiguration) DeepCopy() *VirtualizationControllerConfiguration { + if in == nil { + return nil + } + out := new(VirtualizationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VirtualizationControllerConfiguration) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualizationControllerConfigurationSpec) DeepCopyInto(out *VirtualizationControllerConfigurationSpec) { + *out = *in + if in.VirtualMachineCIDRs != nil { + in, out := &in.VirtualMachineCIDRs, &out.VirtualMachineCIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.VirtualMachineIPLeasesRetentionDuration = in.VirtualMachineIPLeasesRetentionDuration + out.GarbageCollector = in.GarbageCollector + in.VirtualImageStorageClassSettings.DeepCopyInto(&out.VirtualImageStorageClassSettings) + in.VirtualDiskStorageClassSettings.DeepCopyInto(&out.VirtualDiskStorageClassSettings) + in.ImportSettings.DeepCopyInto(&out.ImportSettings) + out.DVCR = in.DVCR + out.Ingress = in.Ingress + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualizationControllerConfigurationSpec. +func (in *VirtualizationControllerConfigurationSpec) DeepCopy() *VirtualizationControllerConfigurationSpec { + if in == nil { + return nil + } + out := new(VirtualizationControllerConfigurationSpec) + in.DeepCopyInto(out) + return out +} diff --git a/images/virtualization-artifact/pkg/config/apis/hack/boilerplate.go.txt b/images/virtualization-artifact/pkg/config/apis/hack/boilerplate.go.txt new file mode 100644 index 0000000000..b8911cc97b --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/hack/boilerplate.go.txt @@ -0,0 +1,15 @@ +/* +Copyright Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ diff --git a/images/virtualization-artifact/pkg/config/apis/hack/update-codegen.sh b/images/virtualization-artifact/pkg/config/apis/hack/update-codegen.sh new file mode 100755 index 0000000000..e4638be01e --- /dev/null +++ b/images/virtualization-artifact/pkg/config/apis/hack/update-codegen.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Copyright 2025 Flant JSC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)" +SCRIPT_ROOT="${SCRIPT_DIR}/.." +CODEGEN_PKG="$(go env GOMODCACHE)/$(go list -f '{{.Path}}@{{.Version}}' -m k8s.io/code-generator)" + +source "${CODEGEN_PKG}/kube_codegen.sh" + +kube::codegen::gen_helpers \ + --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \ + "${SCRIPT_ROOT}/componentconfig" diff --git a/images/virtualization-artifact/pkg/config/config.go b/images/virtualization-artifact/pkg/config/config.go new file mode 100644 index 0000000000..77a46c0568 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/config.go @@ -0,0 +1,176 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "fmt" + "os" + "time" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig/install" + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig/v1alpha1" + "github.com/deckhouse/virtualization-controller/pkg/dvcr" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" +) + +func Load(path string) (*componentconfig.VirtualizationControllerConfiguration, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + decodedConfig, err := decodeVirtualizationControllerConfiguration(data) + if err != nil { + return nil, err + } + return decodedConfig, nil + +} + +func decodeVirtualizationControllerConfiguration(configBytes []byte) (*componentconfig.VirtualizationControllerConfiguration, error) { + scheme := runtime.NewScheme() + install.Install(scheme) + codecs := serializer.NewCodecFactory(scheme) + + internalConfig := &componentconfig.VirtualizationControllerConfiguration{} + decoder := codecs.UniversalDecoder(v1alpha1.SchemeGroupVersion, componentconfig.SchemeGroupVersion) + if err := runtime.DecodeInto(decoder, configBytes, internalConfig); err != nil { + return nil, fmt.Errorf("failed to decode VirtualizationControllerConfiguration: %w", err) + } + + setVirtualizationControllerConfigurationSpecDefaults(&internalConfig.Spec) + + err := validateVirtualizationControllerConfigurationSpec(internalConfig.Spec) + if err != nil { + return nil, err + } + + return internalConfig, nil +} + +func setVirtualizationControllerConfigurationSpecDefaults(spec *componentconfig.VirtualizationControllerConfigurationSpec) { + if spec.VirtualMachineIPLeasesRetentionDuration.Duration == 0 { + spec.VirtualMachineIPLeasesRetentionDuration = metav1.Duration{Duration: 10 * time.Minute} + } + if spec.GarbageCollector.VMOP.TTL.Duration == 0 { + spec.GarbageCollector.VMOP.TTL.Duration = 24 * time.Hour + } + if spec.GarbageCollector.VMIMigration.TTL.Duration == 0 { + spec.GarbageCollector.VMIMigration.TTL.Duration = 24 * time.Hour + } + if spec.GarbageCollector.VMOP.Schedule == "" { + spec.GarbageCollector.VMOP.Schedule = "0 * * * *" + } + if spec.GarbageCollector.VMIMigration.Schedule == "" { + spec.GarbageCollector.VMIMigration.Schedule = "0 * * * *" + } + + if spec.ImportSettings.Requirements.Limits == nil && spec.ImportSettings.Requirements.Requests == nil { + spec.ImportSettings.Requirements.Limits = corev1.ResourceList{ + "cpu": resource.MustParse("750m"), + "memory": resource.MustParse("600Mi"), + } + spec.ImportSettings.Requirements.Requests = corev1.ResourceList{ + "cpu": resource.MustParse("100m"), + "memory": resource.MustParse("60Mi"), + } + } + + return +} + +func validateVirtualizationControllerConfigurationSpec(spec componentconfig.VirtualizationControllerConfigurationSpec) error { + if spec.Namespace == "" { + return fmt.Errorf("spec.namespace is required") + } + + if spec.FirmwareImage == "" { + return fmt.Errorf("spec.firmwareImage is required") + } + + if spec.VirtControllerName == "" { + return fmt.Errorf("spec.virtControllerName is required") + } + + if len(spec.VirtualMachineCIDRs) == 0 { + return fmt.Errorf("spec.virtualMachineCIDRs is required") + } + + if spec.ImportSettings.ImporterImage == "" { + return fmt.Errorf("spec.importSettings.importerImage is required") + } + + if spec.ImportSettings.UploaderImage == "" { + return fmt.Errorf("spec.importSettings.uploaderImage is required") + } + + if spec.ImportSettings.BounderImage == "" { + return fmt.Errorf("spec.importSettings.bounderImage is required") + } + + if spec.DVCR.AuthSecret == "" { + return fmt.Errorf("spec.dvcr.authSecret is required") + } + + if spec.Ingress.Host == "" { + return fmt.Errorf("spec.ingress.host is required") + } + + return nil +} + +func ToLegacyDVCR(config *componentconfig.VirtualizationControllerConfiguration) *dvcr.Settings { + insecureTLS := "false" + if config.Spec.DVCR.InsecureTLS { + insecureTLS = "true" + } + return &dvcr.Settings{ + AuthSecret: config.Spec.DVCR.AuthSecret, + AuthSecretNamespace: config.Spec.Namespace, + CertsSecret: config.Spec.DVCR.CertsSecret, + CertsSecretNamespace: config.Spec.Namespace, + RegistryURL: config.Spec.DVCR.RegistryURL, + InsecureTLS: insecureTLS, + UploaderIngressSettings: dvcr.UploaderIngressSettings{ + Host: config.Spec.Ingress.Host, + TLSSecret: config.Spec.Ingress.TLSSecret, + TLSSecretNamespace: config.Spec.Namespace, + Class: config.Spec.Ingress.Class, + }, + } +} + +func ToLegacyVirtualImageStorageClassSettings(config *componentconfig.VirtualizationControllerConfiguration) VirtualImageStorageClassSettings { + return VirtualImageStorageClassSettings{ + AllowedStorageClassNames: config.Spec.VirtualImageStorageClassSettings.AllowedStorageClassNames, + DefaultStorageClassName: config.Spec.VirtualImageStorageClassSettings.DefaultStorageClassName, + StorageClassName: config.Spec.VirtualImageStorageClassSettings.StorageClassName, + } +} + +func ToLegacyVirtualDiskStorageClassSettings(config *componentconfig.VirtualizationControllerConfiguration) VirtualDiskStorageClassSettings { + return VirtualDiskStorageClassSettings{ + AllowedStorageClassNames: config.Spec.VirtualDiskStorageClassSettings.AllowedStorageClassNames, + DefaultStorageClassName: config.Spec.VirtualDiskStorageClassSettings.DefaultStorageClassName, + } +} diff --git a/images/virtualization-artifact/pkg/config/config_test.go b/images/virtualization-artifact/pkg/config/config_test.go new file mode 100644 index 0000000000..e15e20c46e --- /dev/null +++ b/images/virtualization-artifact/pkg/config/config_test.go @@ -0,0 +1,76 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Config Suite") +} + +var _ = Describe("Config", func() { + var cfgRaw = []byte(`apiVersion: configuration.virtualization.deckhouse.io/v1alpha1 +kind: VirtualizationControllerConfiguration +spec: + namespace: d8-virtualization + virtControllerName: "virt-controller" + virtualMachineCIDRs: + - "10.66.10.0/24" + - "10.66.20.0/24" + - "10.66.30.0/24" + - "10.66.40.0/24" + virtualMachineIPLeasesRetentionDuration: 10m + firmwareImage: firmwareimage:latest + garbageCollector: + vmop: + ttl: 24h + schedule: "0 * * * *" + vmiMigration: + ttl: 24h + schedule: "0 * * * *" + importSettings: + importerImage: importerimage:latest + uploaderImage: uploaderimage:latest + bounderImage: bounderimage:latest + requirements: + limits: + cpu: 750m + memory: 600Mi + requests: + cpu: 100m + memory: 60Mi + dvcr: + authSecret: dvcr-dockercfg-rw + certsSecret: dvcr-tls + registryURL: "dvcr.d8-virtualization.svc" + insecureTLS: true + ingress: + host: virtualization.example.com + tlsSecret: ingress-tls + class: "nginx" +`) + It("Should decode config", func() { + _, err := decodeVirtualizationControllerConfiguration(cfgRaw) + Expect(err).NotTo(HaveOccurred()) + }) +}) diff --git a/images/virtualization-artifact/pkg/config/legacy.go b/images/virtualization-artifact/pkg/config/legacy.go new file mode 100644 index 0000000000..e3a5194793 --- /dev/null +++ b/images/virtualization-artifact/pkg/config/legacy.go @@ -0,0 +1,46 @@ +/* +Copyright 2025 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + corev1 "k8s.io/api/core/v1" + + "github.com/deckhouse/virtualization/api/core/v1alpha2" +) + +type ImportSettings struct { + ImporterImage string + UploaderImage string + BounderImage string + Requirements corev1.ResourceRequirements +} + +// TODO(future) live migration settings will be here. Now just a place for the default policy. +const ( + DefaultLiveMigrationPolicy = v1alpha2.PreferSafeMigrationPolicy +) + +type VirtualDiskStorageClassSettings struct { + AllowedStorageClassNames []string + DefaultStorageClassName string +} + +type VirtualImageStorageClassSettings struct { + AllowedStorageClassNames []string + DefaultStorageClassName string + StorageClassName string +} diff --git a/images/virtualization-artifact/pkg/config/load_dvcr_settings.go b/images/virtualization-artifact/pkg/config/load_dvcr_settings.go deleted file mode 100644 index 04f92818a0..0000000000 --- a/images/virtualization-artifact/pkg/config/load_dvcr_settings.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2024 Flant JSC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "fmt" - "os" - - "github.com/deckhouse/virtualization-controller/pkg/dvcr" -) - -const ( - // DVCRRegistryURLVar is an env variable holds address to DVCR registry. - DVCRRegistryURLVar = "DVCR_REGISTRY_URL" - // DVCRAuthSecretVar is an env variable holds the name of the Secret with DVCR auth credentials. - DVCRAuthSecretVar = "DVCR_AUTH_SECRET" - // DVCRAuthSecretNSVar is an env variable holds the namespace for the Secret with DVCR auth credentials. - DVCRAuthSecretNSVar = "DVCR_AUTH_SECRET_NAMESPACE" - // DVCRCertsSecretVar is an env variable holds the name of the Secret with DVCR certificates. - DVCRCertsSecretVar = "DVCR_CERTS_SECRET" - // DVCRCertsSecretNSVar is an env variable holds the namespace for the Secret with DVCR certificates. - DVCRCertsSecretNSVar = "DVCR_CERTS_SECRET_NAMESPACE" - // DVCRInsecureTLSVar is an env variable holds the flag whether DVCR is insecure. - DVCRInsecureTLSVar = "DVCR_INSECURE_TLS" - - // UploaderIngressHostVar is a env variable - UploaderIngressHostVar = "UPLOADER_INGRESS_HOST" - // UploaderIngressTLSSecretVar is a env variable - UploaderIngressTLSSecretVar = "UPLOADER_INGRESS_TLS_SECRET" - // UploaderIngressClassVar is a env variable - UploaderIngressClassVar = "UPLOADER_INGRESS_CLASS" - // UploaderIngressTLSSecretNS is a env variable - UploaderIngressTLSSecretNS = "UPLOADER_INGRESS_TLS_SECRET_NAMESPACE" -) - -func LoadDVCRSettingsFromEnvs(controllerNamespace string) (*dvcr.Settings, error) { - dvcrSettings := &dvcr.Settings{ - AuthSecret: os.Getenv(DVCRAuthSecretVar), - AuthSecretNamespace: os.Getenv(DVCRAuthSecretNSVar), - CertsSecret: os.Getenv(DVCRCertsSecretVar), - CertsSecretNamespace: os.Getenv(DVCRCertsSecretNSVar), - RegistryURL: os.Getenv(DVCRRegistryURLVar), - InsecureTLS: os.Getenv(DVCRInsecureTLSVar), - UploaderIngressSettings: dvcr.UploaderIngressSettings{ - Host: os.Getenv(UploaderIngressHostVar), - TLSSecret: os.Getenv(UploaderIngressTLSSecretVar), - TLSSecretNamespace: os.Getenv(UploaderIngressTLSSecretNS), - Class: os.Getenv(UploaderIngressClassVar), - }, - } - - if dvcrSettings.RegistryURL == "" { - return nil, fmt.Errorf("environment variable %q undefined, specify DVCR settings", DVCRRegistryURLVar) - } - if dvcrSettings.UploaderIngressSettings.Host == "" { - return nil, fmt.Errorf("environment variable %q undefined, specify DVCR settings", UploaderIngressHostVar) - } - if dvcrSettings.UploaderIngressSettings.TLSSecret == "" { - return nil, fmt.Errorf("environment variable %q undefined, specify DVCR settings", UploaderIngressTLSSecretVar) - } - if dvcrSettings.UploaderIngressSettings.Class == "" { - return nil, fmt.Errorf("environment variable %q undefined, specify DVCR settings", UploaderIngressClassVar) - } - - if dvcrSettings.AuthSecret != "" && dvcrSettings.AuthSecretNamespace == "" { - dvcrSettings.AuthSecretNamespace = controllerNamespace - } - - if dvcrSettings.CertsSecret != "" && dvcrSettings.CertsSecretNamespace == "" { - dvcrSettings.CertsSecretNamespace = controllerNamespace - } - - if dvcrSettings.UploaderIngressSettings.TLSSecret != "" && dvcrSettings.UploaderIngressSettings.TLSSecretNamespace == "" { - dvcrSettings.UploaderIngressSettings.TLSSecretNamespace = controllerNamespace - } - - return dvcrSettings, nil -} diff --git a/images/virtualization-artifact/pkg/config/load_gc_settings.go b/images/virtualization-artifact/pkg/config/load_gc_settings.go deleted file mode 100644 index 7cac99823f..0000000000 --- a/images/virtualization-artifact/pkg/config/load_gc_settings.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2024 Flant JSC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "fmt" - "os" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -const ( - GcVmopTTLVar = "GC_VMOP_TTL" - GcVmopScheduleVar = "GC_VMOP_SCHEDULE" - GcVMIMigrationTTLVar = "GC_VMI_MIGRATION_TTL" - GcVMIMigrationScheduleVar = "GC_VMI_MIGRATION_SCHEDULE" -) - -type GCSettings struct { - VMOP BaseGcSettings - VMIMigration BaseGcSettings -} - -type BaseGcSettings struct { - TTL metav1.Duration `json:"ttl,omitempty"` - Schedule string `json:"schedule"` -} - -func LoadGcSettings() (GCSettings, error) { - var gcSettings GCSettings - base, err := GetBaseGCSettingsFromEnv(GcVmopScheduleVar, GcVmopTTLVar) - if err != nil { - return gcSettings, err - } - gcSettings.VMOP = base - - base, err = GetBaseGCSettingsFromEnv(GcVMIMigrationScheduleVar, GcVMIMigrationTTLVar) - if err != nil { - return gcSettings, err - } - gcSettings.VMIMigration = base - - return gcSettings, nil -} - -func GetBaseGCSettingsFromEnv(envSchedule, envTTL string) (BaseGcSettings, error) { - base := NewDefaultBaseGcSettings() - if v, ok := os.LookupEnv(envSchedule); ok { - base.Schedule = v - } - if v, ok := os.LookupEnv(envTTL); ok { - t, err := time.ParseDuration(v) - if err != nil { - return BaseGcSettings{}, fmt.Errorf("invalid GC settings: %w", err) - } - if t == 0 { - return BaseGcSettings{}, fmt.Errorf("invalid GC settings: TTL cannot be 0: %w", err) - } - base.TTL = metav1.Duration{Duration: t} - } - return base, nil -} - -func NewDefaultBaseGcSettings() BaseGcSettings { - return BaseGcSettings{ - TTL: metav1.Duration{Duration: 24 * time.Hour * 7}, - Schedule: "0 0 * * *", - } -} diff --git a/images/virtualization-artifact/pkg/config/load_import_settings.go b/images/virtualization-artifact/pkg/config/load_import_settings.go deleted file mode 100644 index f05781ab2b..0000000000 --- a/images/virtualization-artifact/pkg/config/load_import_settings.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2024 Flant JSC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "encoding/json" - "fmt" - "os" - - corev1 "k8s.io/api/core/v1" - - "github.com/deckhouse/virtualization-controller/pkg/common" -) - -const ( - ProvisioningPodLimitsVar = "PROVISIONING_POD_LIMITS" - ProvisioningPodRequestsVar = "PROVISIONING_POD_REQUESTS" -) - -type ImportSettings struct { - ImporterImage string - UploaderImage string - BounderImage string - Requirements corev1.ResourceRequirements -} - -func LoadImportSettingsFromEnv() (ImportSettings, error) { - var settings ImportSettings - var err error - settings.ImporterImage, err = GetRequiredEnvVar(common.ImporterPodImageNameVar) - if err != nil { - return ImportSettings{}, err - } - - settings.UploaderImage, err = GetRequiredEnvVar(common.UploaderPodImageNameVar) - if err != nil { - return ImportSettings{}, err - } - - settings.BounderImage, err = GetRequiredEnvVar(common.BounderPodImageNameVar) - if err != nil { - return ImportSettings{}, err - } - - limits := os.Getenv(ProvisioningPodLimitsVar) - if limits != "" { - err = json.Unmarshal([]byte(limits), &settings.Requirements.Limits) - if err != nil { - return ImportSettings{}, err - } - } - requests := os.Getenv(ProvisioningPodRequestsVar) - if requests != "" { - err = json.Unmarshal([]byte(requests), &settings.Requirements.Requests) - if err != nil { - return ImportSettings{}, err - } - } - - return settings, nil -} - -func GetRequiredEnvVar(name string) (string, error) { - val := os.Getenv(name) - if val == "" { - return "", fmt.Errorf("environment variable %q undefined", name) - } - return val, nil -} diff --git a/images/virtualization-artifact/pkg/config/load_vd_storage_class_settings.go b/images/virtualization-artifact/pkg/config/load_vd_storage_class_settings.go deleted file mode 100644 index b6d7691956..0000000000 --- a/images/virtualization-artifact/pkg/config/load_vd_storage_class_settings.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2024 Flant JSC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "os" - "strings" -) - -const ( - // VirtualDiskDefaultStorageClass specifies the default storage class for virtual disks when none is specified. - VirtualDiskDefaultStorageClass = "VIRTUAL_DISK_DEFAULT_STORAGE_CLASS" - // VirtualDiskAllowedStorageClasses is a parameter that lists all allowed storage classes for virtual disks. - VirtualDiskAllowedStorageClasses = "VIRTUAL_DISK_ALLOWED_STORAGE_CLASSES" -) - -type VirtualDiskStorageClassSettings struct { - AllowedStorageClassNames []string - DefaultStorageClassName string -} - -func LoadVirtualDiskStorageClassSettings() VirtualDiskStorageClassSettings { - var allowedStorageClassNames []string - allowedStorageClassNamesRaw := os.Getenv(VirtualDiskAllowedStorageClasses) - if allowedStorageClassNamesRaw != "" { - allowedStorageClassNames = strings.Split(allowedStorageClassNamesRaw, ",") - } - - return VirtualDiskStorageClassSettings{ - AllowedStorageClassNames: allowedStorageClassNames, - DefaultStorageClassName: os.Getenv(VirtualDiskDefaultStorageClass), - } -} diff --git a/images/virtualization-artifact/pkg/config/load_vi_storage_class_settings.go b/images/virtualization-artifact/pkg/config/load_vi_storage_class_settings.go deleted file mode 100644 index d8fed5ea56..0000000000 --- a/images/virtualization-artifact/pkg/config/load_vi_storage_class_settings.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2024 Flant JSC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "os" - "strings" -) - -const ( - // VirtualImageStorageClass is a parameter for configuring the storage class for Virtual Image on PVC. - VirtualImageStorageClass = "VIRTUAL_IMAGE_STORAGE_CLASS" - // VirtualImageDefaultStorageClass specifies the default storage class for virtual images on PVC when none is specified. - VirtualImageDefaultStorageClass = "VIRTUAL_IMAGE_DEFAULT_STORAGE_CLASS" - // VirtualImageAllowedStorageClasses is a parameter that lists all allowed storage classes for virtual images on PVC. - VirtualImageAllowedStorageClasses = "VIRTUAL_IMAGE_ALLOWED_STORAGE_CLASSES" -) - -type VirtualImageStorageClassSettings struct { - AllowedStorageClassNames []string - DefaultStorageClassName string - StorageClassName string -} - -func LoadVirtualImageStorageClassSettings() VirtualImageStorageClassSettings { - var allowedStorageClassNames []string - allowedStorageClassNamesRaw := os.Getenv(VirtualImageAllowedStorageClasses) - if allowedStorageClassNamesRaw != "" { - allowedStorageClassNames = strings.Split(allowedStorageClassNamesRaw, ",") - } - - return VirtualImageStorageClassSettings{ - AllowedStorageClassNames: allowedStorageClassNames, - DefaultStorageClassName: os.Getenv(VirtualImageDefaultStorageClass), - StorageClassName: os.Getenv(VirtualImageStorageClass), - } -} diff --git a/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go b/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go index 5da3b27699..176ec88a27 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go +++ b/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go @@ -27,6 +27,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" + "github.com/deckhouse/virtualization-controller/pkg/controller/cvi/internal" "github.com/deckhouse/virtualization-controller/pkg/controller/cvi/internal/source" "github.com/deckhouse/virtualization-controller/pkg/controller/service" diff --git a/images/virtualization-artifact/pkg/controller/vm/gc.go b/images/virtualization-artifact/pkg/controller/vm/gc.go index 83c7872950..4140aabca8 100644 --- a/images/virtualization-artifact/pkg/controller/vm/gc.go +++ b/images/virtualization-artifact/pkg/controller/vm/gc.go @@ -24,22 +24,23 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/config" + + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/gc" ) -const gcVMMigrationControllerName = "vmi-migration-gc-controller" +const GCVMMigrationControllerName = "vmi-migration-gc-controller" func SetupGC( mgr manager.Manager, log *log.Logger, - gcSettings config.BaseGcSettings, + gcSettings componentconfig.BaseGCSettings, ) error { ttl := 24 * time.Hour if gcSettings.TTL.Duration > 0 { ttl = gcSettings.TTL.Duration } - return gc.SetupGcController(gcVMMigrationControllerName, + return gc.SetupGcController(GCVMMigrationControllerName, mgr, log, gc.NewCronSource(mgr.GetClient(), diff --git a/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go b/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go index 7df7e7f7e7..367612584c 100644 --- a/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go +++ b/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go @@ -18,15 +18,16 @@ package vmiplease import ( "context" - "fmt" "time" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" + "github.com/deckhouse/virtualization-controller/pkg/controller/vmiplease/internal" "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" @@ -41,18 +42,14 @@ func NewController( ctx context.Context, mgr manager.Manager, log *log.Logger, - retentionDurationStr string, + retentionDuration metav1.Duration, ) (controller.Controller, error) { recorder := eventrecord.NewEventRecorderLogger(mgr, ControllerName) - retentionDuration, err := time.ParseDuration(retentionDurationStr) - if err != nil { - return nil, fmt.Errorf("parse retention duration: %w", err) - } handlers := []Handler{ internal.NewLifecycleHandler(mgr.GetClient(), recorder), internal.NewProtectionHandler(), - internal.NewRetentionHandler(retentionDuration, mgr.GetClient()), + internal.NewRetentionHandler(retentionDuration.Duration, mgr.GetClient()), } r := NewReconciler(mgr.GetClient(), handlers...) diff --git a/images/virtualization-artifact/pkg/controller/vmop/gc.go b/images/virtualization-artifact/pkg/controller/vmop/gc.go index 97c41ed597..9eb9fec367 100644 --- a/images/virtualization-artifact/pkg/controller/vmop/gc.go +++ b/images/virtualization-artifact/pkg/controller/vmop/gc.go @@ -23,23 +23,24 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/config" + + "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/gc" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" ) -const gcControllerName = "vmop-gc-controller" +const GCControllerName = "vmop-gc-controller" func SetupGC( mgr manager.Manager, log *log.Logger, - gcSettings config.BaseGcSettings, + gcSettings componentconfig.BaseGCSettings, ) error { ttl := 24 * time.Hour if gcSettings.TTL.Duration > 0 { ttl = gcSettings.TTL.Duration } - return gc.SetupGcController(gcControllerName, + return gc.SetupGcController(GCControllerName, mgr, log, gc.NewCronSource(mgr.GetClient(), diff --git a/images/virtualization-artifact/pkg/migration/migration.go b/images/virtualization-artifact/pkg/migration/migration.go index 601acb1c90..3780a57949 100644 --- a/images/virtualization-artifact/pkg/migration/migration.go +++ b/images/virtualization-artifact/pkg/migration/migration.go @@ -24,6 +24,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/deckhouse/pkg/log" + "github.com/deckhouse/virtualization-controller/pkg/logger" ) diff --git a/templates/virtualization-controller/_helpers.tpl b/templates/virtualization-controller/_helpers.tpl index dcb7b8bdd4..030328073a 100644 --- a/templates/virtualization-controller/_helpers.tpl +++ b/templates/virtualization-controller/_helpers.tpl @@ -1,93 +1,4 @@ {{- define "virtualization-controller.envs" -}} -{{- $registry := include "dvcr.get_registry" (list .) }} -- name: LOG_LEVEL - value: {{ .Values.virtualization.logLevel }} -{{- if eq .Values.virtualization.logLevel "debug" }} -- name: LOG_DEBUG_VERBOSITY - value: "10" -{{- end }} -- name: LOG_FORMAT - value: {{ .Values.virtualization.logFormat }} -- name: FORCE_BRIDGE_NETWORK_BINDING - value: "1" - name: DISABLE_HYPERV_SYNIC value: "1" -- name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace -- name: IMPORTER_IMAGE - value: {{ include "helm_lib_module_image" (list . "dvcrImporter") }} -- name: UPLOADER_IMAGE - value: {{ include "helm_lib_module_image" (list . "dvcrUploader") }} -- name: BOUNDER_IMAGE - value: {{ include "helm_lib_module_image" (list . "bounder") }} -- name: DVCR_AUTH_SECRET - value: dvcr-dockercfg-rw -- name: DVCR_CERTS_SECRET - value: dvcr-tls -- name: DVCR_REGISTRY_URL - value: {{ $registry | quote }} -- name: DVCR_INSECURE_TLS - value: "true" -- name: VIRTUAL_MACHINE_CIDRS - value: {{ join "," .Values.virtualization.virtualMachineCIDRs | quote }} -{{- if (hasKey .Values.virtualization "virtualImages") }} -- name: VIRTUAL_IMAGE_STORAGE_CLASS - value: {{ .Values.virtualization.virtualImages.storageClassName }} -- name: VIRTUAL_IMAGE_DEFAULT_STORAGE_CLASS - value: {{ .Values.virtualization.virtualImages.defaultStorageClassName }} -{{- if (hasKey .Values.virtualization.virtualImages "allowedStorageClassSelector") }} -- name: VIRTUAL_IMAGE_ALLOWED_STORAGE_CLASSES - value: {{ join "," .Values.virtualization.virtualImages.allowedStorageClassSelector.matchNames | quote }} -{{- end }} -{{- end }} -{{- if (hasKey .Values.virtualization "virtualDisks") }} -- name: VIRTUAL_DISK_DEFAULT_STORAGE_CLASS - value: {{ .Values.virtualization.virtualDisks.defaultStorageClassName }} -{{- if (hasKey .Values.virtualization.virtualDisks "allowedStorageClassSelector") }} -- name: VIRTUAL_DISK_ALLOWED_STORAGE_CLASSES - value: {{ join "," .Values.virtualization.virtualDisks.allowedStorageClassSelector.matchNames | quote }} -{{- end }} -{{- end }} -- name: VIRTUAL_MACHINE_IP_LEASES_RETENTION_DURATION - value: "10m" -- name: UPLOADER_INGRESS_HOST - value: {{ include "helm_lib_module_public_domain" (list . "virtualization") }} -- name: UPLOADER_INGRESS_TLS_SECRET - value: {{ include "helm_lib_module_https_secret_name" (list . "ingress-tls") }} -- name: UPLOADER_INGRESS_CLASS - value: {{ include "helm_lib_module_ingress_class" . | quote }} -- name: PROVISIONING_POD_LIMITS - value: '{"cpu":"750m","memory":"600M"}' -- name: PROVISIONING_POD_REQUESTS - value: '{"cpu":"100m","memory":"60M"}' -- name: GC_VMOP_TTL - value: "24h" -- name: GC_VMOP_SCHEDULE - value: "0 * * * *" -- name: GC_VMI_MIGRATION_TTL - value: "24h" -- name: GC_VMI_MIGRATION_SCHEDULE - value: "0 * * * *" -{{- if (hasKey .Values.virtualization "liveMigration") }} -- name: LIVE_MIGRATION_BANDWIDTH_PER_NODE - value: {{ .Values.virtualization.liveMigration.bandwidthPerNode | quote }} -- name: LIVE_MIGRATION_MAX_MIGRATIONS_PER_NODE - value: {{ .Values.virtualization.liveMigration.maxMigrationsPerNode | quote }} -- name: LIVE_MIGRATION_NETWORK - value: {{ .Values.virtualization.liveMigration.network | quote }} -{{- if (hasKey .Values.virtualization.liveMigration "dedicated") }} -- name: LIVE_MIGRATION_DEDICATED_INTERFACE_NAME - value: {{ .Values.virtualization.liveMigration.dedicated.interfaceName | quote }} -{{- end }} -{{- end }} -- name: METRICS_BIND_ADDRESS - value: "127.0.0.1:8080" -{{- if eq .Values.virtualization.logLevel "debug" }} -- name: PPROF_BIND_ADDRESS - value: ":8081" -{{- end }} -- name: FIRMWARE_IMAGE - value: {{ include "helm_lib_module_image" (list . "virtLauncher") }} {{- end }} diff --git a/templates/virtualization-controller/config.yaml b/templates/virtualization-controller/config.yaml new file mode 100644 index 0000000000..5db63e3ff8 --- /dev/null +++ b/templates/virtualization-controller/config.yaml @@ -0,0 +1,69 @@ +{{- $registry := include "dvcr.get_registry" (list .) }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: virtualization-controller-config + namespace: d8-{{ .Chart.Name }} +data: + config.yaml: | + apiVersion: configuration.virtualization.deckhouse.io/v1alpha1 + kind: VirtualizationControllerConfiguration + spec: + namespace: d8-{{ .Chart.Name }} + virtControllerName: "virt-controller" + virtualMachineCIDRs: + {{- range .Values.virtualization.virtualMachineCIDRs }} + - {{ . | quote }} + {{- end }} + virtualMachineIPLeasesRetentionDuration: 10m + firmwareImage: {{ include "helm_lib_module_image" (list . "virtLauncher") }} + garbageCollector: + vmop: + ttl: 24h + schedule: "0 * * * *" + vmiMigration: + ttl: 24h + schedule: "0 * * * *" + {{- if (hasKey .Values.virtualization "virtualImages") }} + virtualImageStorageClassSettings: + storageClassName: {{ .Values.virtualization.virtualImages.storageClassName }} + defaultStorageClassName: {{ .Values.virtualization.virtualImages.defaultStorageClassName }} + {{- if (hasKey .Values.virtualization.virtualImages "allowedStorageClassSelector") }} + allowedStorageClassNames: + {{- range .Values.virtualization.virtualImages.allowedStorageClassSelector.matchNames }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- if (hasKey .Values.virtualization "virtualDisks") }} + virtualDiskStorageClassSettings: + defaultStorageClassName: {{ .Values.virtualization.virtualDisks.defaultStorageClassName }} + {{- if (hasKey .Values.virtualization.virtualDisks "allowedStorageClassSelector") }} + allowedStorageClassNames: + {{- range .Values.virtualization.virtualDisks.allowedStorageClassSelector.matchNames }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + importSettings: + importerImage: {{ include "helm_lib_module_image" (list . "dvcrImporter") }} + uploaderImage: {{ include "helm_lib_module_image" (list . "dvcrUploader") }} + bounderImage: {{ include "helm_lib_module_image" (list . "bounder") }} + requirements: + limits: + cpu: 750m + memory: 600Mi + requests: + cpu: 100m + memory: 60Mi + dvcr: + authSecret: dvcr-dockercfg-rw + certsSecret: dvcr-tls + registryURL: {{ $registry | quote }} + insecureTLS: true + ingress: + host: {{ include "helm_lib_module_public_domain" (list . "virtualization") }} + tlsSecret: {{ include "helm_lib_module_https_secret_name" (list . "ingress-tls") }} + class: {{ include "helm_lib_module_ingress_class" . | quote }} + diff --git a/templates/virtualization-controller/deployment.yaml b/templates/virtualization-controller/deployment.yaml index b491c93215..3f3af4d0b8 100644 --- a/templates/virtualization-controller/deployment.yaml +++ b/templates/virtualization-controller/deployment.yaml @@ -69,6 +69,7 @@ spec: app: virtualization-controller annotations: checksum/secret: {{ include (print $.Template.BasePath "/virtualization-controller/secret-tls.yaml") . | sha256sum }} + checksum/config: {{ include (print $.Template.BasePath "/virtualization-controller/config.yaml") . | sha256sum }} kubectl.kubernetes.io/default-container: virtualization-controller spec: {{ include "helm_lib_pod_anti_affinity_for_ha" (list . (dict "app" "virtualization-controller")) | nindent 6 }} @@ -78,9 +79,22 @@ spec: {{- include "helm_lib_module_container_security_context_read_only_root_filesystem" . | nindent 10 }} image: {{ include "helm_lib_module_image" (list . "virtualizationController") }} imagePullPolicy: IfNotPresent + args: + - --config=/etc/virtualization-controller/config.yaml + - --log-format={{ .Values.virtualization.logFormat | default "json" }} + - --log-level={{ .Values.virtualization.logLevel | default "info" }} + - --metrics-bind-address=127.0.0.1:8080 + {{- if eq .Values.virtualization.logLevel "debug" }} + - --log-debug-verbosity=10 + {{- end }} + {{- if eq .Values.virtualization.logLevel "debug" }} + - --pprof-bind-address=:8081 + {{- end }} volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: admission-webhook-secret + - mountPath: /etc/virtualization-controller + name: virtualization-controller-config {{- include "kube_api_rewriter.kubeconfig_volume_mount" . | nindent 12 }} ports: - containerPort: 9443 @@ -119,4 +133,7 @@ spec: secret: secretName: virtualization-controller-tls {{- include "kube_api_rewriter.kubeconfig_volume" . | nindent 8 }} + - name: virtualization-controller-config + configMap: + name: virtualization-controller-config From 479c39d13966c7dc4cb0b6464b477e1c88a67cce Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Wed, 2 Jul 2025 17:47:29 +0300 Subject: [PATCH 2/6] refactor Signed-off-by: Yaroslav Borbat --- .../cmd/virtualization-controller/app/app.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/app.go b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go index 980c8e58f7..1cda8075c9 100644 --- a/images/virtualization-artifact/cmd/virtualization-controller/app/app.go +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go @@ -49,7 +49,7 @@ func NewVirtualizationControllerCommand() *cobra.Command { Args: cobra.NoArgs, SilenceErrors: true, SilenceUsage: true, - RunE: opts.run, + RunE: opts.Run, } opts.AddFlags(cmd.Flags()) @@ -80,7 +80,7 @@ func (o *options) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&o.LeaderElection, "leader-election", true, "enable leader election") } -func (o *options) run(cmd *cobra.Command, _ []string) error { +func (o *options) Run(cmd *cobra.Command, _ []string) error { log := logger.NewLogger(o.LogLevel, o.LogOutput, o.LogDebugVerbosity) logger.SetDefaultLogger(log) From eae62a24028c7006a9e0723d120a4de097f9ac92 Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Wed, 2 Jul 2025 18:42:28 +0300 Subject: [PATCH 3/6] refactor Signed-off-by: Yaroslav Borbat --- .../cmd/virtualization-controller/app/app.go | 9 +++-- .../app/controller.go | 33 ++++++++++--------- .../pkg/config/config.go | 8 ++--- .../pkg/config/config_test.go | 2 +- .../pkg/controller/cvi/cvi_controller.go | 1 - .../pkg/controller/vm/gc.go | 1 - .../vmiplease/vmiplease_controller.go | 1 - .../pkg/controller/vmop/gc.go | 1 - .../pkg/migration/migration.go | 1 - 9 files changed, 24 insertions(+), 33 deletions(-) diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/app.go b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go index 1cda8075c9..7e4fc19849 100644 --- a/images/virtualization-artifact/cmd/virtualization-controller/app/app.go +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/app.go @@ -20,17 +20,16 @@ import ( "fmt" "runtime" - deckhouselog "github.com/deckhouse/deckhouse/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - "github.com/spf13/cobra" "github.com/spf13/pflag" apiruntime "k8s.io/apimachinery/pkg/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/manager" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + deckhouselog "github.com/deckhouse/deckhouse/pkg/log" virtualizationconfig "github.com/deckhouse/virtualization-controller/pkg/config" "github.com/deckhouse/virtualization-controller/pkg/controller/indexer" mc "github.com/deckhouse/virtualization-controller/pkg/controller/moduleconfig" diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go index e29af39bb4..adf2c9f207 100644 --- a/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go @@ -19,9 +19,10 @@ package app import ( "context" - "github.com/deckhouse/deckhouse/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" + "github.com/deckhouse/deckhouse/pkg/log" + "github.com/deckhouse/virtualization-controller/pkg/config" "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/cvi" @@ -49,7 +50,7 @@ var controllers = map[string]func( configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client, ) error{ - cvi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + cvi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { _, err := cvi.NewController(ctx, mgr, log, @@ -60,7 +61,7 @@ var controllers = map[string]func( configuration.Spec.Namespace) return err }, - vd.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vd.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { _, err := vd.NewController( ctx, mgr, @@ -72,7 +73,7 @@ var controllers = map[string]func( config.ToLegacyVirtualDiskStorageClassSettings(configuration)) return err }, - vi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vi.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { _, err := vi.NewController( ctx, mgr, @@ -85,7 +86,7 @@ var controllers = map[string]func( config.ToLegacyVirtualImageStorageClassSettings(configuration)) return err }, - vm.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vm.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return vm.SetupController( ctx, mgr, @@ -93,7 +94,7 @@ var controllers = map[string]func( config.ToLegacyDVCR(configuration), configuration.Spec.FirmwareImage) }, - vm.GCVMMigrationControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vm.GCVMMigrationControllerName: func(_ context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return vm.SetupGC(mgr, log, configuration.Spec.GarbageCollector.VMIMigration) }, vmbda.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { @@ -104,37 +105,37 @@ var controllers = map[string]func( _, err := vmip.NewController(ctx, mgr, virtualizationClient, log, configuration.Spec.VirtualMachineCIDRs) return err }, - vmiplease.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmiplease.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { _, err := vmiplease.NewController(ctx, mgr, log, configuration.Spec.VirtualMachineIPLeasesRetentionDuration) return err }, - vmclass.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmclass.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { _, err := vmclass.NewController(ctx, mgr, configuration.Spec.Namespace, log) return err }, - vdsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vdsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { _, err := vdsnapshot.NewController(ctx, mgr, log, virtualizationClient) return err }, - vmsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmsnapshot.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { return vmsnapshot.NewController(ctx, mgr, log, virtualizationClient) }, - vmrestore.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmrestore.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return vmrestore.NewController(ctx, mgr, log) }, - vmop.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmop.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return vmop.SetupController(ctx, mgr, log) }, - vmop.GCControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + vmop.GCControllerName: func(_ context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return vmop.SetupGC(mgr, log, configuration.Spec.GarbageCollector.VMOP) }, - livemigration.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + livemigration.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return livemigration.SetupController(ctx, mgr, log) }, - workloadupdater.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + workloadupdater.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, _ kubeclient.Client) error { return workloadupdater.SetupController(ctx, mgr, log, configuration.Spec.FirmwareImage, configuration.Spec.Namespace, configuration.Spec.VirtControllerName) }, - evacuation.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, configuration *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { + evacuation.ControllerName: func(ctx context.Context, mgr manager.Manager, log *log.Logger, _ *componentconfig.VirtualizationControllerConfiguration, virtualizationClient kubeclient.Client) error { return evacuation.SetupController(ctx, mgr, virtualizationClient, log) }, } diff --git a/images/virtualization-artifact/pkg/config/config.go b/images/virtualization-artifact/pkg/config/config.go index 77a46c0568..9c01231502 100644 --- a/images/virtualization-artifact/pkg/config/config.go +++ b/images/virtualization-artifact/pkg/config/config.go @@ -24,14 +24,13 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig/install" "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig/v1alpha1" "github.com/deckhouse/virtualization-controller/pkg/dvcr" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" ) func Load(path string) (*componentconfig.VirtualizationControllerConfiguration, error) { @@ -44,7 +43,6 @@ func Load(path string) (*componentconfig.VirtualizationControllerConfiguration, return nil, err } return decodedConfig, nil - } func decodeVirtualizationControllerConfiguration(configBytes []byte) (*componentconfig.VirtualizationControllerConfiguration, error) { @@ -95,8 +93,6 @@ func setVirtualizationControllerConfigurationSpecDefaults(spec *componentconfig. "memory": resource.MustParse("60Mi"), } } - - return } func validateVirtualizationControllerConfigurationSpec(spec componentconfig.VirtualizationControllerConfigurationSpec) error { diff --git a/images/virtualization-artifact/pkg/config/config_test.go b/images/virtualization-artifact/pkg/config/config_test.go index e15e20c46e..fbac0c89ed 100644 --- a/images/virtualization-artifact/pkg/config/config_test.go +++ b/images/virtualization-artifact/pkg/config/config_test.go @@ -29,7 +29,7 @@ func TestConfig(t *testing.T) { } var _ = Describe("Config", func() { - var cfgRaw = []byte(`apiVersion: configuration.virtualization.deckhouse.io/v1alpha1 + cfgRaw := []byte(`apiVersion: configuration.virtualization.deckhouse.io/v1alpha1 kind: VirtualizationControllerConfiguration spec: namespace: d8-virtualization diff --git a/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go b/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go index 176ec88a27..5da3b27699 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go +++ b/images/virtualization-artifact/pkg/controller/cvi/cvi_controller.go @@ -27,7 +27,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/controller/cvi/internal" "github.com/deckhouse/virtualization-controller/pkg/controller/cvi/internal/source" "github.com/deckhouse/virtualization-controller/pkg/controller/service" diff --git a/images/virtualization-artifact/pkg/controller/vm/gc.go b/images/virtualization-artifact/pkg/controller/vm/gc.go index 4140aabca8..6af5fc8e7b 100644 --- a/images/virtualization-artifact/pkg/controller/vm/gc.go +++ b/images/virtualization-artifact/pkg/controller/vm/gc.go @@ -24,7 +24,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/gc" ) diff --git a/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go b/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go index 367612584c..0239fd0656 100644 --- a/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go +++ b/images/virtualization-artifact/pkg/controller/vmiplease/vmiplease_controller.go @@ -27,7 +27,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/controller/vmiplease/internal" "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" diff --git a/images/virtualization-artifact/pkg/controller/vmop/gc.go b/images/virtualization-artifact/pkg/controller/vmop/gc.go index 9eb9fec367..611aef2bff 100644 --- a/images/virtualization-artifact/pkg/controller/vmop/gc.go +++ b/images/virtualization-artifact/pkg/controller/vmop/gc.go @@ -23,7 +23,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/gc" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" diff --git a/images/virtualization-artifact/pkg/migration/migration.go b/images/virtualization-artifact/pkg/migration/migration.go index 3780a57949..601acb1c90 100644 --- a/images/virtualization-artifact/pkg/migration/migration.go +++ b/images/virtualization-artifact/pkg/migration/migration.go @@ -24,7 +24,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/logger" ) From 32b07b9bdb01e2a49015029cebf9f132e6f80083 Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Wed, 2 Jul 2025 18:52:33 +0300 Subject: [PATCH 4/6] refactor Signed-off-by: Yaroslav Borbat --- .../cmd/virtualization-controller/app/controller.go | 1 - 1 file changed, 1 deletion(-) diff --git a/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go index adf2c9f207..0e1e733676 100644 --- a/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go +++ b/images/virtualization-artifact/cmd/virtualization-controller/app/controller.go @@ -22,7 +22,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/deckhouse/virtualization-controller/pkg/config" "github.com/deckhouse/virtualization-controller/pkg/config/apis/componentconfig" "github.com/deckhouse/virtualization-controller/pkg/controller/cvi" From a5ee4558160c9712350b45acb9be02e0ff9f9ef2 Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Thu, 3 Jul 2025 11:28:05 +0300 Subject: [PATCH 5/6] refactor Signed-off-by: Yaroslav Borbat --- openapi/config-values.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openapi/config-values.yaml b/openapi/config-values.yaml index bfe927b4d3..1f5c272c35 100644 --- a/openapi/config-values.yaml +++ b/openapi/config-values.yaml @@ -214,6 +214,7 @@ properties: items: type: string x-examples: ["sc-1", "sc-2"] + x-dmt-default: ["sc-1", "sc-2"] virtualDisks: type: object description: | @@ -233,6 +234,7 @@ properties: items: type: string x-examples: ["sc-1", "sc-2"] + x-dmt-default: ["sc-1", "sc-2"] logLevel: type: string description: | From b9d2e1132bd4a25bcdb2b9cf71bd9c5e580aaa53 Mon Sep 17 00:00:00 2001 From: Yaroslav Borbat Date: Thu, 3 Jul 2025 11:29:29 +0300 Subject: [PATCH 6/6] refactor Signed-off-by: Yaroslav Borbat --- templates/virtualization-controller/config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/virtualization-controller/config.yaml b/templates/virtualization-controller/config.yaml index 5db63e3ff8..ba5516a42b 100644 --- a/templates/virtualization-controller/config.yaml +++ b/templates/virtualization-controller/config.yaml @@ -5,6 +5,7 @@ kind: ConfigMap metadata: name: virtualization-controller-config namespace: d8-{{ .Chart.Name }} + {{- include "helm_lib_module_labels" (list . (dict "app" "virtualization-controller")) | nindent 2 }} data: config.yaml: | apiVersion: configuration.virtualization.deckhouse.io/v1alpha1