From cfb30a31a8507e4417d42d38c9a99b04fc8af8a9 Mon Sep 17 00:00:00 2001 From: Kirtana Ashok Date: Wed, 5 Jul 2023 10:11:57 -0700 Subject: [PATCH] Invoke Stable ABI compatibility function in windows platform matcher Signed-off-by: Kirtana Ashok --- platforms/defaults_windows.go | 26 +++++++- platforms/defaults_windows_test.go | 104 +++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/platforms/defaults_windows.go b/platforms/defaults_windows.go index fd5756516..d10fa9012 100644 --- a/platforms/defaults_windows.go +++ b/platforms/defaults_windows.go @@ -22,6 +22,7 @@ import ( "strconv" "strings" + "github.com/Microsoft/hcsshim/osversion" specs "github.com/opencontainers/image-spec/specs-go/v1" "golang.org/x/sys/windows" ) @@ -50,15 +51,36 @@ func (m windowsmatcher) Match(p specs.Platform) bool { match := m.defaultMatcher.Match(p) if match && m.OS == "windows" { - if strings.HasPrefix(p.OSVersion, m.osVersionPrefix) { + // HPC containers do not have OS version filled + if p.OSVersion == "" { return true } - return p.OSVersion == "" + + hostOsVersion := GetOsVersion(m.osVersionPrefix) + ctrOsVersion := GetOsVersion(p.OSVersion) + return osversion.CheckHostAndContainerCompat(hostOsVersion, ctrOsVersion) } return match } +func GetOsVersion(osVersionPrefix string) osversion.OSVersion { + parts := strings.Split(osVersionPrefix, ".") + if len(parts) < 3 { + return osversion.OSVersion{} + } + + majorVersion, _ := strconv.Atoi(parts[0]) + minorVersion, _ := strconv.Atoi(parts[1]) + buildNumber, _ := strconv.Atoi(parts[2]) + + return osversion.OSVersion{ + MajorVersion: uint8(majorVersion), + MinorVersion: uint8(minorVersion), + Build: uint16(buildNumber), + } +} + // Less sorts matched platforms in front of other platforms. // For matched platforms, it puts platforms with larger revision // number in front. diff --git a/platforms/defaults_windows_test.go b/platforms/defaults_windows_test.go index 468438038..ab73ddda0 100644 --- a/platforms/defaults_windows_test.go +++ b/platforms/defaults_windows_test.go @@ -142,6 +142,110 @@ func TestMatchComparerMatch_WCOW(t *testing.T) { } } +// TestMatchComparerMatch_ABICheckWCOW checks windows platform matcher +// behavior for stable ABI and non-stable ABI compliant versions +func TestMatchComparerMatch_ABICheckWCOW(t *testing.T) { + platformWS2019 := imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.17763", + } + platformWS2022 := imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.20348", + } + platformWindows11 := imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.22621", + } + matcherWS2019 := windowsmatcher{ + Platform: platformWS2019, + osVersionPrefix: platformWS2019.OSVersion, + defaultMatcher: &matcher{ + Platform: Normalize(platformWS2019), + }, + } + matcherWS2022 := windowsmatcher{ + Platform: platformWS2022, + osVersionPrefix: platformWS2022.OSVersion, + defaultMatcher: &matcher{ + Platform: Normalize(platformWS2022), + }, + } + matcherWindows11 := windowsmatcher{ + Platform: platformWindows11, + osVersionPrefix: platformWindows11.OSVersion, + defaultMatcher: &matcher{ + Platform: Normalize(platformWindows11), + }, + } + + for _, test := range []struct { + hostPlatformMatcher windowsmatcher + testPlatform imagespec.Platform + match bool + }{ + { + hostPlatformMatcher: matcherWS2019, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.17763", + }, + match: true, + }, + { + hostPlatformMatcher: matcherWS2019, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.20348", + }, + match: false, + }, + { + hostPlatformMatcher: matcherWS2022, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.17763", + }, + match: false, + }, + { + hostPlatformMatcher: matcherWS2022, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.20348", + }, + match: true, + }, + { + hostPlatformMatcher: matcherWindows11, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.17763", + }, + match: false, + }, + { + hostPlatformMatcher: matcherWindows11, + testPlatform: imagespec.Platform{ + Architecture: "amd64", + OS: "windows", + OSVersion: "10.0.20348", + }, + match: true, + }, + } { + assert.Equal(t, test.match, test.hostPlatformMatcher.Match(test.testPlatform), "should match: %t, %s to %s", test.match, test.hostPlatformMatcher.Platform, test.testPlatform) + } +} + func TestMatchComparerMatch_LCOW(t *testing.T) { major, minor, build := windows.RtlGetNtVersionNumbers() buildStr := fmt.Sprintf("%d.%d.%d", major, minor, build)