From 0f0e8ef3bc7ca09181b29a8de9d82d033c06d2cc Mon Sep 17 00:00:00 2001 From: Aditya R Date: Wed, 28 Sep 2022 12:42:00 +0530 Subject: [PATCH] libimage.NormalizePlatform: normalize default variant as per specified arch As of now NormalizePlatform ignores normalizing or setting default variants for specific arch types thus producing empty variants in results even when default variants were expected for such cases. Example consider: `linux/armhf` -> `{os:linux, arch: arm, variant: v7}` Signed-off-by: Aditya R --- common/libimage/normalize_test.go | 28 ++++++++++++++++++++++++++++ common/libimage/platform.go | 16 +++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/common/libimage/normalize_test.go b/common/libimage/normalize_test.go index 63659178b1..206c0eb351 100644 --- a/common/libimage/normalize_test.go +++ b/common/libimage/normalize_test.go @@ -54,6 +54,34 @@ func TestNormalizePlatform(t *testing.T) { platform{"linux", "aarch64", ""}, platform{"linux", "arm64", ""}, }, + // Verify: https://github.com/containerd/containerd/blob/main/platforms/database.go#L97 + { + platform{"linux", "arm64", "8"}, + platform{"linux", "arm64", "v8"}, + }, + // Verify: https://github.com/containerd/containerd/blob/main/platforms/database.go#L100 + { + platform{"linux", "armhf", ""}, + platform{"linux", "arm", "v7"}, + }, + { + platform{"linux", "armhf", "v7"}, + platform{"linux", "arm", "v7"}, + }, + // Verify: https://github.com/containerd/containerd/blob/main/platforms/database.go#L103 + { + platform{"linux", "armel", ""}, + platform{"linux", "arm", "v6"}, + }, + // Verify: https://github.com/containerd/containerd/blob/main/platforms/database.go#L103 + { + platform{"linux", "armel", "v6"}, + platform{"linux", "arm", "v6"}, + }, + { + platform{"linux", "armel", ""}, + platform{"linux", "arm", "v6"}, + }, } { os, arch, variant := NormalizePlatform(test.input.os, test.input.arch, test.input.variant) assert.Equal(t, test.expected.os, os, test.input) diff --git a/common/libimage/platform.go b/common/libimage/platform.go index 274b2aa069..4d5dde310a 100644 --- a/common/libimage/platform.go +++ b/common/libimage/platform.go @@ -6,6 +6,7 @@ import ( "runtime" "github.com/containerd/containerd/platforms" + v1 "github.com/opencontainers/image-spec/specs-go/v1" "github.com/sirupsen/logrus" ) @@ -20,9 +21,18 @@ const ( ) // NormalizePlatform normalizes (according to the OCI spec) the specified os, -// arch and variant. If left empty, the individual item will not be normalized. +// arch and variant. If left empty, the individual item will be normalized. func NormalizePlatform(rawOS, rawArch, rawVariant string) (os, arch, variant string) { - rawPlatform := toPlatformString(rawOS, rawArch, rawVariant) + platformSpec := v1.Platform{ + OS: rawOS, + Architecture: rawArch, + Variant: rawVariant, + } + normalizedSpec := platforms.Normalize(platformSpec) + if normalizedSpec.Variant == "" && rawVariant != "" { + normalizedSpec.Variant = rawVariant + } + rawPlatform := toPlatformString(normalizedSpec.OS, normalizedSpec.Architecture, normalizedSpec.Variant) normalizedPlatform, err := platforms.Parse(rawPlatform) if err != nil { logrus.Debugf("Error normalizing platform: %v", err) @@ -38,7 +48,7 @@ func NormalizePlatform(rawOS, rawArch, rawVariant string) (os, arch, variant str arch = normalizedPlatform.Architecture } variant = rawVariant - if rawVariant != "" { + if rawVariant != "" || (rawVariant == "" && normalizedPlatform.Variant != "") { variant = normalizedPlatform.Variant } return os, arch, variant