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/praefect/service/server/readiness_test.go')
-rw-r--r--internal/praefect/service/server/readiness_test.go114
1 files changed, 114 insertions, 0 deletions
diff --git a/internal/praefect/service/server/readiness_test.go b/internal/praefect/service/server/readiness_test.go
new file mode 100644
index 000000000..d53deb413
--- /dev/null
+++ b/internal/praefect/service/server/readiness_test.go
@@ -0,0 +1,114 @@
+package server_test
+
+import (
+ "context"
+ "io"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/gitaly/service/setup"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/praefect"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/praefect/config"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/praefect/service"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/testhelper"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/testhelper/testcfg"
+ "gitlab.com/gitlab-org/gitaly/v15/internal/testhelper/testserver"
+ "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
+ "google.golang.org/protobuf/types/known/durationpb"
+)
+
+func TestServer_ReadinessCheck(t *testing.T) {
+ t.Parallel()
+ stubCheck := func(t *testing.T, triggered chan string, name string) *service.Check {
+ return &service.Check{
+ Name: name,
+ Run: func(ctx context.Context) error {
+ _, ok := ctx.Deadline()
+ assert.True(t, ok, "the deadline should be set as we provide timeout")
+ triggered <- name
+ return nil
+ },
+ }
+ }
+
+ const gitalyStorageName = "praefect-internal-0"
+ gitalyCfg := testcfg.Build(t, testcfg.WithStorages(gitalyStorageName))
+ gitalyAddr := testserver.RunGitalyServer(t, gitalyCfg, nil, setup.RegisterAll, testserver.WithDisablePraefect())
+
+ praefectConf := config.Config{
+ SocketPath: testhelper.GetTemporaryGitalySocketFileName(t),
+ VirtualStorages: []*config.VirtualStorage{
+ {
+ Name: "default",
+ Nodes: []*config.Node{
+ {
+ Storage: gitalyStorageName,
+ Address: gitalyAddr,
+ },
+ },
+ },
+ },
+ }
+ ctx := testhelper.Context(t)
+ triggered := make(chan string, 2)
+ grpcPraefectConn, _, cleanup := praefect.RunPraefectServer(t, ctx, praefectConf, praefect.BuildOptions{
+ WithChecks: []service.CheckFunc{
+ func(conf config.Config, w io.Writer, quiet bool) *service.Check {
+ return stubCheck(t, triggered, "1")
+ },
+ func(conf config.Config, w io.Writer, quiet bool) *service.Check {
+ return stubCheck(t, triggered, "2")
+ },
+ },
+ })
+ t.Cleanup(cleanup)
+ serverClient := gitalypb.NewServerServiceClient(grpcPraefectConn)
+ resp, err := serverClient.ReadinessCheck(ctx, &gitalypb.ReadinessCheckRequest{Timeout: durationpb.New(time.Second)})
+ require.NoError(t, err)
+ assert.NotNil(t, resp.GetOkResponse())
+ if !assert.Nil(t, resp.GetFailureResponse()) {
+ for _, failure := range resp.GetFailureResponse().GetFailedChecks() {
+ assert.Failf(t, "failed check", "%s: %s", failure.Name, failure.ErrorMessage)
+ }
+ }
+ names := make([]string, 0, cap(triggered))
+ for i := 0; i < cap(triggered); i++ {
+ name := <-triggered
+ names = append(names, name)
+ }
+ require.ElementsMatch(t, []string{"1", "2"}, names, "both tasks should be triggered for an execution")
+}
+
+func TestServer_ReadinessCheck_unreachableGitaly(t *testing.T) {
+ t.Parallel()
+ praefectConf := config.Config{
+ SocketPath: testhelper.GetTemporaryGitalySocketFileName(t),
+ VirtualStorages: []*config.VirtualStorage{
+ {
+ Name: "default",
+ Nodes: []*config.Node{
+ {
+ Storage: "praefect-internal-0",
+ Address: "tcp://non-existing:42",
+ },
+ },
+ },
+ },
+ }
+ ctx := testhelper.Context(t)
+ grpcConn, _, cleanup := praefect.RunPraefectServer(t, ctx, praefectConf, praefect.BuildOptions{})
+ t.Cleanup(cleanup)
+ serverClient := gitalypb.NewServerServiceClient(grpcConn)
+ resp, err := serverClient.ReadinessCheck(ctx, &gitalypb.ReadinessCheckRequest{Timeout: durationpb.New(time.Nanosecond)})
+ require.NoError(t, err)
+ require.Nil(t, resp.GetOkResponse())
+ require.NotNil(t, resp.GetFailureResponse())
+ require.Len(t, resp.GetFailureResponse().FailedChecks, 5)
+ require.Equal(t, "clock synchronization", resp.GetFailureResponse().FailedChecks[0].Name)
+ require.Equal(t, "database read/write", resp.GetFailureResponse().FailedChecks[1].Name)
+ require.Equal(t, "gitaly node connectivity & disk access", resp.GetFailureResponse().FailedChecks[2].Name)
+ require.Equal(t, "praefect migrations", resp.GetFailureResponse().FailedChecks[3].Name)
+ require.Equal(t, "unavailable repositories", resp.GetFailureResponse().FailedChecks[4].Name)
+}