diff --git a/pkg/cmd/cli/nodeagent/server.go b/pkg/cmd/cli/nodeagent/server.go index dbd471eb8..6bcebbcfb 100644 --- a/pkg/cmd/cli/nodeagent/server.go +++ b/pkg/cmd/cli/nodeagent/server.go @@ -60,6 +60,7 @@ import ( "github.com/vmware-tanzu/velero/pkg/exposer" "github.com/vmware-tanzu/velero/pkg/metrics" "github.com/vmware-tanzu/velero/pkg/nodeagent" + repository "github.com/vmware-tanzu/velero/pkg/repository/manager" velerotypes "github.com/vmware-tanzu/velero/pkg/types" "github.com/vmware-tanzu/velero/pkg/util/filesystem" "github.com/vmware-tanzu/velero/pkg/util/kube" @@ -144,6 +145,7 @@ type nodeAgentServer struct { dataPathConfigs *velerotypes.NodeAgentConfigs backupRepoConfigs map[string]string vgdpCounter *exposer.VgdpCounter + repoConfigMgr repository.ConfigManager } func newNodeAgentServer(logger logrus.FieldLogger, factory client.Factory, config nodeAgentServerConfig) (*nodeAgentServer, error) { @@ -237,6 +239,7 @@ func newNodeAgentServer(logger logrus.FieldLogger, factory client.Factory, confi namespace: factory.Namespace(), nodeName: nodeName, metricsAddress: config.metricsAddress, + repoConfigMgr: repository.NewConfigManager(logger), } // the cache isn't initialized yet when "validatePodVolumesHostPath" is called, the client returned by the manager cannot @@ -386,6 +389,12 @@ func (s *nodeAgentServer) run() { s.logger.Infof("Using customized restorePVC config %v", restorePVCConfig) } + var cachePVCConfig *velerotypes.CachePVC + if s.dataPathConfigs != nil && s.dataPathConfigs.CachePVCConfig != nil { + cachePVCConfig = s.dataPathConfigs.CachePVCConfig + s.logger.Infof("Using customized cachePVC config %v", cachePVCConfig) + } + dataDownloadReconciler := controller.NewDataDownloadReconciler( s.mgr.GetClient(), s.mgr, @@ -394,12 +403,15 @@ func (s *nodeAgentServer) run() { s.vgdpCounter, loadAffinity, restorePVCConfig, + s.backupRepoConfigs, + cachePVCConfig, podResources, s.nodeName, s.config.dataMoverPrepareTimeout, s.logger, s.metrics, dataMovePriorityClass, + s.repoConfigMgr, ) if err := dataDownloadReconciler.SetupWithManager(s.mgr); err != nil { diff --git a/pkg/controller/data_download_controller.go b/pkg/controller/data_download_controller.go index 23328d387..b3f2044d9 100644 --- a/pkg/controller/data_download_controller.go +++ b/pkg/controller/data_download_controller.go @@ -49,6 +49,7 @@ import ( "github.com/vmware-tanzu/velero/pkg/exposer" "github.com/vmware-tanzu/velero/pkg/metrics" "github.com/vmware-tanzu/velero/pkg/nodeagent" + repository "github.com/vmware-tanzu/velero/pkg/repository/manager" velerotypes "github.com/vmware-tanzu/velero/pkg/types" "github.com/vmware-tanzu/velero/pkg/uploader" "github.com/vmware-tanzu/velero/pkg/util" @@ -68,11 +69,14 @@ type DataDownloadReconciler struct { vgdpCounter *exposer.VgdpCounter loadAffinity []*kube.LoadAffinity restorePVCConfig velerotypes.RestorePVC + backupRepoConfigs map[string]string + cacheVolumeConfigs *velerotypes.CachePVC podResources corev1api.ResourceRequirements preparingTimeout time.Duration metrics *metrics.ServerMetrics cancelledDataDownload map[string]time.Time dataMovePriorityClass string + repoConfigMgr repository.ConfigManager } func NewDataDownloadReconciler( @@ -83,12 +87,15 @@ func NewDataDownloadReconciler( counter *exposer.VgdpCounter, loadAffinity []*kube.LoadAffinity, restorePVCConfig velerotypes.RestorePVC, + backupRepoConfigs map[string]string, + cacheVolumeConfigs *velerotypes.CachePVC, podResources corev1api.ResourceRequirements, nodeName string, preparingTimeout time.Duration, logger logrus.FieldLogger, metrics *metrics.ServerMetrics, dataMovePriorityClass string, + repoConfigMgr repository.ConfigManager, ) *DataDownloadReconciler { return &DataDownloadReconciler{ client: client, @@ -99,6 +106,8 @@ func NewDataDownloadReconciler( nodeName: nodeName, restoreExposer: exposer.NewGenericRestoreExposer(kubeClient, logger), restorePVCConfig: restorePVCConfig, + backupRepoConfigs: backupRepoConfigs, + cacheVolumeConfigs: cacheVolumeConfigs, dataPathMgr: dataPathMgr, vgdpCounter: counter, loadAffinity: loadAffinity, @@ -107,6 +116,7 @@ func NewDataDownloadReconciler( metrics: metrics, cancelledDataDownload: make(map[string]time.Time), dataMovePriorityClass: dataMovePriorityClass, + repoConfigMgr: repoConfigMgr, } } @@ -882,6 +892,19 @@ func (r *DataDownloadReconciler) setupExposeParam(dd *velerov2alpha1api.DataDown } } + var cacheVolume *exposer.CacheConfigs + if r.cacheVolumeConfigs != nil { + if limit, err := r.repoConfigMgr.ClientSideCacheLimit(velerov1api.BackupRepositoryTypeKopia, r.backupRepoConfigs); err != nil { + log.WithError(err).Warnf("Failed to get client side cache limit for repo type %s from configs %v", velerov1api.BackupRepositoryTypeKopia, r.backupRepoConfigs) + } else { + cacheVolume = &exposer.CacheConfigs{ + Limit: limit, + StorageClass: r.cacheVolumeConfigs.StorageClass, + ResidentThreshold: r.cacheVolumeConfigs.ResidentThreshold, + } + } + } + return exposer.GenericRestoreExposeParam{ TargetPVCName: dd.Spec.TargetVolume.PVC, TargetNamespace: dd.Spec.TargetVolume.Namespace, @@ -895,6 +918,8 @@ func (r *DataDownloadReconciler) setupExposeParam(dd *velerov2alpha1api.DataDown RestorePVCConfig: r.restorePVCConfig, LoadAffinity: r.loadAffinity, PriorityClassName: r.dataMovePriorityClass, + RestoreSize: dd.Spec.SnapshotSize, + CacheVolume: cacheVolume, }, nil } diff --git a/pkg/controller/data_download_controller_test.go b/pkg/controller/data_download_controller_test.go index d260056e6..3b5f1002a 100644 --- a/pkg/controller/data_download_controller_test.go +++ b/pkg/controller/data_download_controller_test.go @@ -129,7 +129,7 @@ func initDataDownloadReconcilerWithError(t *testing.T, objects []any, needError dataPathMgr := datapath.NewManager(1) - return NewDataDownloadReconciler(&fakeClient, nil, fakeKubeClient, dataPathMgr, nil, nil, velerotypes.RestorePVC{}, corev1api.ResourceRequirements{}, "test-node", time.Minute*5, velerotest.NewLogger(), metrics.NewServerMetrics(), ""), nil + return NewDataDownloadReconciler(&fakeClient, nil, fakeKubeClient, dataPathMgr, nil, nil, velerotypes.RestorePVC{}, nil, nil, corev1api.ResourceRequirements{}, "test-node", time.Minute*5, velerotest.NewLogger(), metrics.NewServerMetrics(), "", nil), nil } func TestDataDownloadReconcile(t *testing.T) {