Skip to content

Commit 1e7dd46

Browse files
committed
WIP: we don't need a client to resolve the context
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 5f28fb6 commit 1e7dd46

3 files changed

Lines changed: 37 additions & 26 deletions

File tree

cli/command/cli.go

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ type DockerCli struct {
8181
contextStore store.Store
8282
init sync.Once
8383
initErr error
84-
dockerEndpoint docker.Endpoint
8584
contextStoreConfig store.Config
8685
initTimeout time.Duration
8786
}
@@ -153,7 +152,7 @@ func (cli *DockerCli) loadConfigFile() {
153152
// ServerInfo returns the server version details for the host this client is
154153
// connected to
155154
func (cli *DockerCli) ServerInfo() ServerInfo {
156-
// TODO(thaJeztah) make ServerInfo() lazily load the info (ping only when needed)
155+
_ = cli.initialize()
157156
return cli.serverInfo
158157
}
159158

@@ -329,7 +328,7 @@ func (cli *DockerCli) getInitTimeout() time.Duration {
329328
return defaultInitTimeout
330329
}
331330

332-
func (cli *DockerCli) initializeFromClient() {
331+
func (cli *DockerCli) initializeFromClient(apiClient client.APIClient) ServerInfo {
333332
ctx := context.Background()
334333
if !strings.HasPrefix(cli.DockerEndpoint().Host, "ssh://") {
335334
// @FIXME context.WithTimeout doesn't work with connhelper / ssh connections
@@ -339,24 +338,22 @@ func (cli *DockerCli) initializeFromClient() {
339338
defer cancel()
340339
}
341340

342-
ping, err := cli.client.Ping(ctx)
341+
ping, err := apiClient.Ping(ctx)
343342
if err != nil {
344343
// Default to true if we fail to connect to daemon
345-
cli.serverInfo = ServerInfo{HasExperimental: true}
346-
347344
if ping.APIVersion != "" {
348-
cli.client.NegotiateAPIVersionPing(ping)
345+
apiClient.NegotiateAPIVersionPing(ping)
349346
}
350-
return
347+
return ServerInfo{HasExperimental: true}
351348
}
349+
apiClient.NegotiateAPIVersionPing(ping)
352350

353-
cli.serverInfo = ServerInfo{
351+
return ServerInfo{
354352
HasExperimental: ping.Experimental,
355353
OSType: ping.OSType,
356354
BuildkitVersion: ping.BuilderVersion,
357355
SwarmStatus: ping.SwarmStatus,
358356
}
359-
cli.client.NegotiateAPIVersionPing(ping)
360357
}
361358

362359
// NotaryClient provides a Notary Repository to interact with signed metadata for an image
@@ -428,27 +425,39 @@ func resolveContextName(opts *cliflags.ClientOptions, config *configfile.ConfigF
428425

429426
// DockerEndpoint returns the current docker endpoint
430427
func (cli *DockerCli) DockerEndpoint() docker.Endpoint {
431-
if err := cli.initialize(); err != nil {
432-
// Note that we're not terminating here, as this function may be used
433-
// in cases where we're able to continue.
434-
_, _ = fmt.Fprintf(cli.Err(), "Failed to initialize: %s\n", cli.initErr)
428+
ep, _ := cli.getDockerEndPoint()
429+
// if err != nil {
430+
// // This fails if no contextStore is configured; we should fall
431+
// // back to using default, but only if resolveContextName uses
432+
// // DefaultContextName.
433+
// ep1, err := ResolveDefaultContext(cli.options, storeConfig)
434+
// ep = ep1.(docker.Endpoint)
435+
// panic(err)
436+
// }
437+
return ep
438+
}
439+
440+
func (cli *DockerCli) getDockerEndPoint() (ep docker.Endpoint, err error) {
441+
if cn := cli.CurrentContext(); cn == DefaultContextName {
442+
return resolveDefaultDockerEndpoint(cli.options)
443+
} else {
444+
return resolveDockerEndpoint(cli.contextStore, cn)
435445
}
436-
return cli.dockerEndpoint
437446
}
438447

439448
func (cli *DockerCli) initialize() error {
440449
cli.init.Do(func() {
441-
cli.dockerEndpoint, cli.initErr = resolveDockerEndpoint(cli.contextStore, resolveContextName(cli.options, cli.configFile))
442-
if cli.initErr != nil {
443-
cli.initErr = errors.Wrap(cli.initErr, "unable to resolve docker endpoint")
444-
return
445-
}
446450
if cli.client == nil {
447-
if cli.client, cli.initErr = newAPIClientFromEndpoint(cli.dockerEndpoint, cli.configFile); cli.initErr != nil {
451+
var ep docker.Endpoint
452+
ep, cli.initErr = cli.getDockerEndPoint()
453+
if cli.initErr != nil {
454+
return
455+
}
456+
if cli.client, cli.initErr = newAPIClientFromEndpoint(ep, cli.configFile); cli.initErr != nil {
448457
return
449458
}
450459
}
451-
cli.initializeFromClient()
460+
cli.serverInfo = cli.initializeFromClient(cli.client)
452461
})
453462
return cli.initErr
454463
}

cli/command/cli_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,12 @@ func TestInitializeFromClient(t *testing.T) {
160160
}
161161

162162
cli := &DockerCli{
163-
client: apiclient,
164-
err: io.Discard,
163+
client: apiclient,
164+
err: io.Discard,
165+
options: flags.NewClientOptions(),
165166
}
166-
cli.initializeFromClient()
167+
err := cli.initialize()
168+
assert.NilError(t, err)
167169
assert.DeepEqual(t, cli.ServerInfo(), testcase.expectedServer)
168170
assert.Equal(t, apiclient.negotiated, testcase.negotiated)
169171
})

e2e/global/cli_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestTLSVerify(t *testing.T) {
2121
// Regardless of whether we specify true or false we need to
2222
// test to make sure tls is turned on if --tlsverify is specified at all
2323
result := icmd.RunCmd(icmd.Command("docker", "--tlsverify=false", "ps"))
24-
result.Assert(t, icmd.Expected{ExitCode: 1, Err: "unable to resolve docker endpoint:"})
24+
result.Assert(t, icmd.Expected{ExitCode: 1, Err: "Failed to initialize:"})
2525

2626
result = icmd.RunCmd(icmd.Command("docker", "--tlsverify=true", "ps"))
2727
result.Assert(t, icmd.Expected{ExitCode: 1, Err: "ca.pem"})

0 commit comments

Comments
 (0)