diff --git a/staging/src/k8s.io/component-base/metrics/registry.go b/staging/src/k8s.io/component-base/metrics/registry.go index 35e878997db..fa1854bd69c 100644 --- a/staging/src/k8s.io/component-base/metrics/registry.go +++ b/staging/src/k8s.io/component-base/metrics/registry.go @@ -49,6 +49,29 @@ func shouldHide(currentVersion *semver.Version, deprecatedVersion *semver.Versio return false } +func validateShowHiddenMetricsVersion(currentVersion semver.Version, targetVersionStr string) error { + if targetVersionStr == "" { + return nil + } + + validVersionStr := fmt.Sprintf("%d.%d", currentVersion.Major, currentVersion.Minor-1) + if targetVersionStr != validVersionStr { + return fmt.Errorf("--show-hidden-metrics-for-version must be omitted or have the value '%v'. Only the previous minor version is allowed", validVersionStr) + } + + return nil +} + +// ValidateShowHiddenMetricsVersion checks invalid version for which show hidden metrics. +func ValidateShowHiddenMetricsVersion(v string) []error { + err := validateShowHiddenMetricsVersion(parseVersion(version.Get()), v) + if err != nil { + return []error{err} + } + + return nil +} + // SetShowHidden will enable showing hidden metrics. This will no-opt // after the initial call func SetShowHidden() { diff --git a/staging/src/k8s.io/component-base/metrics/registry_test.go b/staging/src/k8s.io/component-base/metrics/registry_test.go index c9311c652a0..2e232949799 100644 --- a/staging/src/k8s.io/component-base/metrics/registry_test.go +++ b/staging/src/k8s.io/component-base/metrics/registry_test.go @@ -264,3 +264,56 @@ func TestShowHiddenMetric(t *testing.T) { assert.Nil(t, err, "Gather failed %v", err) } + +func TestValidateShowHiddenMetricsVersion(t *testing.T) { + currentVersion := parseVersion(apimachineryversion.Info{ + Major: "1", + Minor: "17", + GitVersion: "v1.17.1-alpha-1.12345", + }) + + var tests = []struct { + desc string + targetVersion string + expectedError bool + }{ + { + desc: "invalid version is not allowed", + targetVersion: "1.invalid", + expectedError: true, + }, + { + desc: "patch version is not allowed", + targetVersion: "1.16.0", + expectedError: true, + }, + { + desc: "old version is not allowed", + targetVersion: "1.15", + expectedError: true, + }, + { + desc: "new version is not allowed", + targetVersion: "1.17", + expectedError: true, + }, + { + desc: "valid version is allowed", + targetVersion: "1.16", + expectedError: false, + }, + } + + for _, test := range tests { + tc := test + t.Run(tc.desc, func(t *testing.T) { + err := validateShowHiddenMetricsVersion(currentVersion, tc.targetVersion) + + if tc.expectedError { + assert.Errorf(t, err, "Failed to test: %s", tc.desc) + } else { + assert.NoErrorf(t, err, "Failed to test: %s", tc.desc) + } + }) + } +}