diff --git a/Dockerfile b/Dockerfile index cc56ed1d3..94059faaf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get install -y -q --no-install-recommends \ WORKDIR /go/src/github.com/docker/cli -RUN git clone https://github.com/docker/cli . && git checkout 2432af701a7973ea582196b4b9488831156f3458 +RUN git clone https://github.com/docker/cli . && git checkout a1b83ffd2cbeefc0752e5aa7a543d49c1ddfd2cb RUN make binary-osx binary-windows binary && \ cp build/docker-linux-amd64 /usr/bin/docker diff --git a/Gopkg.lock b/Gopkg.lock index a281fd7cb..0d3e81598 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -210,7 +210,7 @@ [[projects]] branch = "19.03" - digest = "1:2f437f78f32178b2951314dd82649fda98e8f114e4d2c42588dd40fc2184a434" + digest = "1:40bdcf28756970bfa940ffcce99e7592d5511313ba950a842947736a9a386d5c" name = "github.com/docker/cli" packages = [ "cli", @@ -265,7 +265,7 @@ "types", ] pruneopts = "UT" - revision = "8aebc318062963ba861b65cc2a43425dfdd80fe7" + revision = "a1b83ffd2cbeefc0752e5aa7a543d49c1ddfd2cb" [[projects]] branch = "master" diff --git a/cmd/docker-app/main.go b/cmd/docker-app/main.go index 273b2ac3a..2977c7c62 100644 --- a/cmd/docker-app/main.go +++ b/cmd/docker-app/main.go @@ -27,5 +27,6 @@ func main() { SchemaVersion: "0.1.0", Vendor: "Docker Inc.", Version: internal.Version, + Experimental: true, }) } diff --git a/e2e/main_test.go b/e2e/main_test.go index 5be2b4fa2..5b8e3fac8 100644 --- a/e2e/main_test.go +++ b/e2e/main_test.go @@ -61,7 +61,9 @@ func (d dockerCliCommand) createTestCmd(ops ...ConfigFileOperator) (icmd.Cmd, fu cleanup := func() { os.RemoveAll(configDir) } - env := append(os.Environ(), "DOCKER_CONFIG="+configDir) + env := append(os.Environ(), + "DOCKER_CONFIG="+configDir, + "DOCKER_CLI_EXPERIMENTAL=enabled") // TODO: Remove this once docker app plugin is no more experimental return icmd.Cmd{Env: env}, cleanup } diff --git a/vendor/github.com/docker/cli/cli-plugins/manager/manager.go b/vendor/github.com/docker/cli/cli-plugins/manager/manager.go index e7cd2de40..e06286e9c 100644 --- a/vendor/github.com/docker/cli/cli-plugins/manager/manager.go +++ b/vendor/github.com/docker/cli/cli-plugins/manager/manager.go @@ -1,6 +1,7 @@ package manager import ( + "fmt" "io/ioutil" "os" "os/exec" @@ -27,10 +28,23 @@ func (e errPluginNotFound) Error() string { return "Error: No such CLI plugin: " + string(e) } +type errPluginRequireExperimental string + +// Note: errPluginRequireExperimental implements notFound so that the plugin +// is skipped when listing the plugins. +func (e errPluginRequireExperimental) NotFound() {} + +func (e errPluginRequireExperimental) Error() string { + return fmt.Sprintf("plugin candidate %q: requires experimental CLI", string(e)) +} + type notFound interface{ NotFound() } // IsNotFound is true if the given error is due to a plugin not being found. func IsNotFound(err error) bool { + if e, ok := err.(*pluginError); ok { + err = e.Cause() + } _, ok := err.(notFound) return ok } @@ -117,12 +131,14 @@ func ListPlugins(dockerCli command.Cli, rootcmd *cobra.Command) ([]Plugin, error continue } c := &candidate{paths[0]} - p, err := newPlugin(c, rootcmd) + p, err := newPlugin(c, rootcmd, dockerCli.ClientInfo().HasExperimental) if err != nil { return nil, err } - p.ShadowedPaths = paths[1:] - plugins = append(plugins, p) + if !IsNotFound(p.Err) { + p.ShadowedPaths = paths[1:] + plugins = append(plugins, p) + } } return plugins, nil @@ -159,12 +175,19 @@ func PluginRunCommand(dockerCli command.Cli, name string, rootcmd *cobra.Command } c := &candidate{path: path} - plugin, err := newPlugin(c, rootcmd) + plugin, err := newPlugin(c, rootcmd, dockerCli.ClientInfo().HasExperimental) if err != nil { return nil, err } if plugin.Err != nil { // TODO: why are we not returning plugin.Err? + + err := plugin.Err.(*pluginError).Cause() + // if an experimental plugin was invoked directly while experimental mode is off + // provide a more useful error message than "not found". + if err, ok := err.(errPluginRequireExperimental); ok { + return nil, err + } return nil, errPluginNotFound(name) } cmd := exec.Command(plugin.Path, args...) diff --git a/vendor/github.com/docker/cli/cli-plugins/manager/metadata.go b/vendor/github.com/docker/cli/cli-plugins/manager/metadata.go index d3de77814..19379034e 100644 --- a/vendor/github.com/docker/cli/cli-plugins/manager/metadata.go +++ b/vendor/github.com/docker/cli/cli-plugins/manager/metadata.go @@ -22,4 +22,7 @@ type Metadata struct { ShortDescription string `json:",omitempty"` // URL is a pointer to the plugin's homepage. URL string `json:",omitempty"` + // Experimental specifies whether the plugin is experimental. + // Experimental plugins are not displayed on non-experimental CLIs. + Experimental bool `json:",omitempty"` } diff --git a/vendor/github.com/docker/cli/cli-plugins/manager/plugin.go b/vendor/github.com/docker/cli/cli-plugins/manager/plugin.go index a8ac4fa3a..fc3ad693c 100644 --- a/vendor/github.com/docker/cli/cli-plugins/manager/plugin.go +++ b/vendor/github.com/docker/cli/cli-plugins/manager/plugin.go @@ -33,7 +33,9 @@ type Plugin struct { // is set, and is always a `pluginError`, but the `Plugin` is still // returned with no error. An error is only returned due to a // non-recoverable error. -func newPlugin(c Candidate, rootcmd *cobra.Command) (Plugin, error) { +// +// nolint: gocyclo +func newPlugin(c Candidate, rootcmd *cobra.Command, allowExperimental bool) (Plugin, error) { path := c.Path() if path == "" { return Plugin{}, errors.New("plugin candidate path cannot be empty") @@ -94,7 +96,10 @@ func newPlugin(c Candidate, rootcmd *cobra.Command) (Plugin, error) { p.Err = wrapAsPluginError(err, "invalid metadata") return p, nil } - + if p.Experimental && !allowExperimental { + p.Err = &pluginError{errPluginRequireExperimental(p.Name)} + return p, nil + } if p.Metadata.SchemaVersion != "0.1.0" { p.Err = NewPluginError("plugin SchemaVersion %q is not valid, must be 0.1.0", p.Metadata.SchemaVersion) return p, nil diff --git a/vendor/github.com/docker/cli/cli/command/cli.go b/vendor/github.com/docker/cli/cli/command/cli.go index 0f369f901..161163e00 100644 --- a/vendor/github.com/docker/cli/cli/command/cli.go +++ b/vendor/github.com/docker/cli/cli/command/cli.go @@ -14,7 +14,7 @@ import ( "github.com/docker/cli/cli/config/configfile" dcontext "github.com/docker/cli/cli/context" "github.com/docker/cli/cli/context/docker" - kubcontext "github.com/docker/cli/cli/context/kubernetes" + kubecontext "github.com/docker/cli/cli/context/kubernetes" "github.com/docker/cli/cli/context/store" "github.com/docker/cli/cli/debug" cliflags "github.com/docker/cli/cli/flags" @@ -530,6 +530,6 @@ func defaultContextStoreConfig() store.Config { return store.NewConfig( func() interface{} { return &DockerContext{} }, store.EndpointTypeGetter(docker.DockerEndpoint, func() interface{} { return &docker.EndpointMeta{} }), - store.EndpointTypeGetter(kubcontext.KubernetesEndpoint, func() interface{} { return &kubcontext.EndpointMeta{} }), + store.EndpointTypeGetter(kubecontext.KubernetesEndpoint, func() interface{} { return &kubecontext.EndpointMeta{} }), ) } diff --git a/vendor/github.com/docker/cli/cli/context/kubernetes/load.go b/vendor/github.com/docker/cli/cli/context/kubernetes/load.go index 97dded9b4..c218d94de 100644 --- a/vendor/github.com/docker/cli/cli/context/kubernetes/load.go +++ b/vendor/github.com/docker/cli/cli/context/kubernetes/load.go @@ -3,7 +3,7 @@ package kubernetes import ( "github.com/docker/cli/cli/context" "github.com/docker/cli/cli/context/store" - "github.com/docker/cli/kubernetes" + api "github.com/docker/compose-on-kubernetes/api" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -91,5 +91,5 @@ func ConfigFromContext(name string, s store.Reader) (clientcmd.ClientConfig, err return ep.KubernetesConfig(), nil } // context has no kubernetes endpoint - return kubernetes.NewKubernetesConfig(""), nil + return api.NewKubernetesConfig(""), nil } diff --git a/vendor/github.com/docker/cli/kubernetes/config.go b/vendor/github.com/docker/cli/kubernetes/config.go deleted file mode 100644 index 8ec85c219..000000000 --- a/vendor/github.com/docker/cli/kubernetes/config.go +++ /dev/null @@ -1,8 +0,0 @@ -package kubernetes - -import api "github.com/docker/compose-on-kubernetes/api" - -// NewKubernetesConfig resolves the path to the desired Kubernetes configuration file based on -// the KUBECONFIG environment variable and command line flags. -// Deprecated: Use github.com/docker/compose-on-kubernetes/api.NewKubernetesConfig instead -var NewKubernetesConfig = api.NewKubernetesConfig