diff --git a/validators/kernel_validator.go b/validators/kernel_validator.go index 96e0788..2ac3e08 100644 --- a/validators/kernel_validator.go +++ b/validators/kernel_validator.go @@ -67,7 +67,8 @@ func (k *KernelValidator) Validate(spec SysSpec) ([]error, []error) { } k.kernelRelease = release var errs []error - if err = k.validateKernelVersion(spec.KernelSpec); err != nil { + err = k.validateKernelVersion(spec.KernelSpec) + if err != nil { errs = append(errs, err) } // only validate kernel config when necessary (currently no kernel config for windows) @@ -80,17 +81,20 @@ func (k *KernelValidator) Validate(spec SysSpec) ([]error, []error) { } // validateKernelVersion validates the kernel version. -func (k *KernelValidator) validateKernelVersion(kSpec KernelSpec) error { - versionRegexps := kSpec.Versions - for _, versionRegexp := range versionRegexps { +func (k *KernelValidator) validateKernelVersion(kSpec KernelSpec) (err error) { + var matched bool + for _, versionRegexp := range kSpec.Versions { r := regexp.MustCompile(versionRegexp) if r.MatchString(k.kernelRelease) { - k.Reporter.Report("KERNEL_VERSION", k.kernelRelease, good) - return nil + matched = true + break } } - k.Reporter.Report("KERNEL_VERSION", k.kernelRelease, bad) - return fmt.Errorf("unsupported kernel release: %s", k.kernelRelease) + if !matched { + err = fmt.Errorf("unsupported kernel release: %s", k.kernelRelease) + k.Reporter.Report("KERNEL_VERSION", k.kernelRelease, good) + } + return } // validateKernelConfig validates the kernel configurations. diff --git a/validators/kernel_validator_test.go b/validators/kernel_validator_test.go index 7c303ae..ec89887 100644 --- a/validators/kernel_validator_test.go +++ b/validators/kernel_validator_test.go @@ -31,22 +31,42 @@ func TestValidateKernelVersion(t *testing.T) { // they may be different. // This is fine, because the test mainly tests the kernel version validation logic, // not the DefaultSysSpec. The DefaultSysSpec should be tested with node e2e. - testRegex := []string{`^3\.[1-9][0-9].*$`, `^([4-9]|[1-9][0-9]+)\.([0-9]+)\.([0-9]+).*$`} + testRegex := []string{`^4\.4.*$`, `^4\.19.*$`, `^4\.[2-9][0-9].*$`, `^([5-9]|[1-9][0-9]+)\.([0-9]+)\.([0-9]+).*$`} for _, test := range []struct { name string version string err bool }{ { - name: "3.19.9-99-test first version regex matches", + name: "3.19.9-99-test no version regex matches", version: "3.19.9-99-test", - err: false, + err: true, }, { - name: "4.4.14+ one of version regexes matches", + name: "4.4.14+ no version regex matches", version: "4.4.14+", err: false, }, + { + name: "4.17.3 no version regex matches", + version: "4.17.3", + err: true, + }, + { + name: "4.19.3-99-test matches", + version: "4.19.3-99-test", + err: false, + }, + { + name: "4.20.3+ matches", + version: "4.20.3+", + err: false, + }, + { + name: "5.12.3 matches", + version: "5.12.3", + err: false, + }, { name: "2.0.0 no version regex matches", version: "2.0.0", @@ -79,7 +99,7 @@ func TestValidateKernelVersion(t *testing.T) { if !test.err { assert.Nil(t, err, "Expect error not to occur with kernel version %q", test.version) } else { - assert.NotNil(t, err, "Expect error to occur with kenrel version %q", test.version) + assert.NotNil(t, err, "Expect error to occur with kernel version %q", test.version) } }) } @@ -189,7 +209,7 @@ func TestValidateCachedKernelConfig(t *testing.T) { if !test.err { assert.Nil(t, err, "Expect error not to occur with kernel config %q", test.config) } else { - assert.NotNil(t, err, "Expect error to occur with kenrel config %q", test.config) + assert.NotNil(t, err, "Expect error to occur with kernel config %q", test.config) } }) } diff --git a/validators/types.go b/validators/types.go index d711cdc..5bc14dc 100644 --- a/validators/types.go +++ b/validators/types.go @@ -42,6 +42,8 @@ type KernelConfig struct { type KernelSpec struct { // Versions define supported kernel version. It is a group of regexps. Versions []string `json:"versions,omitempty"` + // VersionsNote provides a prompt message for user if Versions do not match. + VersionsNote string `json:"versionsNote,omitempty"` // Required contains all kernel configurations required to be enabled // (built in or as module). Required []KernelConfig `json:"required,omitempty"` diff --git a/validators/types_unix.go b/validators/types_unix.go index b70947f..b2fb9d1 100644 --- a/validators/types_unix.go +++ b/validators/types_unix.go @@ -28,7 +28,10 @@ import ( var DefaultSysSpec = SysSpec{ OS: "Linux", KernelSpec: KernelSpec{ - Versions: []string{`^3\.[1-9][0-9].*$`, `^([4-9]|[1-9][0-9]+)\.([0-9]+)\.([0-9]+).*$`}, // Requires 3.10+, or newer + // 4.4 & 4.19 are selected as kernel Super Long Term Support (SLTS), and the Civil Infrastructure Platform will provide support until at least 2026. + // For cgroup v2, Kubernetes recommends to use 5.8 and later, and in runc docs, the minimal version is 4.15 and 5.2+ is recommended. + Versions: []string{`^4\.4.*$`, `^4\.19.*$`, `^4\.[2-9][0-9].*$`, `^([5-9]|[1-9][0-9]+)\.([0-9]+)\.([0-9]+).*$`}, // Requires 5.8+, or newer for cgroup v2 + VersionsNote: "kernel version should be in maintenance, at least 4.4 or 4.19+, and to use cgroup v2, 5.8+ is recommended.", // TODO(random-liu): Add more config // TODO(random-liu): Add description for each kernel configuration: Required: []KernelConfig{ diff --git a/validators/types_windows.go b/validators/types_windows.go index cce90f6..f8ea81b 100644 --- a/validators/types_windows.go +++ b/validators/types_windows.go @@ -28,10 +28,11 @@ import ( var DefaultSysSpec = SysSpec{ OS: "Microsoft Windows Server 2016", KernelSpec: KernelSpec{ - Versions: []string{`10\.0\.1439[3-9]`, `10\.0\.14[4-9][0-9]{2}`, `10\.0\.1[5-9][0-9]{3}`, `10\.0\.[2-9][0-9]{4}`, `10\.[1-9]+\.[0-9]+`}, //requires >= '10.0.14393' - Required: []KernelConfig{}, - Optional: []KernelConfig{}, - Forbidden: []KernelConfig{}, + Versions: []string{`10\.0\.1439[3-9]`, `10\.0\.14[4-9][0-9]{2}`, `10\.0\.1[5-9][0-9]{3}`, `10\.0\.[2-9][0-9]{4}`, `10\.[1-9]+\.[0-9]+`}, //requires >= '10.0.14393' + VersionsNote: "kernel version should>= '10.0.14393'", + Required: []KernelConfig{}, + Optional: []KernelConfig{}, + Forbidden: []KernelConfig{}, }, RuntimeSpec: RuntimeSpec{ DockerSpec: &DockerSpec{