Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Return more detailed errors when fixup fails #113

Merged
merged 3 commits into from
Jul 6, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 25 additions & 9 deletions remotes/fixup.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/platforms"
"github.com/containerd/containerd/remotes"
"github.com/docker/distribution/reference"
"github.com/hashicorp/go-multierror"
ocischemav1 "github.com/opencontainers/image-spec/specs-go/v1"
)

Expand Down Expand Up @@ -216,63 +217,75 @@ func fixupBaseImage(ctx context.Context, name string, baseImage *bundle.BaseImag
pushLocalImage,
}

var bigErr *multierror.Error
for _, f := range fixups {
info, pushed, ok, err := f(ctx, targetRepoOnly, baseImage, cfg)
if err != nil {
log.G(ctx).Debug(err)
// do not stop trying fixups after the first error. Only report the errors if all fixups were unable to push the image.
bigErr = multierror.Append(bigErr, fmt.Errorf("failed to fixup the image %s for service %q: %v", baseImage.Image, name, err))
}
if ok {
return info, pushed, nil
}
}

return imageFixupInfo{}, false, fmt.Errorf("failed to resolve or push image for service %q", name)
return imageFixupInfo{}, false, bigErr.ErrorOrNil()
}

func pushByDigest(ctx context.Context, target reference.Named, baseImage *bundle.BaseImage, cfg fixupConfig) (imageFixupInfo, bool, bool, error) {
if baseImage.Image != "" || !cfg.pushImages {
return imageFixupInfo{}, false, false, nil
}
descriptor, err := pushImageToTarget(ctx, baseImage.Digest, cfg)
if err != nil {
return imageFixupInfo{}, false, false, fmt.Errorf("failed to push digested image %s@%s to target %s: %v", baseImage.Image, baseImage.Digest, target, err)
}
return imageFixupInfo{
targetRepo: target,
sourceRef: nil,
resolvedDescriptor: descriptor,
}, true, err == nil, err
}, true, true, nil
}

func resolveImage(ctx context.Context, target reference.Named, baseImage *bundle.BaseImage, cfg fixupConfig) (imageFixupInfo, bool, bool, error) {
sourceImageRef, err := ref(baseImage.Image)
if err != nil {
return imageFixupInfo{}, false, false, err
return imageFixupInfo{}, false, false, fmt.Errorf("failed to resolve image: invalid source ref %s: %v", baseImage.Image, err)
}
_, descriptor, err := cfg.resolver.Resolve(ctx, sourceImageRef.String())
if err != nil {
return imageFixupInfo{}, false, false, fmt.Errorf("failed to resolve image %s: %v", sourceImageRef.String(), err)
}
return imageFixupInfo{
targetRepo: target,
sourceRef: sourceImageRef,
resolvedDescriptor: descriptor,
}, false, err == nil, err
}, false, true, nil
}

func resolveImageInRelocationMap(ctx context.Context, target reference.Named, baseImage *bundle.BaseImage, cfg fixupConfig) (imageFixupInfo, bool, bool, error) {
sourceImageRef, err := ref(baseImage.Image)
if err != nil {
return imageFixupInfo{}, false, false, err
return imageFixupInfo{}, false, false, fmt.Errorf("failed to resolve image in relocation map: invalid source ref %s: %v", baseImage.Image, err)
}
relocatedRef, ok := cfg.relocationMap[baseImage.Image]
if !ok {
return imageFixupInfo{}, false, false, nil
}
relocatedImageRef, err := ref(relocatedRef)
if err != nil {
return imageFixupInfo{}, false, false, err
return imageFixupInfo{}, false, false, fmt.Errorf("failed to resolve image in relocation map: invalid target ref %s: %v", relocatedRef, err)
}
_, descriptor, err := cfg.resolver.Resolve(ctx, relocatedImageRef.String())
if err != nil {
return imageFixupInfo{}, false, false, err
}
return imageFixupInfo{
targetRepo: target,
sourceRef: sourceImageRef,
resolvedDescriptor: descriptor,
}, false, err == nil, err
}, false, true, nil
}

func pushLocalImage(ctx context.Context, target reference.Named, baseImage *bundle.BaseImage, cfg fixupConfig) (imageFixupInfo, bool, bool, error) {
Expand All @@ -281,14 +294,17 @@ func pushLocalImage(ctx context.Context, target reference.Named, baseImage *bund
}
sourceImageRef, err := ref(baseImage.Image)
if err != nil {
return imageFixupInfo{}, false, false, err
return imageFixupInfo{}, false, false, fmt.Errorf("failed to push local image: invalid source ref %s: %v", baseImage.Image, err)
}
descriptor, err := pushImageToTarget(ctx, baseImage.Image, cfg)
if err != nil {
return imageFixupInfo{}, false, false, fmt.Errorf("failed to push local image %s: %v", baseImage.Image, err)
}
return imageFixupInfo{
targetRepo: target,
sourceRef: sourceImageRef,
resolvedDescriptor: descriptor,
}, true, err == nil, err
}, true, true, nil
}

func ref(str string) (reference.Named, error) {
Expand Down