This removes the need for the core context code to import `github.com/docker/cli/cli/context/kubernetes` which in turn reduces the transitive import tree in this file to not pull in all of Kubernetes. Note that this means that any calling code which is interested in the kubernetes endpoint must import `github.com/docker/cli/cli/context/kubernetes` itself somewhere in order to trigger the dynamic registration. In practice anything which is interested in Kubernetes must import that package (e.g. `./cli/command/context.list` does for the `EndpointFromContext` function) to do anything useful, so this restriction is not too onerous. As a special case a small amount of Kubernetes related logic remains in `ResolveDefaultContext` to handle error handling when the stack orchestrator includes Kubernetes. In order to avoid a circular import loop this hardcodes the kube endpoint name. Similarly to avoid an import loop the existing `TestDefaultContextInitializer` cannot continue to unit test for the Kubernetes case, so that aspect of the test is carved off into a very similar test in the kubernetes context package. Lastly, note that the kubernetes endpoint is now modifiable via `WithContextEndpointType`. Signed-off-by: Ian Campbell <ijc@docker.com>
106 lines
2.9 KiB
Go
106 lines
2.9 KiB
Go
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/docker/cli/cli/context/docker"
|
|
"github.com/docker/cli/cli/context/store"
|
|
"github.com/docker/cli/cli/streams"
|
|
clitypes "github.com/docker/cli/types"
|
|
"github.com/docker/docker/pkg/term"
|
|
)
|
|
|
|
// DockerCliOption applies a modification on a DockerCli.
|
|
type DockerCliOption func(cli *DockerCli) error
|
|
|
|
// WithStandardStreams sets a cli in, out and err streams with the standard streams.
|
|
func WithStandardStreams() DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
// Set terminal emulation based on platform as required.
|
|
stdin, stdout, stderr := term.StdStreams()
|
|
cli.in = streams.NewIn(stdin)
|
|
cli.out = streams.NewOut(stdout)
|
|
cli.err = stderr
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithCombinedStreams uses the same stream for the output and error streams.
|
|
func WithCombinedStreams(combined io.Writer) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.out = streams.NewOut(combined)
|
|
cli.err = combined
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithInputStream sets a cli input stream.
|
|
func WithInputStream(in io.ReadCloser) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.in = streams.NewIn(in)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithOutputStream sets a cli output stream.
|
|
func WithOutputStream(out io.Writer) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.out = streams.NewOut(out)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithErrorStream sets a cli error stream.
|
|
func WithErrorStream(err io.Writer) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.err = err
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithContentTrustFromEnv enables content trust on a cli from environment variable DOCKER_CONTENT_TRUST value.
|
|
func WithContentTrustFromEnv() DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.contentTrust = false
|
|
if e := os.Getenv("DOCKER_CONTENT_TRUST"); e != "" {
|
|
if t, err := strconv.ParseBool(e); t || err != nil {
|
|
// treat any other value as true
|
|
cli.contentTrust = true
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithContentTrust enables content trust on a cli.
|
|
func WithContentTrust(enabled bool) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.contentTrust = enabled
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithContainerizedClient sets the containerized client constructor on a cli.
|
|
func WithContainerizedClient(containerizedFn func(string) (clitypes.ContainerizedClient, error)) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
cli.newContainerizeClient = containerizedFn
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithContextEndpointType add support for an additional typed endpoint in the context store
|
|
// Plugins should use this to store additional endpoints configuration in the context store
|
|
func WithContextEndpointType(endpointName string, endpointType store.TypeGetter) DockerCliOption {
|
|
return func(cli *DockerCli) error {
|
|
switch endpointName {
|
|
case docker.DockerEndpoint:
|
|
return fmt.Errorf("cannot change %q endpoint type", endpointName)
|
|
}
|
|
cli.contextStoreConfig.SetEndpoint(endpointName, endpointType)
|
|
return nil
|
|
}
|
|
}
|