From cfc12dc6bf277861a859ff249dbc91aa145adc7e Mon Sep 17 00:00:00 2001 From: Scott Seago Date: Thu, 7 Aug 2025 16:26:33 -0400 Subject: [PATCH] feat: Add install arg and config for concurrent backups Co-authored-by: aider (gemini/gemini-2.5-pro) Signed-off-by: Scott Seago --- pkg/cmd/cli/install/install.go | 8 ++++++++ pkg/cmd/server/config/config.go | 9 +++++++++ pkg/install/deployment.go | 11 +++++++++++ pkg/install/resources.go | 2 ++ 4 files changed, 30 insertions(+) diff --git a/pkg/cmd/cli/install/install.go b/pkg/cmd/cli/install/install.go index 6698010bd..283bfa557 100644 --- a/pkg/cmd/cli/install/install.go +++ b/pkg/cmd/cli/install/install.go @@ -89,6 +89,7 @@ type Options struct { RepoMaintenanceJobConfigMap string NodeAgentConfigMap string ItemBlockWorkerCount int + ConcurrentBackups int NodeAgentDisableHostPath bool kubeletRootDir string ServerPriorityClassName string @@ -196,6 +197,12 @@ func (o *Options) BindFlags(flags *pflag.FlagSet) { o.ItemBlockWorkerCount, "Number of worker threads to process ItemBlocks. Default is one. Optional.", ) + flags.IntVar( + &o.ConcurrentBackups, + "concurrent-backups", + o.ConcurrentBackups, + "Number of backups to process concurrently. Default is one. Optional.", + ) flags.StringVar( &o.ServerPriorityClassName, "server-priority-class-name", @@ -313,6 +320,7 @@ func (o *Options) AsVeleroOptions() (*install.VeleroOptions, error) { RepoMaintenanceJobConfigMap: o.RepoMaintenanceJobConfigMap, NodeAgentConfigMap: o.NodeAgentConfigMap, ItemBlockWorkerCount: o.ItemBlockWorkerCount, + ConcurrentBackups: o.ConcurrentBackups, KubeletRootDir: o.kubeletRootDir, NodeAgentDisableHostPath: o.NodeAgentDisableHostPath, ServerPriorityClassName: o.ServerPriorityClassName, diff --git a/pkg/cmd/server/config/config.go b/pkg/cmd/server/config/config.go index 401a89632..ba1b9f3bf 100644 --- a/pkg/cmd/server/config/config.go +++ b/pkg/cmd/server/config/config.go @@ -47,6 +47,7 @@ const ( defaultDisableInformerCache = false DefaultItemBlockWorkerCount = 1 + DefaultConcurrentBackups = 1 ) var ( @@ -174,6 +175,7 @@ type Config struct { BackupRepoConfig string RepoMaintenanceJobConfig string ItemBlockWorkerCount int + ConcurrentBackups int } func GetDefaultConfig() *Config { @@ -206,6 +208,7 @@ func GetDefaultConfig() *Config { ScheduleSkipImmediately: false, CredentialsDirectory: credentials.DefaultStoreDirectory(), ItemBlockWorkerCount: DefaultItemBlockWorkerCount, + ConcurrentBackups: DefaultConcurrentBackups, } return config @@ -261,4 +264,10 @@ func (c *Config) BindFlags(flags *pflag.FlagSet) { c.ItemBlockWorkerCount, "Number of worker threads to process ItemBlocks. Default is one. Optional.", ) + flags.IntVar( + &c.ConcurrentBackups, + "concurrent-backups", + c.ConcurrentBackups, + "Number of backups to process concurrently. Default is one. Optional.", + ) } diff --git a/pkg/install/deployment.go b/pkg/install/deployment.go index 91acce344..d1010d294 100644 --- a/pkg/install/deployment.go +++ b/pkg/install/deployment.go @@ -59,6 +59,7 @@ type podTemplateConfig struct { repoMaintenanceJobConfigMap string nodeAgentConfigMap string itemBlockWorkerCount int + concurrentBackups int forWindows bool kubeletRootDir string nodeAgentDisableHostPath bool @@ -224,6 +225,12 @@ func WithItemBlockWorkerCount(itemBlockWorkerCount int) podTemplateOption { } } +func WithConcurrentBackups(concurrentBackups int) podTemplateOption { + return func(c *podTemplateConfig) { + c.concurrentBackups = concurrentBackups + } +} + func WithPriorityClassName(priorityClassName string) podTemplateOption { return func(c *podTemplateConfig) { c.priorityClassName = priorityClassName @@ -337,6 +344,10 @@ func Deployment(namespace string, opts ...podTemplateOption) *appsv1api.Deployme args = append(args, fmt.Sprintf("--item-block-worker-count=%d", c.itemBlockWorkerCount)) } + if c.concurrentBackups > 0 { + args = append(args, fmt.Sprintf("--concurrent-backups=%d", c.concurrentBackups)) + } + deployment := &appsv1api.Deployment{ ObjectMeta: objectMeta(namespace, "velero"), TypeMeta: metav1.TypeMeta{ diff --git a/pkg/install/resources.go b/pkg/install/resources.go index 1d0ffa568..5c7534774 100644 --- a/pkg/install/resources.go +++ b/pkg/install/resources.go @@ -271,6 +271,7 @@ type VeleroOptions struct { RepoMaintenanceJobConfigMap string NodeAgentConfigMap string ItemBlockWorkerCount int + ConcurrentBackups int KubeletRootDir string NodeAgentDisableHostPath bool ServerPriorityClassName string @@ -362,6 +363,7 @@ func AllResources(o *VeleroOptions) *unstructured.UnstructuredList { WithPodResources(o.PodResources), WithKeepLatestMaintenanceJobs(o.KeepLatestMaintenanceJobs), WithItemBlockWorkerCount(o.ItemBlockWorkerCount), + WithConcurrentBackups(o.ConcurrentBackups), } if o.ServerPriorityClassName != "" {