cli/command/container: use errors.Join

Use stdlib multi-errors instead of creating our own

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2025-02-03 19:17:50 +01:00
parent 791e06b435
commit 150f27b68c
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
8 changed files with 67 additions and 84 deletions

View File

@ -2,13 +2,12 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -44,20 +43,19 @@ func NewKillCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runKill(ctx context.Context, dockerCli command.Cli, opts *killOptions) error { func runKill(ctx context.Context, dockerCLI command.Cli, opts *killOptions) error {
var errs []string apiClient := dockerCLI.Client()
errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, container string) error { errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, container string) error {
return dockerCli.Client().ContainerKill(ctx, container, opts.signal) return apiClient.ContainerKill(ctx, container, opts.signal)
}) })
var errs []error
for _, name := range opts.containers { for _, name := range opts.containers {
if err := <-errChan; err != nil { if err := <-errChan; err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
} else { continue
_, _ = fmt.Fprintln(dockerCli.Out(), name)
} }
_, _ = fmt.Fprintln(dockerCLI.Out(), name)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -2,14 +2,13 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -38,18 +37,17 @@ func NewPauseCommand(dockerCli command.Cli) *cobra.Command {
} }
} }
func runPause(ctx context.Context, dockerCli command.Cli, opts *pauseOptions) error { func runPause(ctx context.Context, dockerCLI command.Cli, opts *pauseOptions) error {
var errs []string apiClient := dockerCLI.Client()
errChan := parallelOperation(ctx, opts.containers, dockerCli.Client().ContainerPause) errChan := parallelOperation(ctx, opts.containers, apiClient.ContainerPause)
var errs []error
for _, ctr := range opts.containers { for _, ctr := range opts.containers {
if err := <-errChan; err != nil { if err := <-errChan; err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
continue continue
} }
_, _ = fmt.Fprintln(dockerCli.Out(), ctr) _, _ = fmt.Fprintln(dockerCLI.Out(), ctr)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -2,14 +2,13 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -56,27 +55,25 @@ func NewRestartCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runRestart(ctx context.Context, dockerCli command.Cli, opts *restartOptions) error { func runRestart(ctx context.Context, dockerCLI command.Cli, opts *restartOptions) error {
var errs []string
var timeout *int var timeout *int
if opts.timeoutChanged { if opts.timeoutChanged {
timeout = &opts.timeout timeout = &opts.timeout
} }
apiClient := dockerCLI.Client()
var errs []error
// TODO(thaJeztah): consider using parallelOperation for restart, similar to "stop" and "remove" // TODO(thaJeztah): consider using parallelOperation for restart, similar to "stop" and "remove"
for _, name := range opts.containers { for _, name := range opts.containers {
err := dockerCli.Client().ContainerRestart(ctx, name, container.StopOptions{ err := apiClient.ContainerRestart(ctx, name, container.StopOptions{
Signal: opts.signal, Signal: opts.signal,
Timeout: timeout, Timeout: timeout,
}) })
if err != nil { if err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
continue continue
} }
_, _ = fmt.Fprintln(dockerCli.Out(), name) _, _ = fmt.Fprintln(dockerCLI.Out(), name)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -2,6 +2,7 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings" "strings"
@ -10,7 +11,6 @@ import (
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -50,33 +50,31 @@ func NewRmCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runRm(ctx context.Context, dockerCli command.Cli, opts *rmOptions) error { func runRm(ctx context.Context, dockerCLI command.Cli, opts *rmOptions) error {
var errs []string apiClient := dockerCLI.Client()
errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, ctrID string) error { errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, ctrID string) error {
ctrID = strings.Trim(ctrID, "/") ctrID = strings.Trim(ctrID, "/")
if ctrID == "" { if ctrID == "" {
return errors.New("Container name cannot be empty") return errors.New("container name cannot be empty")
} }
return dockerCli.Client().ContainerRemove(ctx, ctrID, container.RemoveOptions{ return apiClient.ContainerRemove(ctx, ctrID, container.RemoveOptions{
RemoveVolumes: opts.rmVolumes, RemoveVolumes: opts.rmVolumes,
RemoveLinks: opts.rmLink, RemoveLinks: opts.rmLink,
Force: opts.force, Force: opts.force,
}) })
}) })
var errs []error
for _, name := range opts.containers { for _, name := range opts.containers {
if err := <-errChan; err != nil { if err := <-errChan; err != nil {
if opts.force && errdefs.IsNotFound(err) { if opts.force && errdefs.IsNotFound(err) {
fmt.Fprintln(dockerCli.Err(), err) _, _ = fmt.Fprintln(dockerCLI.Err(), err)
continue continue
} }
errs = append(errs, err.Error()) errs = append(errs, err)
continue continue
} }
fmt.Fprintln(dockerCli.Out(), name) _, _ = fmt.Fprintln(dockerCLI.Out(), name)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -3,6 +3,7 @@ package container
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"strings" "strings"
@ -17,7 +18,6 @@ import (
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -238,16 +238,16 @@ func RunStats(ctx context.Context, dockerCLI command.Cli, options *StatsOptions)
// make sure each container get at least one valid stat data // make sure each container get at least one valid stat data
waitFirst.Wait() waitFirst.Wait()
var errs []string var errs []error
cStats.mu.RLock() cStats.mu.RLock()
for _, c := range cStats.cs { for _, c := range cStats.cs {
if err := c.GetError(); err != nil { if err := c.GetError(); err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
} }
} }
cStats.mu.RUnlock() cStats.mu.RUnlock()
if len(errs) > 0 { if err := errors.Join(errs...); err != nil {
return errors.New(strings.Join(errs, "\n")) return err
} }
} }

View File

@ -2,14 +2,13 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -56,28 +55,26 @@ func NewStopCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runStop(ctx context.Context, dockerCli command.Cli, opts *stopOptions) error { func runStop(ctx context.Context, dockerCLI command.Cli, opts *stopOptions) error {
var timeout *int var timeout *int
if opts.timeoutChanged { if opts.timeoutChanged {
timeout = &opts.timeout timeout = &opts.timeout
} }
apiClient := dockerCLI.Client()
errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, id string) error { errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, id string) error {
return dockerCli.Client().ContainerStop(ctx, id, container.StopOptions{ return apiClient.ContainerStop(ctx, id, container.StopOptions{
Signal: opts.signal, Signal: opts.signal,
Timeout: timeout, Timeout: timeout,
}) })
}) })
var errs []string var errs []error
for _, ctr := range opts.containers { for _, ctr := range opts.containers {
if err := <-errChan; err != nil { if err := <-errChan; err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
continue continue
} }
_, _ = fmt.Fprintln(dockerCli.Out(), ctr) _, _ = fmt.Fprintln(dockerCLI.Out(), ctr)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -2,14 +2,13 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -39,18 +38,16 @@ func NewUnpauseCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runUnpause(ctx context.Context, dockerCli command.Cli, opts *unpauseOptions) error { func runUnpause(ctx context.Context, dockerCLI command.Cli, opts *unpauseOptions) error {
var errs []string apiClient := dockerCLI.Client()
errChan := parallelOperation(ctx, opts.containers, dockerCli.Client().ContainerUnpause) errChan := parallelOperation(ctx, opts.containers, apiClient.ContainerUnpause)
var errs []error
for _, ctr := range opts.containers { for _, ctr := range opts.containers {
if err := <-errChan; err != nil { if err := <-errChan; err != nil {
errs = append(errs, err.Error()) errs = append(errs, err)
continue continue
} }
_, _ = fmt.Fprintln(dockerCli.Out(), ctr) _, _ = fmt.Fprintln(dockerCLI.Out(), ctr)
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }

View File

@ -2,13 +2,12 @@ package container
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/completion" "github.com/docker/cli/cli/command/completion"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -37,20 +36,19 @@ func NewWaitCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
func runWait(ctx context.Context, dockerCli command.Cli, opts *waitOptions) error { func runWait(ctx context.Context, dockerCLI command.Cli, opts *waitOptions) error {
var errs []string apiClient := dockerCLI.Client()
var errs []error
for _, ctr := range opts.containers { for _, ctr := range opts.containers {
resultC, errC := dockerCli.Client().ContainerWait(ctx, ctr, "") resultC, errC := apiClient.ContainerWait(ctx, ctr, "")
select { select {
case result := <-resultC: case result := <-resultC:
_, _ = fmt.Fprintf(dockerCli.Out(), "%d\n", result.StatusCode) _, _ = fmt.Fprintf(dockerCLI.Out(), "%d\n", result.StatusCode)
case err := <-errC: case err := <-errC:
errs = append(errs, err.Error()) errs = append(errs, err)
} }
} }
if len(errs) > 0 { return errors.Join(errs...)
return errors.New(strings.Join(errs, "\n"))
}
return nil
} }