Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'internal/backup/server_side_test.go')
-rw-r--r--internal/backup/server_side_test.go125
1 files changed, 104 insertions, 21 deletions
diff --git a/internal/backup/server_side_test.go b/internal/backup/server_side_test.go
index 2acc547c5..69669df60 100644
--- a/internal/backup/server_side_test.go
+++ b/internal/backup/server_side_test.go
@@ -13,9 +13,11 @@ import (
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/service/setup"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage"
"gitlab.com/gitlab-org/gitaly/v16/internal/grpc/client"
+ "gitlab.com/gitlab-org/gitaly/v16/internal/praefect/datastore"
"gitlab.com/gitlab-org/gitaly/v16/internal/structerr"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper/testcfg"
+ "gitlab.com/gitlab-org/gitaly/v16/internal/testhelper/testdb"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper/testserver"
"gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
)
@@ -257,28 +259,15 @@ func TestServerSideAdapter_Restore(t *testing.T) {
}
}
-func TestServerSideAdapter_RemoveAllRepositories(t *testing.T) {
- testhelper.SkipWithWAL(t, `
-RemoveAll is removing the entire content of the storage. This would also remove the database's and
-the transaction manager's disk state. The RPC needs to be updated to shut down all partitions and
-the database and only then perform the removal.
-
-Issue: https://gitlab.com/gitlab-org/gitaly/-/issues/5269`)
-
+func TestServerSideAdapter_RemoveRepository(t *testing.T) {
t.Parallel()
- backupRoot := testhelper.TempDir(t)
- sink := backup.NewFilesystemSink(backupRoot)
- defer testhelper.MustClose(t, sink)
-
- locator, err := backup.ResolveLocator("pointer", sink)
- require.NoError(t, err)
+ db := testdb.New(t)
+ db.TruncateAll(t)
+ datastore.NewPostgresRepositoryStore(db, map[string][]string{"virtual-storage": {"default"}})
cfg := testcfg.Build(t)
- cfg.SocketPath = testserver.RunGitalyServer(t, cfg, setup.RegisterAll,
- testserver.WithBackupSink(sink),
- testserver.WithBackupLocator(locator),
- )
+ cfg.SocketPath = testserver.RunGitalyServer(t, cfg, setup.RegisterAll)
ctx := testhelper.Context(t)
@@ -289,9 +278,103 @@ Issue: https://gitlab.com/gitlab-org/gitaly/-/issues/5269`)
defer testhelper.MustClose(t, pool)
adapter := backup.NewServerSideAdapter(pool)
- err = adapter.RemoveAllRepositories(ctx, &backup.RemoveAllRepositoriesRequest{
- Server: storage.ServerInfo{Address: cfg.SocketPath, Token: cfg.Auth.Token},
- StorageName: repo.StorageName,
+ err := adapter.RemoveRepository(ctx, &backup.RemoveRepositoryRequest{
+ Server: storage.ServerInfo{Address: cfg.SocketPath, Token: cfg.Auth.Token},
+ Repo: repo,
})
require.NoError(t, err)
+ require.NoDirExists(t, repoPath)
+
+ // With an invalid repository
+ err = adapter.RemoveRepository(ctx, &backup.RemoveRepositoryRequest{
+ Server: storage.ServerInfo{Address: cfg.SocketPath, Token: cfg.Auth.Token},
+ Repo: &gitalypb.Repository{StorageName: "default", RelativePath: "nonexistent"},
+ })
+
+ require.EqualError(t, err, "server-side remove repo: remove: rpc error: code = NotFound desc = repository does not exist")
+}
+
+func TestServerSideAdapter_ListRepositories(t *testing.T) {
+ t.Parallel()
+
+ for _, tc := range []struct {
+ desc string
+ repos map[string][]*gitalypb.Repository
+ }{
+ {
+ desc: "no repos",
+ repos: make(map[string][]*gitalypb.Repository),
+ },
+ {
+ desc: "repos in a single storage",
+ repos: map[string][]*gitalypb.Repository{
+ "storage-1": {
+ {RelativePath: "a", StorageName: "storage-1"},
+ {RelativePath: "b", StorageName: "storage-1"},
+ },
+ },
+ },
+ {
+ desc: "repos in multiple storages",
+ repos: map[string][]*gitalypb.Repository{
+ "storage-1": {
+ {RelativePath: "a", StorageName: "storage-1"},
+ {RelativePath: "b", StorageName: "storage-1"},
+ },
+ "storage-2": {
+ {RelativePath: "c", StorageName: "storage-2"},
+ {RelativePath: "d", StorageName: "storage-2"},
+ },
+ },
+ },
+ } {
+ t.Run(tc.desc, func(t *testing.T) {
+ var storages []string
+ for storageName := range tc.repos {
+ storages = append(storages, storageName)
+ }
+
+ db := testdb.New(t)
+ db.TruncateAll(t)
+ rs := datastore.NewPostgresRepositoryStore(db, map[string][]string{"virtual-storage": storages})
+
+ // We don't really need a "default" storage, but this makes initialisation cleaner since
+ // WithStorages() takes at least one argument.
+ cfg := testcfg.Build(t, testcfg.WithStorages("default", storages...))
+ cfg.SocketPath = testserver.RunGitalyServer(t, cfg, setup.RegisterAll)
+
+ ctx := testhelper.Context(t)
+
+ repoID := 1
+ for storageName, repos := range tc.repos {
+ for _, repo := range repos {
+ storagePath, ok := cfg.StoragePath(storageName)
+ require.True(t, ok)
+
+ _, _ = gittest.CreateRepository(t, ctx, cfg, gittest.CreateRepositoryConfig{
+ RelativePath: repo.RelativePath,
+ Storage: config.Storage{Name: storageName, Path: storagePath},
+ })
+
+ require.NoError(t, rs.CreateRepository(ctx, int64(repoID), "virtual-storage", repo.RelativePath, repo.RelativePath, storageName, nil, nil, false, false))
+
+ repoID++
+ }
+ }
+
+ pool := client.NewPool()
+ defer testhelper.MustClose(t, pool)
+
+ adapter := backup.NewServerSideAdapter(pool)
+
+ for storageName, repos := range tc.repos {
+ actualRepos, err := adapter.ListRepositories(ctx, &backup.ListRepositoriesRequest{
+ Server: storage.ServerInfo{Address: cfg.SocketPath, Token: cfg.Auth.Token},
+ StorageName: storageName,
+ })
+ require.NoError(t, err)
+ require.EqualValues(t, repos, actualRepos)
+ }
+ })
+ }
}