diff --git a/container_opts.go b/container_opts.go index d8105061f..d71c022a1 100644 --- a/container_opts.go +++ b/container_opts.go @@ -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 - } - - 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 + c.Labels = config.Labels return nil } diff --git a/integration/client/export_test.go b/integration/client/export_test.go index 59ef7193e..c13b2c48c 100644 --- a/integration/client/export_test.go +++ b/integration/client/export_test.go @@ -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 @@ -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 diff --git a/oci/spec_opts.go b/oci/spec_opts.go index 06290fbfb..b0a2a2477 100644 --- a/oci/spec_opts.go +++ b/oci/spec_opts.go @@ -376,27 +376,25 @@ 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 - } - - 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) + 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 + appendOSMounts(s, ociimage.OS) setProcess(s) if s.Linux != nil { diff --git a/pkg/display/manifest_printer.go b/pkg/display/manifest_printer.go index 9bdc52fb1..4cb152130 100644 --- a/pkg/display/manifest_printer.go +++ b/pkg/display/manifest_printer.go @@ -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 @@ -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 diff --git a/pkg/snapshotters/annotations.go b/pkg/snapshotters/annotations.go index 63476376c..259f350b8 100644 --- a/pkg/snapshotters/annotations.go +++ b/pkg/snapshotters/annotations.go @@ -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) { diff --git a/pkg/transfer/local/pull.go b/pkg/transfer/local/pull.go index 3c77af7dd..e0b08b5d8 100644 --- a/pkg/transfer/local/pull.go +++ b/pkg/transfer/local/pull.go @@ -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) { 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 } } diff --git a/pkg/unpack/unpacker.go b/pkg/unpack/unpacker.go index f16b96888..9879a93a1 100644 --- a/pkg/unpack/unpacker.go +++ b/pkg/unpack/unpacker.go @@ -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 @@ -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() diff --git a/remotes/docker/converter.go b/remotes/docker/converter.go index 95a68d70e..cdf6183fb 100644 --- a/remotes/docker/converter.go +++ b/remotes/docker/converter.go @@ -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 } diff --git a/remotes/docker/fetcher.go b/remotes/docker/fetcher.go index af538962e..96073e1a9 100644 --- a/remotes/docker/fetcher.go +++ b/remotes/docker/fetcher.go @@ -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 { diff --git a/remotes/docker/pusher.go b/remotes/docker/pusher.go index cc785930e..3e70cbe51 100644 --- a/remotes/docker/pusher.go +++ b/remotes/docker/pusher.go @@ -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()} } diff --git a/remotes/handlers.go b/remotes/handlers.go index e17ef3def..bd32a8937 100644 --- a/remotes/handlers.go +++ b/remotes/handlers.go @@ -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 { + 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 } } @@ -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) { 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 } } @@ -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) @@ -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 } } @@ -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 } diff --git a/signals.go b/signals.go index 9d81eed87..e21df0a11 100644 --- a/signals.go +++ b/signals.go @@ -57,25 +57,24 @@ 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 }