diff --git a/cmd/compose/backend.go b/cmd/compose/backend.go new file mode 100644 index 000000000..fd70d723c --- /dev/null +++ b/cmd/compose/backend.go @@ -0,0 +1,46 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package compose + +import ( + "context" + "time" + + "github.com/docker/cli/cli/command" + + "github.com/docker/compose/v5/pkg/api" + "github.com/docker/compose/v5/pkg/compose" +) + +// withBackend creates a compose backend and passes it to fn. +func withBackend(ctx context.Context, dockerCli command.Cli, opts *BackendOptions, fn func(api.Compose) error) error { + backend, err := compose.NewComposeService(dockerCli, opts.Options...) + if err != nil { + return err + } + return fn(backend) +} + +// optionalTimeout converts an integer timeout (in seconds) into a *time.Duration. +// If changed is false, nil is returned (no timeout was explicitly set). +func optionalTimeout(t int, changed bool) *time.Duration { + if !changed { + return nil + } + d := time.Duration(t) * time.Second + return &d +} diff --git a/cmd/compose/kill.go b/cmd/compose/kill.go index ee488d2ec..a577c4c77 100644 --- a/cmd/compose/kill.go +++ b/cmd/compose/kill.go @@ -26,7 +26,6 @@ import ( "github.com/spf13/cobra" "github.com/docker/compose/v5/pkg/api" - "github.com/docker/compose/v5/pkg/compose" "github.com/docker/compose/v5/pkg/utils" ) @@ -63,19 +62,17 @@ func runKill(ctx context.Context, dockerCli command.Cli, backendOptions *Backend return err } - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + err := backend.Kill(ctx, name, api.KillOptions{ + RemoveOrphans: opts.removeOrphans, + Project: project, + Services: services, + Signal: opts.signal, + }) + if errors.Is(err, api.ErrNoResources) { + _, _ = fmt.Fprintln(stdinfo(dockerCli), "No container to kill") + return nil + } return err - } - err = backend.Kill(ctx, name, api.KillOptions{ - RemoveOrphans: opts.removeOrphans, - Project: project, - Services: services, - Signal: opts.signal, }) - if errors.Is(err, api.ErrNoResources) { - _, _ = fmt.Fprintln(stdinfo(dockerCli), "No container to kill") - return nil - } - return err } diff --git a/cmd/compose/pause.go b/cmd/compose/pause.go index bb4cedba2..c28b247ce 100644 --- a/cmd/compose/pause.go +++ b/cmd/compose/pause.go @@ -23,7 +23,6 @@ import ( "github.com/spf13/cobra" "github.com/docker/compose/v5/pkg/api" - "github.com/docker/compose/v5/pkg/compose" ) type pauseOptions struct { @@ -50,14 +49,11 @@ func runPause(ctx context.Context, dockerCli command.Cli, backendOptions *Backen if err != nil { return err } - - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { - return err - } - return backend.Pause(ctx, name, api.PauseOptions{ - Services: services, - Project: project, + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + return backend.Pause(ctx, name, api.PauseOptions{ + Services: services, + Project: project, + }) }) } @@ -85,13 +81,10 @@ func runUnPause(ctx context.Context, dockerCli command.Cli, backendOptions *Back if err != nil { return err } - - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { - return err - } - return backend.UnPause(ctx, name, api.PauseOptions{ - Services: services, - Project: project, + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + return backend.UnPause(ctx, name, api.PauseOptions{ + Services: services, + Project: project, + }) }) } diff --git a/cmd/compose/restart.go b/cmd/compose/restart.go index e014b2a8e..69b53f091 100644 --- a/cmd/compose/restart.go +++ b/cmd/compose/restart.go @@ -18,13 +18,11 @@ package compose import ( "context" - "time" "github.com/docker/cli/cli/command" "github.com/spf13/cobra" "github.com/docker/compose/v5/pkg/api" - "github.com/docker/compose/v5/pkg/compose" ) type restartOptions struct { @@ -69,20 +67,12 @@ func runRestart(ctx context.Context, dockerCli command.Cli, backendOptions *Back } } - var timeout *time.Duration - if opts.timeChanged { - timeoutValue := time.Duration(opts.timeout) * time.Second - timeout = &timeoutValue - } - - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { - return err - } - return backend.Restart(ctx, name, api.RestartOptions{ - Timeout: timeout, - Services: services, - Project: project, - NoDeps: opts.noDeps, + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + return backend.Restart(ctx, name, api.RestartOptions{ + Timeout: optionalTimeout(opts.timeout, opts.timeChanged), + Services: services, + Project: project, + NoDeps: opts.noDeps, + }) }) } diff --git a/cmd/compose/start.go b/cmd/compose/start.go index bd5f10c46..544503cb0 100644 --- a/cmd/compose/start.go +++ b/cmd/compose/start.go @@ -24,7 +24,6 @@ import ( "github.com/spf13/cobra" "github.com/docker/compose/v5/pkg/api" - "github.com/docker/compose/v5/pkg/compose" ) type startOptions struct { @@ -58,20 +57,17 @@ func runStart(ctx context.Context, dockerCli command.Cli, backendOptions *Backen return err } - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { - return err - } - var timeout time.Duration if opts.waitTimeout > 0 { timeout = time.Duration(opts.waitTimeout) * time.Second } - return backend.Start(ctx, name, api.StartOptions{ - AttachTo: services, - Project: project, - Services: services, - Wait: opts.wait, - WaitTimeout: timeout, + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + return backend.Start(ctx, name, api.StartOptions{ + AttachTo: services, + Project: project, + Services: services, + Wait: opts.wait, + WaitTimeout: timeout, + }) }) } diff --git a/cmd/compose/stop.go b/cmd/compose/stop.go index 6bc3faaa9..39dc41e14 100644 --- a/cmd/compose/stop.go +++ b/cmd/compose/stop.go @@ -18,13 +18,11 @@ package compose import ( "context" - "time" "github.com/docker/cli/cli/command" "github.com/spf13/cobra" "github.com/docker/compose/v5/pkg/api" - "github.com/docker/compose/v5/pkg/compose" ) type stopOptions struct { @@ -59,19 +57,11 @@ func runStop(ctx context.Context, dockerCli command.Cli, backendOptions *Backend if err != nil { return err } - - var timeout *time.Duration - if opts.timeChanged { - timeoutValue := time.Duration(opts.timeout) * time.Second - timeout = &timeoutValue - } - backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...) - if err != nil { - return err - } - return backend.Stop(ctx, name, api.StopOptions{ - Timeout: timeout, - Services: services, - Project: project, + return withBackend(ctx, dockerCli, backendOptions, func(backend api.Compose) error { + return backend.Stop(ctx, name, api.StopOptions{ + Timeout: optionalTimeout(opts.timeout, opts.timeChanged), + Services: services, + Project: project, + }) }) }