From ec5afcfd4ddf7d5bdec80180fe944f60fa21ff49 Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Fri, 4 Dec 2020 18:09:12 +0100 Subject: [PATCH 1/4] =?UTF-8?q?`compose=20up`=20and=20other=20compose=20co?= =?UTF-8?q?mmands=20running=20on=20=E2=80=9CMoby=E2=80=9D=20context=20type?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guillaume Tardif --- api/client/client.go | 16 +++++++++++++++- cli/cmd/compose/build.go | 2 +- cli/cmd/compose/compose.go | 18 +----------------- cli/cmd/compose/convert.go | 2 +- cli/cmd/compose/down.go | 2 +- cli/cmd/compose/list.go | 2 +- cli/cmd/compose/logs.go | 2 +- cli/cmd/compose/ps.go | 2 +- cli/cmd/compose/pull.go | 2 +- cli/cmd/compose/push.go | 2 +- cli/cmd/compose/up.go | 4 ++-- local/e2e/compose_test.go | 12 ++++-------- 12 files changed, 30 insertions(+), 36 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index ffcdad19e..10c0bbdab 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -32,6 +32,15 @@ import ( // New returns a backend client associated with current context func New(ctx context.Context) (*Client, error) { + return newWithDefaultBackend(ctx, "") +} + +// NewWithDefaultLocalBackend returns a backend client associated with current context or local backend if on default context type +func NewWithDefaultLocalBackend(ctx context.Context) (*Client, error) { + return newWithDefaultBackend(ctx, store.LocalContextType) +} + +func newWithDefaultBackend(ctx context.Context, defaultBackend string) (*Client, error) { currentContext := apicontext.CurrentContext(ctx) s := store.ContextStore(ctx) @@ -40,7 +49,12 @@ func New(ctx context.Context) (*Client, error) { return nil, err } - service, err := backend.Get(ctx, cc.Type()) + backendName := cc.Type() + if backendName == store.DefaultContextType && defaultBackend != "" { + backendName = defaultBackend + } + + service, err := backend.Get(ctx, backendName) if err != nil { return nil, err } diff --git a/cli/cmd/compose/build.go b/cli/cmd/compose/build.go index 2c6817a17..1433650bf 100644 --- a/cli/cmd/compose/build.go +++ b/cli/cmd/compose/build.go @@ -45,7 +45,7 @@ func buildCommand() *cobra.Command { } func runBuild(ctx context.Context, opts buildOptions, services []string) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/compose.go b/cli/cmd/compose/compose.go index f8012cc4f..4105767a0 100644 --- a/cli/cmd/compose/compose.go +++ b/cli/cmd/compose/compose.go @@ -17,16 +17,12 @@ package compose import ( - "context" - "github.com/compose-spec/compose-go/cli" "github.com/compose-spec/compose-go/types" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/docker/compose-cli/api/client" "github.com/docker/compose-cli/context/store" - "github.com/docker/compose-cli/errdefs" ) type composeOptions struct { @@ -76,9 +72,6 @@ func Command(contextType string) *cobra.Command { command := &cobra.Command{ Short: "Docker Compose", Use: "compose", - PersistentPreRunE: func(cmd *cobra.Command, args []string) error { - return checkComposeSupport(cmd.Context()) - }, } command.AddCommand( @@ -90,7 +83,7 @@ func Command(contextType string) *cobra.Command { convertCommand(), ) - if contextType == store.LocalContextType { + if contextType == store.LocalContextType || contextType == store.DefaultContextType { command.AddCommand( buildCommand(), pushCommand(), @@ -101,15 +94,6 @@ func Command(contextType string) *cobra.Command { return command } -func checkComposeSupport(ctx context.Context) error { - _, err := client.New(ctx) - if errdefs.IsNotFoundError(err) { - return errdefs.ErrNotImplemented - } - - return err -} - // func filter(project *types.Project, services []string) error { if len(services) == 0 { diff --git a/cli/cmd/compose/convert.go b/cli/cmd/compose/convert.go index aa9d62ac0..29207ad56 100644 --- a/cli/cmd/compose/convert.go +++ b/cli/cmd/compose/convert.go @@ -46,7 +46,7 @@ func convertCommand() *cobra.Command { func runConvert(ctx context.Context, opts composeOptions) error { var json []byte - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/down.go b/cli/cmd/compose/down.go index 3519d394e..bca2fc105 100644 --- a/cli/cmd/compose/down.go +++ b/cli/cmd/compose/down.go @@ -41,7 +41,7 @@ func downCommand() *cobra.Command { } func runDown(ctx context.Context, opts composeOptions) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/list.go b/cli/cmd/compose/list.go index 27847af1b..01730b413 100644 --- a/cli/cmd/compose/list.go +++ b/cli/cmd/compose/list.go @@ -43,7 +43,7 @@ func listCommand() *cobra.Command { } func runList(ctx context.Context, opts composeOptions) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/logs.go b/cli/cmd/compose/logs.go index 4f08f3aad..aa58f68be 100644 --- a/cli/cmd/compose/logs.go +++ b/cli/cmd/compose/logs.go @@ -41,7 +41,7 @@ func logsCommand() *cobra.Command { } func runLogs(ctx context.Context, opts composeOptions) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/ps.go b/cli/cmd/compose/ps.go index a70753536..235443d0d 100644 --- a/cli/cmd/compose/ps.go +++ b/cli/cmd/compose/ps.go @@ -45,7 +45,7 @@ func psCommand() *cobra.Command { } func runPs(ctx context.Context, opts composeOptions) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/pull.go b/cli/cmd/compose/pull.go index f757ebb42..27b285267 100644 --- a/cli/cmd/compose/pull.go +++ b/cli/cmd/compose/pull.go @@ -46,7 +46,7 @@ func pullCommand() *cobra.Command { } func runPull(ctx context.Context, opts pullOptions, services []string) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/push.go b/cli/cmd/compose/push.go index cb5b018f1..9f19d3418 100644 --- a/cli/cmd/compose/push.go +++ b/cli/cmd/compose/push.go @@ -46,7 +46,7 @@ func pushCommand() *cobra.Command { } func runPush(ctx context.Context, opts pushOptions, services []string) error { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return err } diff --git a/cli/cmd/compose/up.go b/cli/cmd/compose/up.go index 14fa2cba4..6a06c8cf1 100644 --- a/cli/cmd/compose/up.go +++ b/cli/cmd/compose/up.go @@ -38,7 +38,7 @@ func upCommand(contextType string) *cobra.Command { Use: "up [SERVICE...]", RunE: func(cmd *cobra.Command, args []string) error { switch contextType { - case store.LocalContextType: + case store.LocalContextType, store.DefaultContextType: return runCreateStart(cmd.Context(), opts, args) default: return runUp(cmd.Context(), opts, args) @@ -100,7 +100,7 @@ func runCreateStart(ctx context.Context, opts composeOptions, services []string) } func setup(ctx context.Context, opts composeOptions, services []string) (*client.Client, *types.Project, error) { - c, err := client.New(ctx) + c, err := client.NewWithDefaultLocalBackend(ctx) if err != nil { return nil, nil, err } diff --git a/local/e2e/compose_test.go b/local/e2e/compose_test.go index 806c179f8..f17c8e3d1 100644 --- a/local/e2e/compose_test.go +++ b/local/e2e/compose_test.go @@ -30,8 +30,6 @@ import ( func TestLocalComposeUp(t *testing.T) { c := NewParallelE2eCLI(t, binDir) - c.RunDockerCmd("context", "create", "local", "test-context").Assert(t, icmd.Success) - c.RunDockerCmd("context", "use", "test-context").Assert(t, icmd.Success) const projectName = "compose-e2e-demo" @@ -54,12 +52,12 @@ func TestLocalComposeUp(t *testing.T) { output := HTTPGetWithRetry(t, endpoint+"/words/noun", http.StatusOK, 2*time.Second, 20*time.Second) assert.Assert(t, strings.Contains(output, `"word":`)) - res = c.RunDockerCmd("--context", "default", "network", "ls") + res = c.RunDockerCmd("network", "ls") res.Assert(t, icmd.Expected{Out: projectName + "_default"}) }) t.Run("check compose labels", func(t *testing.T) { - res := c.RunDockerCmd("--context", "default", "inspect", projectName+"_web_1") + res := c.RunDockerCmd("inspect", projectName+"_web_1") res.Assert(t, icmd.Expected{Out: `"com.docker.compose.container-number": "1"`}) res.Assert(t, icmd.Expected{Out: `"com.docker.compose.project": "compose-e2e-demo"`}) res.Assert(t, icmd.Expected{Out: `"com.docker.compose.oneoff": "False",`}) @@ -69,7 +67,7 @@ func TestLocalComposeUp(t *testing.T) { res.Assert(t, icmd.Expected{Out: `"com.docker.compose.service": "web"`}) res.Assert(t, icmd.Expected{Out: `"com.docker.compose.version":`}) - res = c.RunDockerCmd("--context", "default", "network", "inspect", projectName+"_default") + res = c.RunDockerCmd("network", "inspect", projectName+"_default") res.Assert(t, icmd.Expected{Out: `"com.docker.compose.network": "default"`}) res.Assert(t, icmd.Expected{Out: `"com.docker.compose.project": `}) res.Assert(t, icmd.Expected{Out: `"com.docker.compose.version": `}) @@ -85,15 +83,13 @@ func TestLocalComposeUp(t *testing.T) { }) t.Run("check networks after down", func(t *testing.T) { - res := c.RunDockerCmd("--context", "default", "network", "ls") + res := c.RunDockerCmd("network", "ls") assert.Assert(t, !strings.Contains(res.Combined(), projectName), res.Combined()) }) } func TestLocalComposeVolume(t *testing.T) { c := NewParallelE2eCLI(t, binDir) - c.RunDockerCmd("context", "create", "local", "test-context").Assert(t, icmd.Success) - c.RunDockerCmd("context", "use", "test-context").Assert(t, icmd.Success) const projectName = "compose-e2e-volume" From a6316a90c73fce8bb38b8fa6fd914b41489ea30f Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Mon, 7 Dec 2020 12:56:27 +0100 Subject: [PATCH 2/4] Removed test checking compose has an error message on default context Signed-off-by: Guillaume Tardif --- tests/e2e/e2e_test.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index d06154904..eb49bc693 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -47,23 +47,6 @@ func TestMain(m *testing.M) { os.Exit(exitCode) } -func TestComposeNotImplemented(t *testing.T) { - c := NewParallelE2eCLI(t, binDir) - res := c.RunDockerCmd("context", "show") - res.Assert(t, icmd.Expected{Out: "default"}) - res = c.RunDockerOrExitError("compose", "up") - res.Assert(t, icmd.Expected{ - ExitCode: 1, - Err: `Command "compose up" not available in current context (default)`, - }) - - res = c.RunDockerOrExitError("compose", "-f", "titi.yaml", "up") - res.Assert(t, icmd.Expected{ - ExitCode: 1, - Err: `Command "compose up" not available in current context (default)`, - }) -} - func TestContextDefault(t *testing.T) { c := NewParallelE2eCLI(t, binDir) From 6fc8eefb1bdea421bdb0990db9d79901ac8fa34b Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Mon, 7 Dec 2020 13:52:31 +0100 Subject: [PATCH 3/4] Remove build flag for local backend Signed-off-by: Guillaume Tardif --- .github/workflows/ci.yml | 4 ++-- Makefile | 6 +++--- local/backend.go | 2 -- local/build.go | 2 -- local/compose.go | 4 +--- local/compose_test.go | 2 -- local/container.go | 2 -- local/containers.go | 2 -- local/convergence.go | 2 -- local/convert.go | 2 -- local/convert_test.go | 2 -- local/dependencies.go | 2 -- local/dependencies_test.go | 2 -- local/labels.go | 2 -- local/util.go | 2 -- local/volumes.go | 2 -- 16 files changed, 6 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e222673f..ef59f9150 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,12 +60,12 @@ jobs: - name: Test env: - BUILD_TAGS: example,local + BUILD_TAGS: example run: make -f builder.Makefile test - name: Build for local E2E env: - BUILD_TAGS: example,local,e2e + BUILD_TAGS: example,e2e run: make -f builder.Makefile cli - name: E2E Test diff --git a/Makefile b/Makefile index 4a85885e2..c6cff2f35 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ protos: ## Generate go code from .proto files cli: ## Compile the cli @docker build . --target cli \ --platform local \ - --build-arg BUILD_TAGS=example,local,e2e \ + --build-arg BUILD_TAGS=example,e2e \ --build-arg GIT_TAG=$(GIT_TAG) \ --output ./bin @@ -63,7 +63,7 @@ cross: ## Compile the CLI for linux, darwin and windows test: ## Run unit tests @docker build . \ - --build-arg BUILD_TAGS=example,local \ + --build-arg BUILD_TAGS=example \ --build-arg GIT_TAG=$(GIT_TAG) \ --target test @@ -72,7 +72,7 @@ cache-clear: ## Clear the builder cache lint: ## run linter(s) @docker build . \ - --build-arg BUILD_TAGS=example,local,e2e \ + --build-arg BUILD_TAGS=example,e2e \ --build-arg GIT_TAG=$(GIT_TAG) \ --target lint diff --git a/local/backend.go b/local/backend.go index a97871f33..de0380e1c 100644 --- a/local/backend.go +++ b/local/backend.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/build.go b/local/build.go index 56ace5cf7..5efdc76dd 100644 --- a/local/build.go +++ b/local/build.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/compose.go b/local/compose.go index 1d8b44305..0a3739483 100644 --- a/local/compose.go +++ b/local/compose.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors @@ -502,7 +500,7 @@ func (s *composeService) Down(ctx context.Context, projectName string) error { func (s *composeService) removeContainers(ctx context.Context, w progress.Writer, eg *errgroup.Group, filter filters.Args) error { containers, err := s.apiClient.ContainerList(ctx, moby.ContainerListOptions{ Filters: filter, - All: true, + All: true, }) if err != nil { return err diff --git a/local/compose_test.go b/local/compose_test.go index fa406709c..d035875a4 100644 --- a/local/compose_test.go +++ b/local/compose_test.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/container.go b/local/container.go index 4ebdddee4..a82fd8c03 100644 --- a/local/container.go +++ b/local/container.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/containers.go b/local/containers.go index 24912e4ec..b05e56992 100644 --- a/local/containers.go +++ b/local/containers.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/convergence.go b/local/convergence.go index 21a51f791..e62a566f3 100644 --- a/local/convergence.go +++ b/local/convergence.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/convert.go b/local/convert.go index f0b834a7b..2b567f9df 100644 --- a/local/convert.go +++ b/local/convert.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/convert_test.go b/local/convert_test.go index 987b6c98a..fa93138db 100644 --- a/local/convert_test.go +++ b/local/convert_test.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/dependencies.go b/local/dependencies.go index 6d6cc5159..ecfe06b45 100644 --- a/local/dependencies.go +++ b/local/dependencies.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/dependencies_test.go b/local/dependencies_test.go index 41b31e7eb..736bb50c8 100644 --- a/local/dependencies_test.go +++ b/local/dependencies_test.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/labels.go b/local/labels.go index e0ca60100..2fd388f59 100644 --- a/local/labels.go +++ b/local/labels.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/util.go b/local/util.go index c49af75dd..6aef20703 100644 --- a/local/util.go +++ b/local/util.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors diff --git a/local/volumes.go b/local/volumes.go index 2f56d4444..2fbf08b77 100644 --- a/local/volumes.go +++ b/local/volumes.go @@ -1,5 +1,3 @@ -// +build local - /* Copyright 2020 Docker Compose CLI authors From fea0cf8c825b0d68576a301f692075103e056178 Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Mon, 7 Dec 2020 14:46:31 +0100 Subject: [PATCH 4/4] Fix linter Signed-off-by: Guillaume Tardif --- local/compose.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/local/compose.go b/local/compose.go index 0a3739483..ccb7d09ef 100644 --- a/local/compose.go +++ b/local/compose.go @@ -804,7 +804,7 @@ func getContainerCreateOptions(p *types.Project, s types.ServiceConfig, number i StopTimeout: toSeconds(s.StopGracePeriod), } - mountOptions, err := buildContainerMountOptions(p, s, inherit) + mountOptions, err := buildContainerMountOptions(s, inherit) if err != nil { return nil, nil, nil, err } @@ -851,7 +851,7 @@ func buildContainerBindingOptions(s types.ServiceConfig) nat.PortMap { return bindings } -func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit *moby.Container) ([]mount.Mount, error) { +func buildContainerMountOptions(s types.ServiceConfig, inherit *moby.Container) ([]mount.Mount, error) { mounts := []mount.Mount{} var inherited []string if inherit != nil {