Replace NewObjectBackupStore with interface (#3329)

In preparation for modifying the instantiation of `BackupStores` to be
able to load credentials, change the function `NewObjectBackupStore` to
be an interface that is passed in to all controllers.

Previously, the function to get a new backup store was configurable but
for many controllers was fixed to use `NewObjectBackupStore`. This
change introduces an interface for getting the backup store and wraps
the functionality from `NewObjectBackupStore` in a type which implements
this interface. This will allow more flexibility when introducing
credentials for a specific backup store as it will allow us to create a
new `ObjectBackupStoreGetter` type which can be configured to add
credentials config when creating the ObjectBackupStore without needing
to change the API used by the controllers.

Signed-off-by: Bridget McErlean <bmcerlean@vmware.com>
pull/3424/head
Bridget McErlean 2021-02-08 13:04:08 -05:00 committed by GitHub
parent 65c16a1d00
commit 38c08e087b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 117 additions and 80 deletions

View File

@ -578,6 +578,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
s.kubeClient,
s.config.defaultBackupLocation,
newPluginManager,
persistence.NewObjectBackupStoreGetter(),
s.logger,
)
@ -620,6 +621,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
s.config.formatFlag.Parse(),
csiVSLister,
csiVSCLister,
persistence.NewObjectBackupStoreGetter(),
)
return controllerRunInfo{
@ -676,6 +678,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
csiVSCLister,
s.csiSnapshotClient,
newPluginManager,
persistence.NewObjectBackupStoreGetter(),
s.metrics,
s.discoveryHelper,
)
@ -713,6 +716,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
s.logger,
s.logLevel,
newPluginManager,
persistence.NewObjectBackupStoreGetter(),
s.metrics,
s.config.formatFlag.Parse(),
)
@ -747,6 +751,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
s.mgr.GetClient(),
s.sharedInformerFactory.Velero().V1().Backups().Lister(),
newPluginManager,
persistence.NewObjectBackupStoreGetter(),
s.logger,
)
@ -824,9 +829,9 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string
StorageLocation: s.config.defaultBackupLocation,
ServerValidationFrequency: s.config.storeValidationFrequency,
},
NewPluginManager: newPluginManager,
NewBackupStore: persistence.NewObjectBackupStore,
Log: s.logger,
NewPluginManager: newPluginManager,
BackupStoreGetter: persistence.NewObjectBackupStoreGetter(),
Log: s.logger,
}
if err := bslr.SetupWithManager(s.mgr); err != nil {
s.logger.Fatal(err, "unable to create controller", "controller", controller.BackupStorageLocation)

View File

@ -80,7 +80,7 @@ type backupController struct {
snapshotLocationLister velerov1listers.VolumeSnapshotLocationLister
defaultSnapshotLocations map[string]string
metrics *metrics.ServerMetrics
newBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
backupStoreGetter persistence.ObjectBackupStoreGetter
formatFlag logging.Format
volumeSnapshotLister snapshotv1beta1listers.VolumeSnapshotLister
volumeSnapshotContentLister snapshotv1beta1listers.VolumeSnapshotContentLister
@ -105,6 +105,7 @@ func NewBackupController(
formatFlag logging.Format,
volumeSnapshotLister snapshotv1beta1listers.VolumeSnapshotLister,
volumeSnapshotContentLister snapshotv1beta1listers.VolumeSnapshotContentLister,
backupStoreGetter persistence.ObjectBackupStoreGetter,
) Interface {
c := &backupController{
genericController: newGenericController(Backup, logger),
@ -126,7 +127,7 @@ func NewBackupController(
formatFlag: formatFlag,
volumeSnapshotLister: volumeSnapshotLister,
volumeSnapshotContentLister: volumeSnapshotContentLister,
newBackupStore: persistence.NewObjectBackupStore,
backupStoreGetter: backupStoreGetter,
}
c.syncHandler = c.processBackup
@ -570,7 +571,7 @@ func (c *backupController) runBackup(backup *pkgbackup.Request) error {
}
backupLog.Info("Setting up backup store to check for backup existence")
backupStore, err := c.newBackupStore(backup.StorageLocation, pluginManager, backupLog)
backupStore, err := c.backupStoreGetter.Get(backup.StorageLocation, pluginManager, backupLog)
if err != nil {
return err
}
@ -651,7 +652,7 @@ func (c *backupController) runBackup(backup *pkgbackup.Request) error {
// re-instantiate the backup store because credentials could have changed since the original
// instantiation, if this was a long-running backup
backupLog.Info("Setting up backup store to persist the backup")
backupStore, err = c.newBackupStore(backup.StorageLocation, pluginManager, backupLog)
backupStore, err = c.backupStoreGetter.Get(backup.StorageLocation, pluginManager, backupLog)
if err != nil {
return err
}

View File

@ -818,11 +818,9 @@ func TestProcessBackupCompletions(t *testing.T) {
metrics: metrics.NewServerMetrics(),
clock: clock.NewFakeClock(now),
newPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
newBackupStore: func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return backupStore, nil
},
backupper: backupper,
formatFlag: formatFlag,
backupStoreGetter: NewFakeSingleObjectBackupStoreGetter(backupStore),
backupper: backupper,
formatFlag: formatFlag,
}
pluginManager.On("GetBackupItemActions").Return(nil, nil)

View File

@ -77,7 +77,7 @@ type backupDeletionController struct {
processRequestFunc func(*velerov1api.DeleteBackupRequest) error
clock clock.Clock
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager
newBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
backupStoreGetter persistence.ObjectBackupStoreGetter
metrics *metrics.ServerMetrics
helper discovery.Helper
}
@ -99,6 +99,7 @@ func NewBackupDeletionController(
csiSnapshotContentLister snapshotv1beta1listers.VolumeSnapshotContentLister,
csiSnapshotClient *snapshotterClientSet.Clientset,
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager,
backupStoreGetter persistence.ObjectBackupStoreGetter,
metrics *metrics.ServerMetrics,
helper discovery.Helper,
) Interface {
@ -121,8 +122,8 @@ func NewBackupDeletionController(
helper: helper,
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
newPluginManager: newPluginManager,
newBackupStore: persistence.NewObjectBackupStore,
newPluginManager: newPluginManager,
backupStoreGetter: backupStoreGetter,
clock: &clock.RealClock{},
}
@ -290,7 +291,7 @@ func (c *backupDeletionController) processRequest(req *velerov1api.DeleteBackupR
pluginManager := c.newPluginManager(log)
defer pluginManager.CleanupClients()
backupStore, err := c.newBackupStore(location, pluginManager, log)
backupStore, err := c.backupStoreGetter.Get(location, pluginManager, log)
if err != nil {
errs = append(errs, err.Error())
}

View File

@ -75,6 +75,7 @@ func TestBackupDeletionControllerProcessQueueItem(t *testing.T) {
nil, // csiSnapshotContentLister
nil, // csiSnapshotClient
nil, // new plugin manager func
persistence.NewObjectBackupStoreGetter(),
metrics.NewServerMetrics(),
nil, // discovery helper
).(*backupDeletionController)
@ -172,6 +173,7 @@ func setupBackupDeletionControllerTest(t *testing.T, objects ...runtime.Object)
nil, // csiSnapshotContentLister
nil, // csiSnapshotClient
func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewFakeSingleObjectBackupStoreGetter(backupStore),
metrics.NewServerMetrics(),
nil, // discovery helper
).(*backupDeletionController),
@ -179,10 +181,6 @@ func setupBackupDeletionControllerTest(t *testing.T, objects ...runtime.Object)
req: req,
}
data.controller.newBackupStore = func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return backupStore, nil
}
pluginManager.On("CleanupClients").Return(nil)
return data
@ -1133,6 +1131,7 @@ func TestBackupDeletionControllerDeleteExpiredRequests(t *testing.T) {
nil, // csiSnapshotContentLister
nil, // csiSnapshotClient
nil, // new plugin manager func
persistence.NewObjectBackupStoreGetter(),
metrics.NewServerMetrics(),
nil, // discovery helper,
).(*backupDeletionController)

View File

@ -44,8 +44,8 @@ type BackupStorageLocationReconciler struct {
DefaultBackupLocationInfo storage.DefaultBackupLocationInfo
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
NewPluginManager func(logrus.FieldLogger) clientmgmt.Manager
NewBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
NewPluginManager func(logrus.FieldLogger) clientmgmt.Manager
BackupStoreGetter persistence.ObjectBackupStoreGetter
Log logrus.FieldLogger
}
@ -95,7 +95,7 @@ func (r *BackupStorageLocationReconciler) Reconcile(ctx context.Context, req ctr
continue
}
backupStore, err := r.NewBackupStore(location, pluginManager, log)
backupStore, err := r.BackupStoreGetter.Get(location, pluginManager, log)
if err != nil {
log.WithError(err).Error("Error getting a backup store")
continue

View File

@ -33,7 +33,6 @@ import (
"github.com/vmware-tanzu/velero/internal/storage"
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
"github.com/vmware-tanzu/velero/pkg/builder"
"github.com/vmware-tanzu/velero/pkg/persistence"
persistencemocks "github.com/vmware-tanzu/velero/pkg/persistence/mocks"
"github.com/vmware-tanzu/velero/pkg/plugin/clientmgmt"
pluginmocks "github.com/vmware-tanzu/velero/pkg/plugin/mocks"
@ -87,12 +86,9 @@ var _ = Describe("Backup Storage Location Reconciler", func() {
StorageLocation: "location-1",
ServerValidationFrequency: 0,
},
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewBackupStore: func(loc *velerov1api.BackupStorageLocation, _ persistence.ObjectStoreGetter, _ logrus.FieldLogger) (persistence.BackupStore, error) {
// this gets populated just below, prior to exercising the method under test
return backupStores[loc.Name], nil
},
Log: velerotest.NewLogger(),
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
BackupStoreGetter: NewFakeObjectBackupStoreGetter(backupStores),
Log: velerotest.NewLogger(),
}
actualResult, err := r.Reconcile(ctx, ctrl.Request{
@ -156,12 +152,9 @@ var _ = Describe("Backup Storage Location Reconciler", func() {
StorageLocation: "default",
ServerValidationFrequency: 0,
},
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewBackupStore: func(loc *velerov1api.BackupStorageLocation, _ persistence.ObjectStoreGetter, _ logrus.FieldLogger) (persistence.BackupStore, error) {
// this gets populated just below, prior to exercising the method under test
return backupStores[loc.Name], nil
},
Log: velerotest.NewLogger(),
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
BackupStoreGetter: NewFakeObjectBackupStoreGetter(backupStores),
Log: velerotest.NewLogger(),
}
actualResult, err := r.Reconcile(ctx, ctrl.Request{
@ -229,12 +222,9 @@ var _ = Describe("Backup Storage Location Reconciler", func() {
StorageLocation: "default",
ServerValidationFrequency: 0,
},
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewBackupStore: func(loc *velerov1api.BackupStorageLocation, _ persistence.ObjectStoreGetter, _ logrus.FieldLogger) (persistence.BackupStore, error) {
// this gets populated just below, prior to exercising the method under test
return backupStores[loc.Name], nil
},
Log: velerotest.NewLogger(),
NewPluginManager: func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
BackupStoreGetter: NewFakeObjectBackupStoreGetter(backupStores),
Log: velerotest.NewLogger(),
}
actualResult, err := r.Reconcile(ctx, ctrl.Request{

View File

@ -54,7 +54,7 @@ type backupSyncController struct {
defaultBackupLocation string
defaultBackupSyncPeriod time.Duration
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager
newBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
backupStoreGetter persistence.ObjectBackupStoreGetter
}
func NewBackupSyncController(
@ -68,6 +68,7 @@ func NewBackupSyncController(
kubeClient kubernetes.Interface,
defaultBackupLocation string,
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager,
backupStoreGetter persistence.ObjectBackupStoreGetter,
logger logrus.FieldLogger,
) Interface {
if syncPeriod <= 0 {
@ -89,8 +90,8 @@ func NewBackupSyncController(
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
newPluginManager: newPluginManager,
newBackupStore: persistence.NewObjectBackupStore,
newPluginManager: newPluginManager,
backupStoreGetter: backupStoreGetter,
}
c.resyncFunc = c.run
@ -169,7 +170,7 @@ func (c *backupSyncController) run() {
log.Debug("Checking backup location for backups to sync into cluster")
backupStore, err := c.newBackupStore(&location, pluginManager, log)
backupStore, err := c.backupStoreGetter.Get(&location, pluginManager, log)
if err != nil {
log.WithError(err).Error("Error getting backup store for this location")
continue

View File

@ -21,6 +21,8 @@ import (
"testing"
"time"
"github.com/vmware-tanzu/velero/pkg/persistence"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -34,7 +36,6 @@ import (
"github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/fake"
informers "github.com/vmware-tanzu/velero/pkg/generated/informers/externalversions"
"github.com/vmware-tanzu/velero/pkg/label"
"github.com/vmware-tanzu/velero/pkg/persistence"
persistencemocks "github.com/vmware-tanzu/velero/pkg/persistence/mocks"
"github.com/vmware-tanzu/velero/pkg/plugin/clientmgmt"
pluginmocks "github.com/vmware-tanzu/velero/pkg/plugin/mocks"
@ -351,14 +352,10 @@ func TestBackupSyncControllerRun(t *testing.T) {
nil, // kubeClient
"",
func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewFakeObjectBackupStoreGetter(backupStores),
velerotest.NewLogger(),
).(*backupSyncController)
c.newBackupStore = func(loc *velerov1api.BackupStorageLocation, _ persistence.ObjectStoreGetter, _ logrus.FieldLogger) (persistence.BackupStore, error) {
// this gets populated just below, prior to exercising the method under test
return backupStores[loc.Name], nil
}
pluginManager.On("CleanupClients").Return(nil)
for _, location := range test.locations {
@ -576,6 +573,7 @@ func TestDeleteOrphanedBackups(t *testing.T) {
nil, // kubeClient
"",
nil, // new plugin manager func
persistence.NewObjectBackupStoreGetter(),
velerotest.NewLogger(),
).(*backupSyncController)
@ -669,6 +667,7 @@ func TestStorageLabelsInDeleteOrphanedBackups(t *testing.T) {
nil, // kubeClient
"",
nil, // new plugin manager func
persistence.NewObjectBackupStoreGetter(),
velerotest.NewLogger(),
).(*backupSyncController)

View File

@ -51,7 +51,7 @@ type downloadRequestController struct {
kbClient client.Client
backupLister velerov1listers.BackupLister
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager
newBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
backupStoreGetter persistence.ObjectBackupStoreGetter
}
// NewDownloadRequestController creates a new DownloadRequestController.
@ -62,6 +62,7 @@ func NewDownloadRequestController(
kbClient client.Client,
backupLister velerov1listers.BackupLister,
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager,
backupStoreGetter persistence.ObjectBackupStoreGetter,
logger logrus.FieldLogger,
) Interface {
c := &downloadRequestController{
@ -74,8 +75,8 @@ func NewDownloadRequestController(
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
newPluginManager: newPluginManager,
newBackupStore: persistence.NewObjectBackupStore,
newPluginManager: newPluginManager,
backupStoreGetter: backupStoreGetter,
clock: &clock.RealClock{},
}
@ -172,7 +173,7 @@ func (c *downloadRequestController) generatePreSignedURL(downloadRequest *velero
pluginManager := c.newPluginManager(log)
defer pluginManager.CleanupClients()
backupStore, err := c.newBackupStore(backupLocation, pluginManager, log)
backupStore, err := c.backupStoreGetter.Get(backupLocation, pluginManager, log)
if err != nil {
return errors.WithStack(err)
}

View File

@ -34,7 +34,6 @@ import (
"github.com/vmware-tanzu/velero/pkg/builder"
"github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/fake"
informers "github.com/vmware-tanzu/velero/pkg/generated/informers/externalversions"
"github.com/vmware-tanzu/velero/pkg/persistence"
persistencemocks "github.com/vmware-tanzu/velero/pkg/persistence/mocks"
"github.com/vmware-tanzu/velero/pkg/plugin/clientmgmt"
pluginmocks "github.com/vmware-tanzu/velero/pkg/plugin/mocks"
@ -64,6 +63,7 @@ func newDownloadRequestTestHarness(t *testing.T, fakeClient client.Client) *down
fakeClient,
informerFactory.Velero().V1().Backups().Lister(),
func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewFakeSingleObjectBackupStoreGetter(backupStore),
velerotest.NewLogger(),
).(*downloadRequestController)
)
@ -72,10 +72,6 @@ func newDownloadRequestTestHarness(t *testing.T, fakeClient client.Client) *down
require.NoError(t, err)
controller.clock = clock.NewFakeClock(clockTime)
controller.newBackupStore = func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return backupStore, nil
}
pluginManager.On("CleanupClients").Return()
return &downloadRequestTestHarness{

View File

@ -92,8 +92,8 @@ type restoreController struct {
logFormat logging.Format
clock clock.Clock
newPluginManager func(logger logrus.FieldLogger) clientmgmt.Manager
newBackupStore func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error)
newPluginManager func(logger logrus.FieldLogger) clientmgmt.Manager
backupStoreGetter persistence.ObjectBackupStoreGetter
}
func NewRestoreController(
@ -108,6 +108,7 @@ func NewRestoreController(
logger logrus.FieldLogger,
restoreLogLevel logrus.Level,
newPluginManager func(logrus.FieldLogger) clientmgmt.Manager,
backupStoreGetter persistence.ObjectBackupStoreGetter,
metrics *metrics.ServerMetrics,
logFormat logging.Format,
) Interface {
@ -128,8 +129,8 @@ func NewRestoreController(
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
newPluginManager: newPluginManager,
newBackupStore: persistence.NewObjectBackupStore,
newPluginManager: newPluginManager,
backupStoreGetter: backupStoreGetter,
}
c.syncHandler = c.processQueueItem
@ -410,7 +411,7 @@ func (c *restoreController) fetchBackupInfo(backupName string, pluginManager cli
return backupInfo{}, errors.WithStack(err)
}
backupStore, err := c.newBackupStore(location, pluginManager, c.logger)
backupStore, err := c.backupStoreGetter.Get(location, pluginManager, c.logger)
if err != nil {
return backupInfo{}, err
}
@ -480,7 +481,7 @@ func (c *restoreController) runValidatedRestore(restore *api.Restore, info backu
// re-instantiate the backup store because credentials could have changed since the original
// instantiation, if this was a long-running restore
info.backupStore, err = c.newBackupStore(info.location, pluginManager, c.logger)
info.backupStore, err = c.backupStoreGetter.Get(info.location, pluginManager, c.logger)
if err != nil {
return errors.Wrap(err, "error setting up backup store to persist log and results files")
}

View File

@ -117,14 +117,11 @@ func TestFetchBackupInfo(t *testing.T) {
logger,
logrus.InfoLevel,
func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewFakeSingleObjectBackupStoreGetter(backupStore),
metrics.NewServerMetrics(),
formatFlag,
).(*restoreController)
c.newBackupStore = func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return backupStore, nil
}
if test.backupStoreError == nil {
for _, itm := range test.informerLocations {
require.NoError(t, fakeClient.Create(context.Background(), itm))
@ -212,6 +209,7 @@ func TestProcessQueueItemSkips(t *testing.T) {
logger,
logrus.InfoLevel,
nil,
persistence.NewObjectBackupStoreGetter(),
metrics.NewServerMetrics(),
formatFlag,
).(*restoreController)
@ -438,13 +436,11 @@ func TestProcessQueueItem(t *testing.T) {
logger,
logrus.InfoLevel,
func(logrus.FieldLogger) clientmgmt.Manager { return pluginManager },
NewFakeSingleObjectBackupStoreGetter(backupStore),
metrics.NewServerMetrics(),
formatFlag,
).(*restoreController)
c.newBackupStore = func(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return backupStore, nil
}
c.clock = clock.NewFakeClock(now)
if test.location != nil {
require.NoError(t, fakeClient.Create(context.Background(), test.location))
@ -670,6 +666,7 @@ func TestvalidateAndCompleteWhenScheduleNameSpecified(t *testing.T) {
logger,
logrus.DebugLevel,
nil,
persistence.NewObjectBackupStoreGetter(),
nil,
formatFlag,
).(*restoreController)

View File

@ -22,6 +22,11 @@ import (
"testing"
"time"
"github.com/sirupsen/logrus"
"github.com/vmware-tanzu/velero/pkg/persistence"
persistencemocks "github.com/vmware-tanzu/velero/pkg/persistence/mocks"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/klog"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
@ -133,3 +138,31 @@ func newFakeClient(t *testing.T, initObjs ...runtime.Object) client.Client {
require.NoError(t, err)
return fake.NewFakeClientWithScheme(scheme.Scheme, initObjs...)
}
type fakeSingleObjectBackupStoreGetter struct {
store persistence.BackupStore
}
func (f *fakeSingleObjectBackupStoreGetter) Get(*velerov1api.BackupStorageLocation, persistence.ObjectStoreGetter, logrus.FieldLogger) (persistence.BackupStore, error) {
return f.store, nil
}
// NewFakeSingleObjectBackupStoreGetter returns an ObjectBackupStoreGetter
// that will return only the given BackupStore.
func NewFakeSingleObjectBackupStoreGetter(store persistence.BackupStore) persistence.ObjectBackupStoreGetter {
return &fakeSingleObjectBackupStoreGetter{store: store}
}
type fakeObjectBackupStoreGetter struct {
stores map[string]*persistencemocks.BackupStore
}
func (f *fakeObjectBackupStoreGetter) Get(loc *velerov1api.BackupStorageLocation, _ persistence.ObjectStoreGetter, _ logrus.FieldLogger) (persistence.BackupStore, error) {
return f.stores[loc.Name], nil
}
// NewFakeObjectBackupStoreGetter returns an ObjectBackupStoreGetter that will
// return the BackupStore for a given BackupStorageLocation name.
func NewFakeObjectBackupStoreGetter(stores map[string]*persistencemocks.BackupStore) persistence.ObjectBackupStoreGetter {
return &fakeObjectBackupStoreGetter{stores: stores}
}

View File

@ -90,7 +90,21 @@ type ObjectStoreGetter interface {
GetObjectStore(provider string) (velero.ObjectStore, error)
}
func NewObjectBackupStore(location *velerov1api.BackupStorageLocation, objectStoreGetter ObjectStoreGetter, logger logrus.FieldLogger) (BackupStore, error) {
// ObjectBackupStoreGetter is a type that can get a velero.BackupStore for a
// given BackupStorageLocation and ObjectStore.
type ObjectBackupStoreGetter interface {
Get(location *velerov1api.BackupStorageLocation, objectStoreGetter ObjectStoreGetter, logger logrus.FieldLogger) (BackupStore, error)
}
type objectBackupStoreGetter struct{}
// NewObjectBackupStoreGetter returns a ObjectBackupStoreGetter that can get a
// default velero.BackupStore.
func NewObjectBackupStoreGetter() ObjectBackupStoreGetter {
return &objectBackupStoreGetter{}
}
func (b *objectBackupStoreGetter) Get(location *velerov1api.BackupStorageLocation, objectStoreGetter ObjectStoreGetter, logger logrus.FieldLogger) (BackupStore, error) {
if location.Spec.ObjectStorage == nil {
return nil, errors.New("backup storage location does not use object storage")
}

View File

@ -604,10 +604,10 @@ func (osg objectStoreGetter) GetObjectStore(provider string) (velero.ObjectStore
return res, nil
}
// TestNewObjectBackupStore runs the NewObjectBackupStore constructor and ensures
// that an ObjectBackupStore is constructed correctly or an appropriate error is
// returned.
func TestNewObjectBackupStore(t *testing.T) {
// TestNewObjectBackupStore runs the NewObjectBackupStoreGetter constructor and ensures
// that it provides a BackupStore with a correctly constructed ObjectBackupStore or
// that an appropriate error is returned.
func TestNewObjectBackupStoreGetter(t *testing.T) {
tests := []struct {
name string
location *velerov1api.BackupStorageLocation
@ -661,7 +661,8 @@ func TestNewObjectBackupStore(t *testing.T) {
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
res, err := NewObjectBackupStore(tc.location, tc.objectStoreGetter, velerotest.NewLogger())
getter := NewObjectBackupStoreGetter()
res, err := getter.Get(tc.location, tc.objectStoreGetter, velerotest.NewLogger())
if tc.wantErr != "" {
require.Equal(t, tc.wantErr, err.Error())
} else {