mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
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>
74 lines
2.4 KiB
Go
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()
|
|
}
|