diff options
author | Andrew Newdigate <andrew@gitlab.com> | 2017-10-05 14:42:54 +0300 |
---|---|---|
committer | Andrew Newdigate <andrew@gitlab.com> | 2017-10-05 14:42:54 +0300 |
commit | 3792a75d135888e022e1ed3e01fcd3e5b24979ae (patch) | |
tree | 7faa638a43b73ef6821d94e8f1ad945c012a37f6 | |
parent | 3068412934d735d8d29f299275983037cfe1368a (diff) |
ping service
-rw-r--r-- | internal/service/ping/gitaly_ruby_proxy.go | 20 | ||||
-rw-r--r-- | internal/service/ping/server.go | 128 |
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} +} |