1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
package praefect
import (
"context"
"testing"
grpcmwlogrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus"
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/internal/git/gittest"
"gitlab.com/gitlab-org/gitaly/internal/log"
"gitlab.com/gitlab-org/gitaly/internal/praefect/datastore"
"gitlab.com/gitlab-org/gitaly/internal/testhelper"
"gitlab.com/gitlab-org/gitaly/internal/testhelper/testdb"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"google.golang.org/grpc"
)
type mockObjectPoolService struct {
gitalypb.UnimplementedObjectPoolServiceServer
deleteObjectPoolFunc func(context.Context, *gitalypb.DeleteObjectPoolRequest) (*gitalypb.DeleteObjectPoolResponse, error)
}
func (m mockObjectPoolService) DeleteObjectPool(ctx context.Context, req *gitalypb.DeleteObjectPoolRequest) (*gitalypb.DeleteObjectPoolResponse, error) {
return m.deleteObjectPoolFunc(ctx, req)
}
func TestDeleteObjectPoolHandler(t *testing.T) {
// the primary returns a successful response
primarySrv := grpc.NewServer()
gitalypb.RegisterObjectPoolServiceServer(primarySrv, mockObjectPoolService{
deleteObjectPoolFunc: func(context.Context, *gitalypb.DeleteObjectPoolRequest) (*gitalypb.DeleteObjectPoolResponse, error) {
return &gitalypb.DeleteObjectPoolResponse{}, nil
},
})
// the secondary fails as it doesn't have the service registered
secondarySrv := grpc.NewServer()
primaryLn, primaryAddr := testhelper.GetLocalhostListener(t)
secondaryLn, secondaryAddr := testhelper.GetLocalhostListener(t)
defer primarySrv.Stop()
go primarySrv.Serve(primaryLn)
defer secondarySrv.Stop()
go secondarySrv.Serve(secondaryLn)
db := testdb.New(t)
rs := datastore.NewPostgresRepositoryStore(db, nil)
ctx := testhelper.Context(t)
repo := &gitalypb.Repository{
StorageName: "virtual-storage",
RelativePath: gittest.NewObjectPoolName(t),
}
require.NoError(t,
rs.CreateRepository(ctx, 1, repo.StorageName, repo.RelativePath, "replica-path", "primary", []string{"secondary", "unconfigured_storage"}, nil, true, true),
)
primaryConn, err := grpc.Dial(primaryAddr, grpc.WithInsecure())
require.NoError(t, err)
defer primaryConn.Close()
secondaryConn, err := grpc.Dial(secondaryAddr, grpc.WithInsecure())
require.NoError(t, err)
defer secondaryConn.Close()
praefectLn, praefectAddr := testhelper.GetLocalhostListener(t)
logger, hook := test.NewNullLogger()
praefectSrv := grpc.NewServer(grpc.ChainStreamInterceptor(
grpcmwlogrus.StreamServerInterceptor(logrus.NewEntry(logger), grpcmwlogrus.WithTimestampFormat(log.LogTimestampFormat)),
))
praefectSrv.RegisterService(&grpc.ServiceDesc{
ServiceName: "gitaly.ObjectPoolService",
HandlerType: (*interface{})(nil),
Streams: []grpc.StreamDesc{
{
StreamName: "DeleteObjectPool",
Handler: DeleteObjectPoolHandler(rs, Connections{
"virtual-storage": {
"primary": primaryConn,
"secondary": secondaryConn,
},
}),
ServerStreams: true,
ClientStreams: true,
},
},
}, struct{}{})
defer praefectSrv.Stop()
go praefectSrv.Serve(praefectLn)
praefectConn, err := grpc.Dial(praefectAddr, grpc.WithInsecure())
require.NoError(t, err)
defer praefectConn.Close()
_, err = gitalypb.NewObjectPoolServiceClient(
praefectConn,
).DeleteObjectPool(ctx, &gitalypb.DeleteObjectPoolRequest{
ObjectPool: &gitalypb.ObjectPool{Repository: repo},
})
require.NoError(t, err)
require.Equal(t, 2, len(hook.Entries), "expected a log entry for failed deletion")
require.Equal(t, "failed deleting repository", hook.Entries[0].Message)
require.Equal(t, repo.StorageName, hook.Entries[0].Data["virtual_storage"])
require.Equal(t, repo.RelativePath, hook.Entries[0].Data["relative_path"])
require.Equal(t, "secondary", hook.Entries[0].Data["storage"])
}
|