From e37b49201ff08d6ae8d844f6d43b5d84e4ac0e44 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Tue, 2 Nov 2021 15:49:11 +0100 Subject: [PATCH] fix: use IdleConnTimeout/ConnectTimeout This is an attempt to set sensible timeouts on abra connections. This might not be the last word on this but it seems that SSH connections now bail out correctly and other kinds of commands don't explode (e.g. logs). Closes https://git.coopcloud.tech/coop-cloud/organising/issues/222. Closes https://git.coopcloud.tech/coop-cloud/organising/issues/218. --- go.mod | 1 + pkg/client/client.go | 8 ++++---- pkg/client/context.go | 3 ++- pkg/{client => upstream}/commandconn/commandconn.go | 0 pkg/{client => upstream/commandconn}/connection.go | 11 +++++------ 5 files changed, 12 insertions(+), 11 deletions(-) rename pkg/{client => upstream}/commandconn/commandconn.go (100%) rename pkg/{client => upstream/commandconn}/connection.go (85%) diff --git a/go.mod b/go.mod index 68b607315..94d46c314 100644 --- a/go.mod +++ b/go.mod @@ -44,4 +44,5 @@ require ( github.com/sfreiberg/simplessh v0.0.0-20180301191542-495cbb862a9c github.com/theupdateframework/notary v0.7.0 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect + golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0 // indirect ) diff --git a/pkg/client/client.go b/pkg/client/client.go index fcd33899d..99ace904b 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -6,6 +6,7 @@ import ( "os" "time" + commandconnPkg "coopcloud.tech/abra/pkg/upstream/commandconn" "github.com/docker/docker/client" "github.com/sirupsen/logrus" ) @@ -14,8 +15,6 @@ import ( func New(contextName string) (*client.Client, error) { var clientOpts []client.Opt - clientOpts = append(clientOpts, client.WithTimeout(3*time.Second)) - if contextName != "default" { context, err := GetContext(contextName) if err != nil { @@ -27,11 +26,12 @@ func New(contextName string) (*client.Client, error) { return nil, err } - helper := newConnectionHelper(ctxEndpoint) + helper := commandconnPkg.NewConnectionHelper(ctxEndpoint) httpClient := &http.Client{ // No tls, no proxy Transport: &http.Transport{ - DialContext: helper.Dialer, + DialContext: helper.Dialer, + IdleConnTimeout: 30 * time.Second, }, } diff --git a/pkg/client/context.go b/pkg/client/context.go index bf7ff3115..0a56420f4 100644 --- a/pkg/client/context.go +++ b/pkg/client/context.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" + commandconnPkg "coopcloud.tech/abra/pkg/upstream/commandconn" command "github.com/docker/cli/cli/command" dConfig "github.com/docker/cli/cli/config" context "github.com/docker/cli/cli/context" @@ -44,7 +45,7 @@ func createContext(name string, host string) error { Endpoints: make(map[string]contextStore.EndpointTLSData), } - dockerEP, dockerTLS, err := getDockerEndpointMetadataAndTLS(host) + dockerEP, dockerTLS, err := commandconnPkg.GetDockerEndpointMetadataAndTLS(host) if err != nil { return err } diff --git a/pkg/client/commandconn/commandconn.go b/pkg/upstream/commandconn/commandconn.go similarity index 100% rename from pkg/client/commandconn/commandconn.go rename to pkg/upstream/commandconn/commandconn.go diff --git a/pkg/client/connection.go b/pkg/upstream/commandconn/connection.go similarity index 85% rename from pkg/client/connection.go rename to pkg/upstream/commandconn/connection.go index 430514b88..46dfc833b 100644 --- a/pkg/client/connection.go +++ b/pkg/upstream/commandconn/connection.go @@ -1,11 +1,10 @@ -package client +package commandconn import ( "context" "net" "net/url" - commandconnPkg "coopcloud.tech/abra/pkg/client/commandconn" "github.com/docker/cli/cli/connhelper" "github.com/docker/cli/cli/connhelper/ssh" "github.com/docker/cli/cli/context/docker" @@ -20,7 +19,7 @@ import ( // // ssh://@ URL requires Docker 18.09 or later on the remote host. func GetConnectionHelper(daemonURL string) (*connhelper.ConnectionHelper, error) { - return getConnectionHelper(daemonURL, nil) + return getConnectionHelper(daemonURL, []string{"-o ConnectTimeout=5"}) } func getConnectionHelper(daemonURL string, sshFlags []string) (*connhelper.ConnectionHelper, error) { @@ -36,7 +35,7 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*connhelper.Conne } return &connhelper.ConnectionHelper{ Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) { - return commandconnPkg.New(ctx, "ssh", append(sshFlags, sp.Args("docker", "system", "dial-stdio")...)...) + return New(ctx, "ssh", append(sshFlags, sp.Args("docker", "system", "dial-stdio")...)...) }, Host: "http://docker.example.com", }, nil @@ -46,7 +45,7 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*connhelper.Conne return nil, err } -func newConnectionHelper(daemonURL string) *connhelper.ConnectionHelper { +func NewConnectionHelper(daemonURL string) *connhelper.ConnectionHelper { helper, err := GetConnectionHelper(daemonURL) if err != nil { logrus.Fatal(err) @@ -74,7 +73,7 @@ func getDockerEndpoint(host string) (docker.Endpoint, error) { return ep, nil } -func getDockerEndpointMetadataAndTLS(host string) (docker.EndpointMeta, *dCliContextStore.EndpointTLSData, error) { +func GetDockerEndpointMetadataAndTLS(host string) (docker.EndpointMeta, *dCliContextStore.EndpointTLSData, error) { ep, err := getDockerEndpoint(host) if err != nil { return docker.EndpointMeta{}, nil, err