Fix bug where we shell out to Moby cli only if context == default. We must shell out to Moby cli for any context of type “Moby”, not only the default context.

This commit is contained in:
Guillaume Tardif 2020-06-17 23:12:50 +02:00
parent fe57e4c159
commit 3981244701
5 changed files with 23 additions and 18 deletions

View File

@ -19,12 +19,13 @@ const ComDockerCli = "com.docker.cli"
// Exec delegates to com.docker.cli if on moby context
func Exec(ctx context.Context) {
currentContext := apicontext.CurrentContext(ctx)
s := store.ContextStore(ctx)
_, err := s.Get(currentContext)
currentCtx, err := s.Get(currentContext)
// Only run original docker command if the current context is not
// ours.
if err != nil {
if err != nil || currentCtx.Type() == store.DefaultContextType {
shellOut(ctx)
}
}

View File

@ -12,7 +12,7 @@ type DockerContext struct {
// Type the context type
func (m *DockerContext) Type() string {
if m.Metadata.Type == "" {
return defaultContextType
return DefaultContextType
}
return m.Metadata.Type
}

View File

@ -45,6 +45,17 @@ import (
const (
// DefaultContextName is an automatically generated local context
DefaultContextName = "default"
// DefaultContextType is the type for all moby contexts (not associated with cli backend)
DefaultContextType = "moby"
// AciContextType is the endpoint key in the context endpoints for an ACI
// backend
AciContextType = "aci"
// LocalContextType is the endpoint key in the context endpoints for a new
// local backend
LocalContextType = "local"
// ExampleContextType is the endpoint key in the context endpoints for an
// example backend
ExampleContextType = "example"
)
const (
@ -92,18 +103,6 @@ type Endpoint struct {
DefaultNamespace string `json:",omitempty"`
}
const (
// AciContextType is the endpoint key in the context endpoints for an ACI
// backend
AciContextType = "aci"
// LocalContextType is the endpoint key in the context endpoints for a new
// local backend
LocalContextType = "local"
// ExampleContextType is the endpoint key in the context endpoints for an
// example backend
ExampleContextType = "example"
)
type store struct {
root string
}

View File

@ -8,8 +8,6 @@ import (
"github.com/pkg/errors"
)
const defaultContextType = "moby"
// Represents a context as created by the docker cli
type defaultContext struct {
Metadata ContextMetadata
@ -67,7 +65,7 @@ func dockerDefaultContext() (*DockerContext, error) {
},
},
Metadata: ContextMetadata{
Type: defaultContextType,
Type: DefaultContextType,
Description: "Current DOCKER_HOST based configuration",
StackOrchestrator: defaultCtx.Metadata.StackOrchestrator,
},

View File

@ -169,6 +169,13 @@ func (s *E2eSuite) TestLegacy() {
output := s.NewDockerCommand("run", "--rm", "hello-world").WithTimeout(time.NewTimer(20 * time.Second).C).ExecOrDie()
Expect(output).To(ContainSubstring("Hello from Docker!"))
})
It("should execute legacy commands in other moby contexts", func() {
s.NewDockerCommand("context", "create", "mobyCtx", "--from=default").ExecOrDie()
s.NewDockerCommand("context", "use", "mobyCtx").ExecOrDie()
output, _ := s.NewDockerCommand("swarm", "join").Exec()
Expect(output).To(ContainSubstring("\"docker swarm join\" requires exactly 1 argument."))
})
}
func (s *E2eSuite) TestLeaveLegacyErrorMessagesUnchanged() {