From bb8a472f243857229e606362826e48120078f8e0 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 27 Sep 2023 08:32:27 -0600 Subject: [PATCH 1/3] images: use mediatype helpers Signed-off-by: Bjorn Neergaard --- images/handlers.go | 6 ++---- images/image.go | 29 +++++++++++------------------ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/images/handlers.go b/images/handlers.go index 077d88e78..cd3e708af 100644 --- a/images/handlers.go +++ b/images/handlers.go @@ -294,8 +294,8 @@ func LimitManifests(f HandlerFunc, m platforms.MatchComparer, n int) HandlerFunc return children, err } - switch desc.MediaType { - case ocispec.MediaTypeImageIndex, MediaTypeDockerSchema2ManifestList: + // only limit manifests from an index + if IsIndexType(desc.MediaType) { sort.SliceStable(children, func(i, j int) bool { if children[i].Platform == nil { return false @@ -314,8 +314,6 @@ func LimitManifests(f HandlerFunc, m platforms.MatchComparer, n int) HandlerFunc children = children[:n] } } - default: - // only limit manifests from an index } return children, nil } diff --git a/images/image.go b/images/image.go index 625ec5b5a..1684e449c 100644 --- a/images/image.go +++ b/images/image.go @@ -147,8 +147,7 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc ) if err := Walk(ctx, HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { - switch desc.MediaType { - case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: + if IsManifestType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { return nil, err @@ -186,7 +185,7 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc }) return nil, nil - case MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: + } else if IsIndexType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { return nil, err @@ -266,8 +265,7 @@ func Platforms(ctx context.Context, provider content.Provider, image ocispec.Des return nil, ErrSkipDesc } - switch desc.MediaType { - case MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig: + if IsConfigType(desc.MediaType) { imagePlatform, err := ConfigPlatform(ctx, provider, desc) if err != nil { return nil, err @@ -324,8 +322,7 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip // Children returns the immediate children of content described by the descriptor. func Children(ctx context.Context, provider content.Provider, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { var descs []ocispec.Descriptor - switch desc.MediaType { - case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: + if IsManifestType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { return nil, err @@ -344,7 +341,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr descs = append(descs, manifest.Config) descs = append(descs, manifest.Layers...) - case MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: + } else if IsIndexType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { return nil, err @@ -360,7 +357,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr } descs = append(descs, index.Manifests...) - default: + } else { if IsLayerType(desc.MediaType) || IsKnownConfig(desc.MediaType) { // childless data types. return nil, nil @@ -392,19 +389,15 @@ func validateMediaType(b []byte, mt string) error { if len(doc.FSLayers) != 0 { return fmt.Errorf("media-type: schema 1 not supported") } - switch mt { - case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: - if len(doc.Manifests) != 0 || - doc.MediaType == MediaTypeDockerSchema2ManifestList || - doc.MediaType == ocispec.MediaTypeImageIndex { + if IsManifestType(mt) { + if len(doc.Manifests) != 0 || IsIndexType(doc.MediaType) { return fmt.Errorf("media-type: expected manifest but found index (%s)", mt) } - case MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: - if len(doc.Config) != 0 || len(doc.Layers) != 0 || - doc.MediaType == MediaTypeDockerSchema2Manifest || - doc.MediaType == ocispec.MediaTypeImageManifest { + } else if IsIndexType(mt) { + if len(doc.Config) != 0 || len(doc.Layers) != 0 || IsManifestType(doc.MediaType) { return fmt.Errorf("media-type: expected index but found manifest (%s)", mt) } + } return nil } From 377c5ca9cd4b44e8e1cd13e0aa46e2db77f16d7f Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 27 Sep 2023 09:17:03 -0600 Subject: [PATCH 2/3] images/archive: use mediatype helpers Signed-off-by: Bjorn Neergaard --- images/archive/exporter.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/images/archive/exporter.go b/images/archive/exporter.go index e902e2f43..b0617b430 100644 --- a/images/archive/exporter.go +++ b/images/archive/exporter.go @@ -170,8 +170,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts dManifests := map[digest.Digest]*exportManifest{} resolvedIndex := map[digest.Digest]digest.Digest{} for _, desc := range eo.manifests { - switch desc.MediaType { - case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: + if images.IsManifestType(desc.MediaType) { mt, ok := dManifests[desc.Digest] if !ok { // TODO(containerd): Skip if already added @@ -191,7 +190,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts if name != "" { mt.names = append(mt.names, name) } - case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: + } else if images.IsIndexType(desc.MediaType) { d, ok := resolvedIndex[desc.Digest] if !ok { if err := desc.Digest.Validate(); err != nil { @@ -255,7 +254,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts } } - default: + } else { return fmt.Errorf("only manifests may be exported: %w", errdefs.ErrInvalidArgument) } } From 62f621a344fa18f1b78694ca1539c5e4c5af761f Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 27 Sep 2023 09:06:08 -0600 Subject: [PATCH 3/3] images: simplify mediatype logic Signed-off-by: Bjorn Neergaard --- images/image.go | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/images/image.go b/images/image.go index 1684e449c..255dcd5a3 100644 --- a/images/image.go +++ b/images/image.go @@ -321,7 +321,6 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip // Children returns the immediate children of content described by the descriptor. func Children(ctx context.Context, provider content.Provider, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { - var descs []ocispec.Descriptor if IsManifestType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { @@ -339,8 +338,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr return nil, err } - descs = append(descs, manifest.Config) - descs = append(descs, manifest.Layers...) + return append([]ocispec.Descriptor{manifest.Config}, manifest.Layers...), nil } else if IsIndexType(desc.MediaType) { p, err := content.ReadBlob(ctx, provider, desc) if err != nil { @@ -356,16 +354,12 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr return nil, err } - descs = append(descs, index.Manifests...) - } else { - if IsLayerType(desc.MediaType) || IsKnownConfig(desc.MediaType) { - // childless data types. - return nil, nil - } + return append([]ocispec.Descriptor{}, index.Manifests...), nil + } else if !IsLayerType(desc.MediaType) && !IsKnownConfig(desc.MediaType) { + // Layers and configs are childless data types and should not be logged. log.G(ctx).Debugf("encountered unknown type %v; children may not be fetched", desc.MediaType) } - - return descs, nil + return nil, nil } // unknownDocument represents a manifest, manifest list, or index that has not @@ -378,9 +372,10 @@ type unknownDocument struct { FSLayers json.RawMessage `json:"fsLayers,omitempty"` // schema 1 } -// validateMediaType returns an error if the byte slice is invalid JSON or if -// the media type identifies the blob as one format but it contains elements of -// another format. +// validateMediaType returns an error if the byte slice is invalid JSON, +// if the format of the blob is not supported, or if the media type +// identifies the blob as one format, but it identifies itself as, or +// contains elements of another format. func validateMediaType(b []byte, mt string) error { var doc unknownDocument if err := json.Unmarshal(b, &doc); err != nil { @@ -389,15 +384,10 @@ func validateMediaType(b []byte, mt string) error { if len(doc.FSLayers) != 0 { return fmt.Errorf("media-type: schema 1 not supported") } - if IsManifestType(mt) { - if len(doc.Manifests) != 0 || IsIndexType(doc.MediaType) { - return fmt.Errorf("media-type: expected manifest but found index (%s)", mt) - } - } else if IsIndexType(mt) { - if len(doc.Config) != 0 || len(doc.Layers) != 0 || IsManifestType(doc.MediaType) { - return fmt.Errorf("media-type: expected index but found manifest (%s)", mt) - } - + if IsManifestType(mt) && (len(doc.Manifests) != 0 || IsIndexType(doc.MediaType)) { + return fmt.Errorf("media-type: expected manifest but found index (%s)", mt) + } else if IsIndexType(mt) && (len(doc.Config) != 0 || len(doc.Layers) != 0 || IsManifestType(doc.MediaType)) { + return fmt.Errorf("media-type: expected index but found manifest (%s)", mt) } return nil }