Skip to content
Merged
Show file tree
Hide file tree
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
24 changes: 12 additions & 12 deletions container_opts.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,24 +120,24 @@ func WithImageConfigLabels(image Image) NewContainerOpts {
if err != nil {
return err
}
if !images.IsConfigType(ic.MediaType) {
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
}

var (
ociimage v1.Image
config v1.ImageConfig
)
switch ic.MediaType {
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return err
}
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return err
}

if err := json.Unmarshal(p, &ociimage); err != nil {
return err
}
config = ociimage.Config
default:
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
if err = json.Unmarshal(p, &ociimage); err != nil {
return err
}
config = ociimage.Config

c.Labels = config.Labels
return nil
}
Expand Down
5 changes: 2 additions & 3 deletions integration/client/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,7 @@ func TestExportDockerManifest(t *testing.T) {
// test single-platform export
var result ocispec.Descriptor
err = images.Walk(ctx, images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
if images.IsManifestType(desc.MediaType) {
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
if err != nil {
return nil, err
Expand All @@ -132,7 +131,7 @@ func TestExportDockerManifest(t *testing.T) {
result = desc
}
return nil, nil
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
} else if images.IsIndexType(desc.MediaType) {
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
if err != nil {
return nil, err
Expand Down
24 changes: 11 additions & 13 deletions oci/spec_opts.go
Original file line number Diff line number Diff line change
Expand Up @@ -376,26 +376,24 @@ func WithImageConfigArgs(image Image, args []string) SpecOpts {
if err != nil {
return err
}
if !images.IsConfigType(ic.MediaType) {
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
}

var (
imageConfigBytes []byte
ociimage v1.Image
config v1.ImageConfig
)
switch ic.MediaType {
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
var err error
imageConfigBytes, err = content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return err
}
imageConfigBytes, err = content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return err
}

if err := json.Unmarshal(imageConfigBytes, &ociimage); err != nil {
return err
}
config = ociimage.Config
default:
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
if err = json.Unmarshal(imageConfigBytes, &ociimage); err != nil {
return err
}
config = ociimage.Config

appendOSMounts(s, ociimage.OS)
setProcess(s)
Expand Down
6 changes: 2 additions & 4 deletions pkg/display/manifest_printer.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,7 @@ func (p *ImageTreePrinter) printManifestTree(ctx context.Context, desc ocispec.D
return err
}

switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
if images.IsManifestType(desc.MediaType) {
var manifest ocispec.Manifest
if err := json.Unmarshal(b, &manifest); err != nil {
return err
Expand All @@ -158,8 +157,7 @@ func (p *ImageTreePrinter) printManifestTree(ctx context.Context, desc ocispec.D
}
fmt.Fprintf(p.w, "%s%s @%s (%d bytes)\n", subprefix, manifest.Layers[i].MediaType, manifest.Layers[i].Digest, manifest.Layers[i].Size)
}

case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
} else if images.IsIndexType(desc.MediaType) {
var idx ocispec.Index
if err := json.Unmarshal(b, &idx); err != nil {
return err
Expand Down
3 changes: 1 addition & 2 deletions pkg/snapshotters/annotations.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ func AppendInfoHandlerWrapper(ref string) func(f images.Handler) images.Handler
if err != nil {
return nil, err
}
switch desc.MediaType {
case ocispec.MediaTypeImageManifest, images.MediaTypeDockerSchema2Manifest:
if images.IsManifestType(desc.MediaType) {
for i := range children {
c := &children[i]
if images.IsLayerType(c.MediaType) {
Expand Down
18 changes: 8 additions & 10 deletions pkg/transfer/local/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,24 +255,22 @@ func (ts *localTransferService) pull(ctx context.Context, ir transfer.ImageFetch
}

func fetchHandler(ingester content.Ingester, fetcher remotes.Fetcher, pt *ProgressTracker) images.HandlerFunc {
return func(ctx context.Context, desc ocispec.Descriptor) (subdescs []ocispec.Descriptor, err error) {
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function appears to have been copied more-or-less wholesale from FetchHandler in handlers; my thoughts at https://github.com/containerd/containerd/pull/9155/files#r1339001829 apply equally here.

ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
"digest": desc.Digest,
"mediatype": desc.MediaType,
"size": desc.Size,
}))

switch desc.MediaType {
case images.MediaTypeDockerSchema1Manifest:
if desc.MediaType == images.MediaTypeDockerSchema1Manifest {
return nil, fmt.Errorf("%v not supported", desc.MediaType)
default:
err := remotes.Fetch(ctx, ingester, fetcher, desc)
if errdefs.IsAlreadyExists(err) {
pt.MarkExists(desc)
return nil, nil
}
return nil, err
}
err := remotes.Fetch(ctx, ingester, fetcher, desc)
if errdefs.IsAlreadyExists(err) {
pt.MarkExists(desc)
return nil, nil
}
return nil, err
}
}

Expand Down
5 changes: 2 additions & 3 deletions pkg/unpack/unpacker.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,7 @@ func (u *Unpacker) Unpack(h images.Handler) images.Handler {
return children, err
}

switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
if images.IsManifestType(desc.MediaType) {
var nonLayers []ocispec.Descriptor
var manifestLayers []ocispec.Descriptor
// Split layers from non-layers, layers will be handled after
Expand All @@ -203,7 +202,7 @@ func (u *Unpacker) Unpack(h images.Handler) images.Handler {
lock.Unlock()

children = nonLayers
case images.MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig:
} else if images.IsConfigType(desc.MediaType) {
lock.Lock()
l := layers[desc.Digest]
lock.Unlock()
Expand Down
4 changes: 1 addition & 3 deletions remotes/docker/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ const LegacyConfigMediaType = "application/octet-stream"
// 1. original manifest will be deleted by next gc round.
// 2. don't cover manifest list.
func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Descriptor) (ocispec.Descriptor, error) {
if !(desc.MediaType == images.MediaTypeDockerSchema2Manifest ||
desc.MediaType == ocispec.MediaTypeImageManifest) {

if !images.IsManifestType(desc.MediaType) {
log.G(ctx).Warnf("do nothing for media type: %s", desc.MediaType)
return desc, nil
}
Expand Down
6 changes: 2 additions & 4 deletions remotes/docker/fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,8 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
}

// Try manifests endpoints for manifests types
switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList,
images.MediaTypeDockerSchema1Manifest,
ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex:
if images.IsManifestType(desc.MediaType) || images.IsIndexType(desc.MediaType) ||
desc.MediaType == images.MediaTypeDockerSchema1Manifest {

var firstErr error
for _, host := range r.hosts {
Expand Down
6 changes: 2 additions & 4 deletions remotes/docker/pusher.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,10 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str
host = hosts[0]
)

switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList,
ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex:
if images.IsManifestType(desc.MediaType) || images.IsIndexType(desc.MediaType) {
isManifest = true
existCheck = getManifestPath(p.object, desc.Digest)
default:
} else {
existCheck = []string{"blobs", desc.Digest.String()}
}

Expand Down
63 changes: 24 additions & 39 deletions remotes/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,17 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string {
}
}

switch mt := desc.MediaType; {
case mt == images.MediaTypeDockerSchema2Manifest || mt == ocispec.MediaTypeImageManifest:
switch {
Copy link
Copy Markdown
Contributor Author

@neersighted neersighted Sep 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dropped the mt alias here as it really only was an advantage when doing the inline string equality checks; now that we are using the helpers, mt adds more line noise/makes this slower to read, in my opinion.

case images.IsManifestType(desc.MediaType):
return "manifest-" + key
case mt == images.MediaTypeDockerSchema2ManifestList || mt == ocispec.MediaTypeImageIndex:
case images.IsIndexType(desc.MediaType):
return "index-" + key
case images.IsLayerType(mt):
case images.IsLayerType(desc.MediaType):
return "layer-" + key
case images.IsKnownConfig(mt):
case images.IsKnownConfig(desc.MediaType):
return "config-" + key
default:
log.G(ctx).Warnf("reference for unknown type: %s", mt)
log.G(ctx).Warnf("reference for unknown type: %s", desc.MediaType)
return "unknown-" + key
}
}
Expand All @@ -90,23 +90,21 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string {
// discovered in a call to Dispatch. Use with ChildrenHandler to do a full
// recursive fetch.
func FetchHandler(ingester content.Ingester, fetcher Fetcher) images.HandlerFunc {
return func(ctx context.Context, desc ocispec.Descriptor) (subdescs []ocispec.Descriptor, err error) {
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's unclear to me why named returns were used here; after dropping the case scope this becomes an error (due to err previously being shadowed).

I've elected to drop this as everything becomes more clear with explicit returns in this otherwise trivial function.

ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
"digest": desc.Digest,
"mediatype": desc.MediaType,
"size": desc.Size,
}))

switch desc.MediaType {
case images.MediaTypeDockerSchema1Manifest:
if desc.MediaType == images.MediaTypeDockerSchema1Manifest {
return nil, fmt.Errorf("%v not supported", desc.MediaType)
default:
err := Fetch(ctx, ingester, fetcher, desc)
if errdefs.IsAlreadyExists(err) {
return nil, nil
}
return nil, err
}
err := Fetch(ctx, ingester, fetcher, desc)
if errdefs.IsAlreadyExists(err) {
return nil, nil
}
return nil, err
}
}

Expand Down Expand Up @@ -214,20 +212,18 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st
indexStack := []ocispec.Descriptor{}

filterHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
if images.IsManifestType(desc.MediaType) {
m.Lock()
manifests = append(manifests, desc)
m.Unlock()
return nil, images.ErrStopHandler
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
} else if images.IsIndexType(desc.MediaType) {
m.Lock()
indexStack = append(indexStack, desc)
m.Unlock()
return nil, images.ErrStopHandler
default:
return nil, nil
}
return nil, nil
})

pushHandler := PushHandler(pusher, store)
Expand Down Expand Up @@ -318,24 +314,16 @@ func FilterManifestByPlatformHandler(f images.HandlerFunc, m platforms.Matcher)
return children, nil
}

var descs []ocispec.Descriptor
switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
if m.Match(*desc.Platform) {
descs = children
} else {
for _, child := range children {
if child.MediaType == images.MediaTypeDockerSchema2Config ||
child.MediaType == ocispec.MediaTypeImageConfig {

descs = append(descs, child)
}
if images.IsManifestType(desc.MediaType) && !m.Match(*desc.Platform) {
var descs []ocispec.Descriptor
for _, child := range children {
if images.IsConfigType(child.MediaType) {
descs = append(descs, child)
}
}
default:
descs = children
return descs, nil
}
return descs, nil
return children, nil
}
}

Expand All @@ -350,10 +338,7 @@ func annotateDistributionSourceHandler(f images.HandlerFunc, provider content.In

// Distribution source is only used for config or blob but may be inherited from
// a manifest or manifest list
switch desc.MediaType {
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest,
images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
default:
if !images.IsManifestType(desc.MediaType) && !images.IsIndexType(desc.MediaType) {
return children, nil
}

Expand Down
25 changes: 12 additions & 13 deletions signals.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,24 +57,23 @@ func GetOCIStopSignal(ctx context.Context, image Image, defaultSignal string) (s
if err != nil {
return "", err
}
if !images.IsConfigType(ic.MediaType) {
return "", fmt.Errorf("unknown image config media type %s", ic.MediaType)
}

var (
ociimage v1.Image
config v1.ImageConfig
)
switch ic.MediaType {
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return "", err
}

if err := json.Unmarshal(p, &ociimage); err != nil {
return "", err
}
config = ociimage.Config
default:
return "", fmt.Errorf("unknown image config media type %s", ic.MediaType)
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
if err != nil {
return "", err
}

if err = json.Unmarshal(p, &ociimage); err != nil {
return "", err
}
config = ociimage.Config

if config.StopSignal == "" {
return defaultSignal, nil
Expand Down