mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
vendor containers/common
Pull in fixes for platform checks to silence annoying warnings when pulling images by platforms using uname values. Fixes: #14669 Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
This commit is contained in:
78
vendor/github.com/containers/common/libimage/platform.go
generated
vendored
78
vendor/github.com/containers/common/libimage/platform.go
generated
vendored
@ -4,6 +4,9 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"runtime"
|
||||
|
||||
"github.com/containerd/containerd/platforms"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// PlatformPolicy controls the behavior of image-platform matching.
|
||||
@ -16,11 +19,42 @@ const (
|
||||
PlatformPolicyWarn
|
||||
)
|
||||
|
||||
func toPlatformString(architecture, os, variant string) string {
|
||||
if variant == "" {
|
||||
return fmt.Sprintf("%s/%s", os, architecture)
|
||||
// NormalizePlatform normalizes (according to the OCI spec) the specified os,
|
||||
// arch and variant. If left empty, the individual item will not be normalized.
|
||||
func NormalizePlatform(rawOS, rawArch, rawVariant string) (os, arch, variant string) {
|
||||
rawPlatform := toPlatformString(rawOS, rawArch, rawVariant)
|
||||
normalizedPlatform, err := platforms.Parse(rawPlatform)
|
||||
if err != nil {
|
||||
logrus.Debugf("Error normalizing platform: %v", err)
|
||||
return rawOS, rawArch, rawVariant
|
||||
}
|
||||
return fmt.Sprintf("%s/%s/%s", os, architecture, variant)
|
||||
logrus.Debugf("Normalized platform %s to %s", rawPlatform, normalizedPlatform)
|
||||
os = rawOS
|
||||
if rawOS != "" {
|
||||
os = normalizedPlatform.OS
|
||||
}
|
||||
arch = rawArch
|
||||
if rawArch != "" {
|
||||
arch = normalizedPlatform.Architecture
|
||||
}
|
||||
variant = rawVariant
|
||||
if rawVariant != "" {
|
||||
variant = normalizedPlatform.Variant
|
||||
}
|
||||
return os, arch, variant
|
||||
}
|
||||
|
||||
func toPlatformString(os, arch, variant string) string {
|
||||
if os == "" {
|
||||
os = runtime.GOOS
|
||||
}
|
||||
if arch == "" {
|
||||
arch = runtime.GOARCH
|
||||
}
|
||||
if variant == "" {
|
||||
return fmt.Sprintf("%s/%s", os, arch)
|
||||
}
|
||||
return fmt.Sprintf("%s/%s/%s", os, arch, variant)
|
||||
}
|
||||
|
||||
// Checks whether the image matches the specified platform.
|
||||
@ -28,36 +62,26 @@ func toPlatformString(architecture, os, variant string) string {
|
||||
// * 1) a matching error that can be used for logging (or returning) what does not match
|
||||
// * 2) a bool indicating whether architecture, os or variant were set (some callers need that to decide whether they need to throw an error)
|
||||
// * 3) a fatal error that occurred prior to check for matches (e.g., storage errors etc.)
|
||||
func (i *Image) matchesPlatform(ctx context.Context, architecture, os, variant string) (error, bool, error) {
|
||||
customPlatform := len(architecture)+len(os)+len(variant) != 0
|
||||
|
||||
if len(architecture) == 0 {
|
||||
architecture = runtime.GOARCH
|
||||
}
|
||||
if len(os) == 0 {
|
||||
os = runtime.GOOS
|
||||
}
|
||||
|
||||
func (i *Image) matchesPlatform(ctx context.Context, os, arch, variant string) (error, bool, error) {
|
||||
inspectInfo, err := i.inspectInfo(ctx)
|
||||
if err != nil {
|
||||
return nil, customPlatform, fmt.Errorf("inspecting image: %w", err)
|
||||
return nil, false, fmt.Errorf("inspecting image: %w", err)
|
||||
}
|
||||
|
||||
matches := true
|
||||
switch {
|
||||
case architecture != inspectInfo.Architecture:
|
||||
matches = false
|
||||
case os != inspectInfo.Os:
|
||||
matches = false
|
||||
case variant != "" && variant != inspectInfo.Variant:
|
||||
matches = false
|
||||
customPlatform := len(os)+len(arch)+len(variant) != 0
|
||||
|
||||
expected, err := platforms.Parse(toPlatformString(os, arch, variant))
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("parsing host platform: %v", err)
|
||||
}
|
||||
fromImage, err := platforms.Parse(toPlatformString(inspectInfo.Os, inspectInfo.Architecture, inspectInfo.Variant))
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("parsing image platform: %v", err)
|
||||
}
|
||||
|
||||
if matches {
|
||||
if platforms.NewMatcher(expected).Match(fromImage) {
|
||||
return nil, customPlatform, nil
|
||||
}
|
||||
|
||||
imagePlatform := toPlatformString(inspectInfo.Architecture, inspectInfo.Os, inspectInfo.Variant)
|
||||
expectedPlatform := toPlatformString(architecture, os, variant)
|
||||
return fmt.Errorf("image platform (%s) does not match the expected platform (%s)", imagePlatform, expectedPlatform), customPlatform, nil
|
||||
return fmt.Errorf("image platform (%s) does not match the expected platform (%s)", fromImage, expected), customPlatform, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user