Files
moby/daemon/containerd/platform_matchers.go
Cesar Talledo b91ebbde6d Refactor containerd platform matchers.
Merge the matchAllWithPreference matcher into the matchAnyWithPreference
matcher to reduce code duplication and simplify the code.

Signed-off-by: Cesar Talledo <cesar.talledo@docker.com>
2025-07-23 01:31:39 +02:00

74 lines
2.4 KiB
Go

package containerd
import (
"github.com/containerd/platforms"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
)
// platformsWithPreferenceMatcher is a platform matcher that matches any of the
// platforms in the platformList, but orders platforms to match the preferred matcher
// first. If the platformList is empty, it matches all platforms.
// It implements the platforms.MatchComparer interface.
type platformsWithPreferenceMatcher struct {
platformList []ocispec.Platform
preferred platforms.MatchComparer
}
func matchAnyWithPreference(preferred platforms.MatchComparer, platformList []ocispec.Platform) platformsWithPreferenceMatcher {
return platformsWithPreferenceMatcher{
platformList: platformList,
preferred: preferred,
}
}
func (c platformsWithPreferenceMatcher) Match(p ocispec.Platform) bool {
if len(c.platformList) == 0 {
return true
}
return platforms.Any(c.platformList...).Match(p)
}
func (c platformsWithPreferenceMatcher) Less(p1, p2 ocispec.Platform) bool {
return c.preferred.Less(p1, p2)
}
// platformMatcherWithRequestedPlatform is a platform matcher that also
// contains the platform that was requested by the user in the context
// in which the matcher was created.
type platformMatcherWithRequestedPlatform struct {
Requested *ocispec.Platform
platforms.MatchComparer
}
type matchComparerProvider func(ocispec.Platform) platforms.MatchComparer
// matchRequestedOrDefault returns a platform match comparer that matches the given platform
// using the given match comparer. If no platform is given, matches any platform with
// preference for the host platform.
func (i *ImageService) matchRequestedOrDefault(
fpm matchComparerProvider, // function to create a platform matcher if platform is not nil
platform *ocispec.Platform, // input platform, nil if not specified
) platformMatcherWithRequestedPlatform {
var inner platforms.MatchComparer
if platform == nil {
inner = matchAnyWithPreference(i.hostPlatformMatcher(), nil)
} else {
inner = fpm(*platform)
}
return platformMatcherWithRequestedPlatform{
Requested: platform,
MatchComparer: inner,
}
}
// hostPlatformMatcher returns a platform match comparer that matches the host platform.
func (i *ImageService) hostPlatformMatcher() platforms.MatchComparer {
// Allow to override the host platform for testing purposes.
if i.defaultPlatformOverride != nil {
return i.defaultPlatformOverride
}
return platforms.Default()
}