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