diff options
author | James Fargher <jfargher@gitlab.com> | 2023-02-21 00:12:58 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2023-03-02 22:55:03 +0300 |
commit | f838a979710b79acd91caa8aa620cf2b27a97fe8 (patch) | |
tree | 3fc4aa2ffc85d1caf53acab4f578b7d04ffb41ff | |
parent | 4020a8bc182d5c3cd88e3b0a845b8d2476252ab8 (diff) |
backup: Add RemoveAllRepositories to backup manager
The manager will be used to clear storages prior to starting a full
backup.
-rw-r--r-- | internal/backup/backup.go | 26 | ||||
-rw-r--r-- | internal/backup/backup_test.go | 30 |
2 files changed, 56 insertions, 0 deletions
diff --git a/internal/backup/backup.go b/internal/backup/backup.go index 27323a3d2..2c74ee9cd 100644 --- a/internal/backup/backup.go +++ b/internal/backup/backup.go @@ -140,6 +140,32 @@ func NewManager(sink Sink, locator Locator, pool *client.Pool, backupID string) } } +// RemoveAllRepositoriesRequest is the request to remove all repositories in the specified +// storage name. +type RemoveAllRepositoriesRequest struct { + Server storage.ServerInfo + StorageName string +} + +// RemoveAllRepositories removes all repositories in the specified storage name. +func (mgr *Manager) RemoveAllRepositories(ctx context.Context, req *RemoveAllRepositoriesRequest) error { + if err := setContextServerInfo(ctx, &req.Server, req.StorageName); err != nil { + return fmt.Errorf("manager: %w", err) + } + + repoClient, err := mgr.newRepoClient(ctx, req.Server) + if err != nil { + return fmt.Errorf("manager: %w", err) + } + + _, err = repoClient.RemoveAll(ctx, &gitalypb.RemoveAllRequest{StorageName: req.StorageName}) + if err != nil { + return fmt.Errorf("manager: %w", err) + } + + return nil +} + // CreateRequest is the request to create a backup type CreateRequest struct { Server storage.ServerInfo diff --git a/internal/backup/backup_test.go b/internal/backup/backup_test.go index dd1084275..ce9c2d473 100644 --- a/internal/backup/backup_test.go +++ b/internal/backup/backup_test.go @@ -26,6 +26,36 @@ import ( "google.golang.org/protobuf/proto" ) +func TestManager_RemoveAllRepositories(t *testing.T) { + t.Parallel() + + const backupID = "abc123" + + cfg := testcfg.Build(t) + cfg.SocketPath = testserver.RunGitalyServer(t, cfg, nil, setup.RegisterAll) + + ctx := testhelper.Context(t) + + repo, repoPath := gittest.CreateRepository(t, ctx, cfg) + commitID := gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch("main")) + gittest.WriteTag(t, cfg, repoPath, "v1.0.0", commitID.Revision()) + + pool := client.NewPool() + defer testhelper.MustClose(t, pool) + + backupRoot := testhelper.TempDir(t) + sink := NewFilesystemSink(backupRoot) + locator, err := ResolveLocator("pointer", sink) + require.NoError(t, err) + + fsBackup := NewManager(sink, locator, pool, backupID) + err = fsBackup.RemoveAllRepositories(ctx, &RemoveAllRepositoriesRequest{ + Server: storage.ServerInfo{Address: cfg.SocketPath, Token: cfg.Auth.Token}, + StorageName: repo.StorageName, + }) + require.NoError(t, err) +} + func TestManager_Create(t *testing.T) { t.Parallel() |