From 1d9845422c62e07733329d1c7d81fb7e629d2231 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 18 Sep 2023 09:58:28 -0400 Subject: [PATCH] ociarchive: Return `ImageNotFound` if the file isn't present This is for https://github.com/containers/skopeo/pull/2114 which is in turn a dependency of https://github.com/coreos/rpm-ostree/pull/4598 Basically I want to map ENOENT to `ImageNotFound`, because the build tooling wants to treat "target image is not present" differently from "DNS lookup failed" or "we got EPERM". There's a bit of code motion here because we need to move the `os.Open()` call before creating a temporary directory. --- oci/archive/oci_transport.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/oci/archive/oci_transport.go b/oci/archive/oci_transport.go index 2a03feeeac..6d25383a3c 100644 --- a/oci/archive/oci_transport.go +++ b/oci/archive/oci_transport.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "io/fs" "os" "strings" @@ -171,18 +172,24 @@ func createOCIRef(sys *types.SystemContext, image string) (tempDirOCIRef, error) // creates the temporary directory and copies the tarred content to it func createUntarTempDir(sys *types.SystemContext, ref ociArchiveReference) (tempDirOCIRef, error) { - tempDirRef, err := createOCIRef(sys, ref.image) - if err != nil { - return tempDirOCIRef{}, fmt.Errorf("creating oci reference: %w", err) - } src := ref.resolvedFile - dst := tempDirRef.tempDirectory // TODO: This can take quite some time, and should ideally be cancellable using a context.Context. arch, err := os.Open(src) if err != nil { - return tempDirOCIRef{}, err + if errors.Is(err, fs.ErrNotExist) { + return tempDirOCIRef{}, ImageNotFoundError{ref: ref} + } else { + return tempDirOCIRef{}, err + } } defer arch.Close() + + tempDirRef, err := createOCIRef(sys, ref.image) + if err != nil { + return tempDirOCIRef{}, fmt.Errorf("creating oci reference: %w", err) + } + dst := tempDirRef.tempDirectory + if err := archive.NewDefaultArchiver().Untar(arch, dst, &archive.TarOptions{NoLchown: true}); err != nil { if err := tempDirRef.deleteTempDir(); err != nil { return tempDirOCIRef{}, fmt.Errorf("deleting temp directory %q: %w", tempDirRef.tempDirectory, err)