Explorar o código

Merge pull request #100 from gtardif/windows_grpc

Allow server to start on tcp port or if windows, named pipe rather than unix socket
Guillaume Tardif %!s(int64=5) %!d(string=hai) anos
pai
achega
2e8251fb2d
Modificáronse 6 ficheiros con 55 adicións e 5 borrados
  1. 4 3
      cli/cmd/serve.go
  2. 1 1
      go.mod
  3. 11 0
      server/server.go
  4. 16 0
      server/socket_unix.go
  5. 22 0
      server/socket_windows.go
  6. 1 1
      tests/framework/exec.go

+ 4 - 3
cli/cmd/serve.go

@@ -2,7 +2,6 @@ package cmd
 
 import (
 	"context"
-	"net"
 
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
@@ -39,10 +38,12 @@ func ServeCommand() *cobra.Command {
 func runServe(ctx context.Context, opts serveOpts) error {
 	s := server.New()
 
-	listener, err := net.Listen("unix", opts.address)
+	listener, err := server.CreateListener(opts.address)
+
 	if err != nil {
-		return errors.Wrap(err, "listen unix socket")
+		return errors.Wrap(err, "listen address "+opts.address)
 	}
+
 	// nolint errcheck
 	defer listener.Close()
 

+ 1 - 1
go.mod

@@ -11,7 +11,7 @@ require (
 	github.com/Azure/go-autorest/autorest/date v0.2.0
 	github.com/Azure/go-autorest/autorest/to v0.3.0
 	github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect
-	github.com/Microsoft/go-winio v0.4.14 // indirect
+	github.com/Microsoft/go-winio v0.4.14
 	github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129
 	github.com/compose-spec/compose-go v0.0.0-20200423124427-63dcf8c22cae
 	github.com/containerd/console v1.0.0

+ 11 - 0
server/server.go

@@ -30,6 +30,8 @@ package server
 import (
 	"context"
 	"errors"
+	"net"
+	"strings"
 
 	grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
 	"google.golang.org/grpc"
@@ -57,6 +59,15 @@ func New() *grpc.Server {
 	return s
 }
 
+
+//CreateListener creates a listener either on tcp://, or local listener, supporting unix:// for unix socket or npipe:// for named pipes on windows
+func CreateListener(address string) (net.Listener, error) {
+	if strings.HasPrefix(address, "tcp://") {
+		return net.Listen("tcp", strings.TrimPrefix(address, "tcp://"))
+	}
+	return createLocalListener(address)
+}
+
 func unary(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
 	return grpc_prometheus.UnaryServerInterceptor(ctx, req, info, handler)
 }

+ 16 - 0
server/socket_unix.go

@@ -0,0 +1,16 @@
+// +build !windows
+
+package server
+
+import (
+	"errors"
+	"net"
+	"strings"
+)
+
+func createLocalListener(address string) (net.Listener, error) {
+	if !strings.HasPrefix(address, "unix://") {
+		return nil, errors.New("Cannot parse address, must start with unix:// or tcp:// : " + address)
+	}
+	return net.Listen("unix", strings.TrimPrefix(address, "unix://"))
+}

+ 22 - 0
server/socket_windows.go

@@ -0,0 +1,22 @@
+// +build windows
+
+package server
+
+import (
+	"errors"
+	"net"
+	"strings"
+
+	"github.com/Microsoft/go-winio"
+)
+
+func createLocalListener(address string) (net.Listener, error) {
+	if !strings.HasPrefix(address, "npipe://") {
+		return nil, errors.New("Cannot parse address, must start with npipe:// or tcp:// : " + address)
+	}
+	return winio.ListenPipe(strings.TrimPrefix(address, "npipe://"), &winio.PipeConfig{
+		MessageMode:      true,  // Use message mode so that CloseWrite() is supported
+		InputBufferSize:  65536, // Use 64KB buffers to improve performance
+		OutputBufferSize: 65536,
+	})
+}

+ 1 - 1
tests/framework/exec.go

@@ -46,7 +46,7 @@ func NewCommand(command string, args ...string) *CmdContext {
 
 func dockerExecutable() string {
 	if runtime.GOOS == "windows" {
-		return "./bin/windows/docker.exe"
+		return "./bin/docker.exe"
 	}
 	return "./bin/docker"
 }