From 3f7d3c2661a21ad8ba341984439f29c0d0b0b6d3 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:22:15 +0100 Subject: [PATCH] add dry-run support for pull command Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- pkg/api/dryrunclient.go | 32 +++++++++++++++++++++++++------- pkg/compose/compose.go | 3 +-- pkg/compose/pull.go | 7 +++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/pkg/api/dryrunclient.go b/pkg/api/dryrunclient.go index 09254efc1..f2b1ec54f 100644 --- a/pkg/api/dryrunclient.go +++ b/pkg/api/dryrunclient.go @@ -25,6 +25,10 @@ import ( "strings" "sync" + "github.com/docker/buildx/builder" + "github.com/docker/buildx/util/imagetools" + "github.com/docker/cli/cli/command" + "github.com/distribution/distribution/v3/uuid" moby "github.com/docker/docker/api/types" containerType "github.com/docker/docker/api/types/container" @@ -52,6 +56,7 @@ type DryRunKey struct{} type DryRunClient struct { apiClient client.APIClient execs sync.Map + resolver *imagetools.Resolver } type execDetails struct { @@ -60,11 +65,20 @@ type execDetails struct { } // NewDryRunClient produces a DryRunClient -func NewDryRunClient(apiClient client.APIClient) *DryRunClient { +func NewDryRunClient(apiClient client.APIClient, cli *command.DockerCli) (*DryRunClient, error) { + b, err := builder.New(cli, builder.WithSkippedValidation()) + if err != nil { + return nil, err + } + configFile, err := b.ImageOpt() + if err != nil { + return nil, err + } return &DryRunClient{ apiClient: apiClient, execs: sync.Map{}, - } + resolver: imagetools.New(configFile), + }, nil } // All methods and functions which need to be overridden for dry run. @@ -129,8 +143,16 @@ func (d *DryRunClient) ImageBuild(ctx context.Context, reader io.Reader, options return moby.ImageBuildResponse{}, ErrNotImplemented } +func (d *DryRunClient) ImageInspectWithRaw(ctx context.Context, imageName string) (moby.ImageInspect, []byte, error) { + return moby.ImageInspect{ID: "dryRunId"}, nil, nil +} + func (d *DryRunClient) ImagePull(ctx context.Context, ref string, options moby.ImagePullOptions) (io.ReadCloser, error) { - return nil, ErrNotImplemented + if _, _, err := d.resolver.Resolve(ctx, ref); err != nil { + return nil, err + } + rc := io.NopCloser(strings.NewReader("")) + return rc, nil } func (d *DryRunClient) ImagePush(ctx context.Context, ref string, options moby.ImagePushOptions) (io.ReadCloser, error) { @@ -304,10 +326,6 @@ func (d *DryRunClient) ImageImport(ctx context.Context, source moby.ImageImportS return d.apiClient.ImageImport(ctx, source, ref, options) } -func (d *DryRunClient) ImageInspectWithRaw(ctx context.Context, imageName string) (moby.ImageInspect, []byte, error) { - return d.apiClient.ImageInspectWithRaw(ctx, imageName) -} - func (d *DryRunClient) ImageList(ctx context.Context, options moby.ImageListOptions) ([]moby.ImageSummary, error) { return d.apiClient.ImageList(ctx, options) } diff --git a/pkg/compose/compose.go b/pkg/compose/compose.go index 048a4fe09..44d4dc94c 100644 --- a/pkg/compose/compose.go +++ b/pkg/compose/compose.go @@ -75,8 +75,7 @@ func (s *composeService) DryRunMode(ctx context.Context, dryRun bool) (context.C return ctx, err } err = cli.Initialize(flags.NewClientOptions(), command.WithInitializeClient(func(cli *command.DockerCli) (client.APIClient, error) { - dryRunClient := api.NewDryRunClient(s.apiClient()) - return dryRunClient, nil + return api.NewDryRunClient(s.apiClient(), cli) })) if err != nil { return ctx, err diff --git a/pkg/compose/pull.go b/pkg/compose/pull.go index 21559a248..108285414 100644 --- a/pkg/compose/pull.go +++ b/pkg/compose/pull.go @@ -130,6 +130,13 @@ func (s *composeService) pull(ctx context.Context, project *types.Project, opts mustBuild = append(mustBuild, service.Name) } if !opts.IgnoreFailures && service.Build == nil { + if s.dryRun { + w.Event(progress.Event{ + ID: service.Name, + Status: progress.Error, + Text: fmt.Sprintf(" - Pull error for image: %s", service.Image), + }) + } // fail fast if image can't be pulled nor built return err }