diff options
author | James Fargher <jfargher@gitlab.com> | 2023-05-26 00:59:50 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2023-06-01 03:50:24 +0300 |
commit | f5d65cd7bd229eb29c603584d1d2a04ab7e6450c (patch) | |
tree | e94db0e10dc188dcae3454d9571d4d9ca64ebc47 | |
parent | 8e494f4e3035544acafbf07e3981a35059359ebc (diff) |
backup: Implement remove repository for backup.Repository
In preparation of supporting server-side backup restores, here we add
both RPC and server-side implementations for remove repository.
-rw-r--r-- | cmd/gitaly-backup/restore_test.go | 2 | ||||
-rw-r--r-- | internal/backup/backup.go | 29 | ||||
-rw-r--r-- | internal/backup/repository.go | 29 |
3 files changed, 40 insertions, 20 deletions
diff --git a/cmd/gitaly-backup/restore_test.go b/cmd/gitaly-backup/restore_test.go index 037078310..3492c6c15 100644 --- a/cmd/gitaly-backup/restore_test.go +++ b/cmd/gitaly-backup/restore_test.go @@ -76,7 +76,7 @@ func TestRestoreSubcommand(t *testing.T) { require.NoError(t, fs.Parse([]string{"-path", path, "-remove-all-repositories", existingRepo.StorageName})) require.EqualError(t, cmd.Run(ctx, &stdin, io.Discard), - "restore: pipeline: 1 failures encountered:\n - invalid: manager: remove repository: could not dial source: invalid connection string: \"invalid\"\n") + "restore: pipeline: 1 failures encountered:\n - invalid: manager: could not dial source: invalid connection string: \"invalid\"\n") require.NoDirExists(t, existRepoPath) diff --git a/internal/backup/backup.go b/internal/backup/backup.go index 06d09acc4..3acaf36a3 100644 --- a/internal/backup/backup.go +++ b/internal/backup/backup.go @@ -15,8 +15,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/transaction" "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb" "gitlab.com/gitlab-org/gitaly/v16/streamio" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" ) @@ -84,6 +82,9 @@ type Repository interface { GetCustomHooks(ctx context.Context, out io.Writer) error // CreateBundle fetches a bundle that contains refs matching patterns. CreateBundle(ctx context.Context, out io.Writer, patterns io.Reader) error + // Remove removes the repository. Does not return an error if the + // repository cannot be found. + Remove(ctx context.Context) error } // ResolveLocator returns a locator implementation based on a locator identifier. @@ -254,7 +255,12 @@ func (mgr *Manager) Restore(ctx context.Context, req *RestoreRequest) error { return fmt.Errorf("manager: %w", err) } - if err := mgr.removeRepository(ctx, req.Server, req.Repository); err != nil { + repo, err := mgr.repositoryFactory(ctx, req.Repository, req.Server) + if err != nil { + return fmt.Errorf("manager: %w", err) + } + + if err := repo.Remove(ctx); err != nil { return fmt.Errorf("manager: %w", err) } @@ -280,7 +286,7 @@ func (mgr *Manager) Restore(ctx context.Context, req *RestoreRequest) error { return nil } - if err := mgr.removeRepository(ctx, req.Server, req.Repository); err != nil { + if err := repo.Remove(ctx); err != nil { return fmt.Errorf("manager: remove on skipped: %w", err) } @@ -309,21 +315,6 @@ func setContextServerInfo(ctx context.Context, server *storage.ServerInfo, stora return nil } -func (mgr *Manager) removeRepository(ctx context.Context, server storage.ServerInfo, repo *gitalypb.Repository) error { - repoClient, err := mgr.newRepoClient(ctx, server) - if err != nil { - return fmt.Errorf("remove repository: %w", err) - } - _, err = repoClient.RemoveRepository(ctx, &gitalypb.RemoveRepositoryRequest{Repository: repo}) - switch { - case status.Code(err) == codes.NotFound: - return nil - case err != nil: - return fmt.Errorf("remove repository: %w", err) - } - return nil -} - func (mgr *Manager) createRepository(ctx context.Context, server storage.ServerInfo, repo *gitalypb.Repository) error { repoClient, err := mgr.newRepoClient(ctx, server) if err != nil { diff --git a/internal/backup/repository.go b/internal/backup/repository.go index b36e08bd6..6c66b29af 100644 --- a/internal/backup/repository.go +++ b/internal/backup/repository.go @@ -149,6 +149,22 @@ func (rr *remoteRepository) CreateBundle(ctx context.Context, out io.Writer, pat return nil } +// Remove removes the repository. Does not return an error if the repository +// cannot be found. +func (rr *remoteRepository) Remove(ctx context.Context) error { + repoClient := rr.newRepoClient() + _, err := repoClient.RemoveRepository(ctx, &gitalypb.RemoveRepositoryRequest{ + Repository: rr.repo, + }) + switch { + case status.Code(err) == codes.NotFound: + return nil + case err != nil: + return fmt.Errorf("remote repository: remove: %w", err) + } + return nil +} + func (rr *remoteRepository) newRepoClient() gitalypb.RepositoryServiceClient { return gitalypb.NewRepositoryServiceClient(rr.conn) } @@ -239,3 +255,16 @@ func (r *localRepository) CreateBundle(ctx context.Context, out io.Writer, patte return nil } + +// Remove removes the repository. Does not return an error if the repository +// cannot be found. +func (r *localRepository) Remove(ctx context.Context) error { + err := repoutil.Remove(ctx, r.locator, r.txManager, r.repo) + switch { + case status.Code(err) == codes.NotFound: + return nil + case err != nil: + return fmt.Errorf("local repository: remove: %w", err) + } + return nil +} |