Merge pull request #100 from gtardif/windows_grpc

Allow server to start on tcp port or if windows, named pipe rather than unix socket
This commit is contained in:
Guillaume Tardif 2020-05-18 15:18:51 +02:00 committed by GitHub
commit 2e8251fb2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 55 additions and 5 deletions

View File

@ -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()

2
go.mod
View File

@ -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

View File

@ -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
server/socket_unix.go Normal file
View File

@ -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
server/socket_windows.go Normal file
View File

@ -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,
})
}

View File

@ -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"
}