helpers/container/windows/version.go (37 lines of code) (raw):
package windows
import (
"errors"
"fmt"
"strings"
)
const (
// V1809 is the Windows version that is 1809 and also known as Windows 2019
// ltsc.
V1809 = "1809"
// V21H2 is the Windows version that is 21H2 also known as Windows 2022 LTSC.
V21H2 = "21H2"
// V24H2 is the Windows version that is 24H2 also known as Windows 2025 LTSC.
V24H2 = "24H2"
)
var ErrUnsupportedWindowsVersion = errors.New("unsupported Windows version")
var supportedWindowsBuilds = map[string]string{
// Windows server versions: https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions#Server_versions
// Compatibility: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility#windows-server-host-os-compatibility
"10.0.17763": V1809,
"10.0.20348": V21H2,
"10.0.26100": V24H2,
// Windows client versions: https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions#Personal_computer_versions
// Compatibility: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility#windows-client-host-os-compatibility
"10.0.19043": V1809,
"10.0.19044": V1809,
"10.0.19045": V1809,
"10.0.22000": V21H2,
"10.0.22621": V21H2,
"10.0.22631": V21H2,
}
// Version checks the specified kernel version to see if it's one of the
// supported Windows versions. If so, it returns the Windows servercore
// version is supported by that kernel version.
// UnsupportedWindowsVersionError is returned when no supported Windows version
// is found in the string.
func Version(version string) (string, error) {
semver := strings.FieldsFunc(version, func(r rune) bool {
return r == '.' || r == ' '
})
if len(semver) < 3 {
return "", fmt.Errorf("%w: %v", ErrUnsupportedWindowsVersion, version)
}
build := strings.Join(semver[:3], ".")
windowsVersion, ok := supportedWindowsBuilds[build]
if ok {
return windowsVersion, nil
}
return "", fmt.Errorf("%w: %v", ErrUnsupportedWindowsVersion, version)
}