summaryrefslogtreecommitdiff
path: root/vendor/github.com/containers/common/libimage/platform.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/containers/common/libimage/platform.go')
-rw-r--r--vendor/github.com/containers/common/libimage/platform.go76
1 files changed, 50 insertions, 26 deletions
diff --git a/vendor/github.com/containers/common/libimage/platform.go b/vendor/github.com/containers/common/libimage/platform.go
index 8b78bce24..736a193f6 100644
--- a/vendor/github.com/containers/common/libimage/platform.go
+++ b/vendor/github.com/containers/common/libimage/platform.go
@@ -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 {
+// 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
+ }
+ 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, architecture)
+ return fmt.Sprintf("%s/%s", os, arch)
}
- return fmt.Sprintf("%s/%s/%s", os, architecture, variant)
+ 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
}