Merge pull request #9154 from neersighted/image_cleanup

images: use mediatype helpers
This commit is contained in:
Phil Estes 2023-09-27 12:33:29 -04:00 committed by GitHub
commit 61a8905012
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 43 deletions

View File

@ -170,8 +170,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts
dManifests := map[digest.Digest]*exportManifest{} dManifests := map[digest.Digest]*exportManifest{}
resolvedIndex := map[digest.Digest]digest.Digest{} resolvedIndex := map[digest.Digest]digest.Digest{}
for _, desc := range eo.manifests { for _, desc := range eo.manifests {
switch desc.MediaType { if images.IsManifestType(desc.MediaType) {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
mt, ok := dManifests[desc.Digest] mt, ok := dManifests[desc.Digest]
if !ok { if !ok {
// TODO(containerd): Skip if already added // TODO(containerd): Skip if already added
@ -191,7 +190,7 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts
if name != "" { if name != "" {
mt.names = append(mt.names, name) mt.names = append(mt.names, name)
} }
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: } else if images.IsIndexType(desc.MediaType) {
d, ok := resolvedIndex[desc.Digest] d, ok := resolvedIndex[desc.Digest]
if !ok { if !ok {
if err := desc.Digest.Validate(); err != nil { 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) return fmt.Errorf("only manifests may be exported: %w", errdefs.ErrInvalidArgument)
} }
} }

View File

@ -294,8 +294,8 @@ func LimitManifests(f HandlerFunc, m platforms.MatchComparer, n int) HandlerFunc
return children, err return children, err
} }
switch desc.MediaType { // only limit manifests from an index
case ocispec.MediaTypeImageIndex, MediaTypeDockerSchema2ManifestList: if IsIndexType(desc.MediaType) {
sort.SliceStable(children, func(i, j int) bool { sort.SliceStable(children, func(i, j int) bool {
if children[i].Platform == nil { if children[i].Platform == nil {
return false return false
@ -314,8 +314,6 @@ func LimitManifests(f HandlerFunc, m platforms.MatchComparer, n int) HandlerFunc
children = children[:n] children = children[:n]
} }
} }
default:
// only limit manifests from an index
} }
return children, nil return children, nil
} }

View File

@ -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) { if err := Walk(ctx, HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
switch desc.MediaType { if IsManifestType(desc.MediaType) {
case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
p, err := content.ReadBlob(ctx, provider, desc) p, err := content.ReadBlob(ctx, provider, desc)
if err != nil { if err != nil {
return nil, err return nil, err
@ -186,7 +185,7 @@ func Manifest(ctx context.Context, provider content.Provider, image ocispec.Desc
}) })
return nil, nil return nil, nil
case MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex: } else if IsIndexType(desc.MediaType) {
p, err := content.ReadBlob(ctx, provider, desc) p, err := content.ReadBlob(ctx, provider, desc)
if err != nil { if err != nil {
return nil, err return nil, err
@ -266,8 +265,7 @@ func Platforms(ctx context.Context, provider content.Provider, image ocispec.Des
return nil, ErrSkipDesc return nil, ErrSkipDesc
} }
switch desc.MediaType { if IsConfigType(desc.MediaType) {
case MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig:
imagePlatform, err := ConfigPlatform(ctx, provider, desc) imagePlatform, err := ConfigPlatform(ctx, provider, desc)
if err != nil { if err != nil {
return nil, err return nil, err
@ -323,9 +321,7 @@ func Check(ctx context.Context, provider content.Provider, image ocispec.Descrip
// Children returns the immediate children of content described by the descriptor. // 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) { func Children(ctx context.Context, provider content.Provider, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
var descs []ocispec.Descriptor if IsManifestType(desc.MediaType) {
switch desc.MediaType {
case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
p, err := content.ReadBlob(ctx, provider, desc) p, err := content.ReadBlob(ctx, provider, desc)
if err != nil { if err != nil {
return nil, err return nil, err
@ -342,9 +338,8 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr
return nil, err return nil, err
} }
descs = append(descs, manifest.Config) return append([]ocispec.Descriptor{manifest.Config}, manifest.Layers...), nil
descs = append(descs, manifest.Layers...) } else if IsIndexType(desc.MediaType) {
case MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
p, err := content.ReadBlob(ctx, provider, desc) p, err := content.ReadBlob(ctx, provider, desc)
if err != nil { if err != nil {
return nil, err return nil, err
@ -359,16 +354,12 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr
return nil, err return nil, err
} }
descs = append(descs, index.Manifests...) return append([]ocispec.Descriptor{}, index.Manifests...), nil
default: } else if !IsLayerType(desc.MediaType) && !IsKnownConfig(desc.MediaType) {
if IsLayerType(desc.MediaType) || IsKnownConfig(desc.MediaType) { // Layers and configs are childless data types and should not be logged.
// childless data types.
return nil, nil
}
log.G(ctx).Debugf("encountered unknown type %v; children may not be fetched", desc.MediaType) log.G(ctx).Debugf("encountered unknown type %v; children may not be fetched", desc.MediaType)
} }
return nil, nil
return descs, nil
} }
// unknownDocument represents a manifest, manifest list, or index that has not // unknownDocument represents a manifest, manifest list, or index that has not
@ -381,9 +372,10 @@ type unknownDocument struct {
FSLayers json.RawMessage `json:"fsLayers,omitempty"` // schema 1 FSLayers json.RawMessage `json:"fsLayers,omitempty"` // schema 1
} }
// validateMediaType returns an error if the byte slice is invalid JSON or if // validateMediaType returns an error if the byte slice is invalid JSON,
// the media type identifies the blob as one format but it contains elements of // if the format of the blob is not supported, or if the media type
// another format. // identifies the blob as one format, but it identifies itself as, or
// contains elements of another format.
func validateMediaType(b []byte, mt string) error { func validateMediaType(b []byte, mt string) error {
var doc unknownDocument var doc unknownDocument
if err := json.Unmarshal(b, &doc); err != nil { if err := json.Unmarshal(b, &doc); err != nil {
@ -392,19 +384,10 @@ func validateMediaType(b []byte, mt string) error {
if len(doc.FSLayers) != 0 { if len(doc.FSLayers) != 0 {
return fmt.Errorf("media-type: schema 1 not supported") return fmt.Errorf("media-type: schema 1 not supported")
} }
switch mt { if IsManifestType(mt) && (len(doc.Manifests) != 0 || IsIndexType(doc.MediaType)) {
case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest: return fmt.Errorf("media-type: expected manifest but found index (%s)", mt)
if len(doc.Manifests) != 0 || } else if IsIndexType(mt) && (len(doc.Config) != 0 || len(doc.Layers) != 0 || IsManifestType(doc.MediaType)) {
doc.MediaType == MediaTypeDockerSchema2ManifestList || return fmt.Errorf("media-type: expected index but found manifest (%s)", mt)
doc.MediaType == ocispec.MediaTypeImageIndex {
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 {
return fmt.Errorf("media-type: expected index but found manifest (%s)", mt)
}
} }
return nil return nil
} }