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:
authorAndrew Newdigate <andrew@gitlab.com>2017-10-05 14:42:54 +0300
committerAndrew Newdigate <andrew@gitlab.com>2017-10-05 14:42:54 +0300
commit3792a75d135888e022e1ed3e01fcd3e5b24979ae (patch)
tree7faa638a43b73ef6821d94e8f1ad945c012a37f6
parent3068412934d735d8d29f299275983037cfe1368a (diff)
ping service
-rw-r--r--internal/service/ping/gitaly_ruby_proxy.go20
-rw-r--r--internal/service/ping/server.go128
2 files changed, 148 insertions, 0 deletions
diff --git a/internal/service/ping/gitaly_ruby_proxy.go b/internal/service/ping/gitaly_ruby_proxy.go
new file mode 100644
index 000000000..21fd17ce5
--- /dev/null
+++ b/internal/service/ping/gitaly_ruby_proxy.go
@@ -0,0 +1,20 @@
+package notifications
+
+import (
+ "golang.org/x/net/context"
+
+ pb "gitlab.com/gitlab-org/gitaly-proto/go"
+)
+
+func (s *server) pingGitalyRuby(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
+ client, err := s.PingServiceClient(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ return client.Ping(ctx, req)
+}
+
+func (s *server) pingServerStreamGitalyRuby(req *pb.PingRequest, stream pb.PingService_PingServerStreamServer) error {
+ return nil
+}
diff --git a/internal/service/ping/server.go b/internal/service/ping/server.go
new file mode 100644
index 000000000..eeec7f1f3
--- /dev/null
+++ b/internal/service/ping/server.go
@@ -0,0 +1,128 @@
+package notifications
+
+import (
+ "io"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/metadata"
+
+ pb "gitlab.com/gitlab-org/gitaly-proto/go"
+ "gitlab.com/gitlab-org/gitaly/internal/rubyserver"
+)
+
+type server struct {
+ *rubyserver.Server
+}
+
+func getSingleValue(ctx context.Context, key string) string {
+ md, ok := metadata.FromIncomingContext(ctx)
+ if !ok {
+ return ""
+ }
+
+ routing := md[key]
+ if len(routing) == 1 {
+ return routing[0]
+ }
+
+ return ""
+}
+
+func (s *server) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) {
+ routing := getSingleValue(ctx, "routing")
+
+ if routing == "gitaly-ruby" {
+ return s.pingGitalyRuby(ctx, req)
+ }
+
+ wantedResponse := getSingleValue(ctx, "response")
+ if wantedResponse == "exception" {
+ return nil, grpc.Errorf(codes.InvalidArgument, "Error")
+ }
+
+ return &pb.PingResponse{ClientTime: req.ClientTime}, nil
+}
+
+func (s *server) PingServerStream(req *pb.PingRequest, stream pb.PingService_PingServerStreamServer) error {
+ ctx := stream.Context()
+ routing := getSingleValue(ctx, "routing")
+
+ if routing == "gitaly-ruby" {
+ return s.pingServerStreamGitalyRuby(req, stream)
+ }
+
+ wantedResponse := getSingleValue(ctx, "response")
+ if wantedResponse == "exception" {
+ return grpc.Errorf(codes.InvalidArgument, "Error")
+ }
+
+ for i := 0; i < 10; i++ {
+ stream.Send(&pb.PingResponse{ClientTime: req.ClientTime})
+ }
+
+ return nil
+}
+
+func (s *server) PingClientStream(stream pb.PingService_PingClientStreamServer) error {
+ ctx := stream.Context()
+ routing := getSingleValue(ctx, "routing")
+
+ if routing == "gitaly-ruby" {
+ return s.pingClientStreamGitalyRuby(stream)
+ }
+
+ wantedResponse := getSingleValue(ctx, "response")
+ if wantedResponse == "exception" {
+ return grpc.Errorf(codes.InvalidArgument, "Error")
+ }
+
+ for {
+ req, err := stream.Recv()
+ if err == io.EOF {
+ break
+ }
+
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (s *server) PingBidiStream(stream pb.PingService_PingBidiStreamServer) error {
+ ctx := stream.Context()
+ routing := getSingleValue(ctx, "routing")
+
+ if routing == "gitaly-ruby" {
+ return s.pingClientBidiGitalyRuby(stream)
+ }
+
+ wantedResponse := getSingleValue(ctx, "response")
+ if wantedResponse == "exception" {
+ return grpc.Errorf(codes.InvalidArgument, "Error")
+ }
+
+ for {
+ req, err := stream.Recv()
+ if err == io.EOF {
+ break
+ }
+
+ if err != nil {
+ return err
+ }
+
+ err = stream.Send(&pb.PingResponse{ClientTime: req.ClientTime})
+ if err {
+ return err
+ }
+ }
+ return nil
+}
+
+// NewServer creates a new instance of a grpc PingService Server
+func NewServer(rs *rubyserver.Server) pb.PingServiceServer {
+ return &server{rs}
+}