diff --git a/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion.go b/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion.go index 3391328d6a5..6f672c4b460 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion.go @@ -40,6 +40,8 @@ func (i InvalidResourceVersion) Error() string { // The function will return an error if the resource version is not a properly // formatted positive integer, but has no restriction on length. A properly // formatted integer will not contain leading zeros or non integer characters. +// Zero is also considered an invalid value as it is used as a special value in +// list/watch events and will never be a live resource version. func CompareResourceVersion(a, b string) (int, error) { if !isWellFormed(a) { return 0, InvalidResourceVersion{rv: a} diff --git a/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion_test.go b/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion_test.go index a327e419be5..dd3785e9ac9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/resourceversion/resourceversion_test.go @@ -34,12 +34,36 @@ func TestCompareResourceVersion(t *testing.T) { b: "200", expected: -1, }, + { + name: "a is zero, invalid", + a: "0", + b: "1", + err: true, + }, + { + name: "both zero", + a: "0", + b: "0", + err: true, + }, { name: "a greater than b", a: "200", b: "100", expected: 1, }, + { + name: "b is 0, invalid", + a: "1", + b: "0", + err: true, + }, + { + name: "a equal to b small", + a: "1", + b: "1", + expected: 0, + }, { name: "a equal to b", a: "100", diff --git a/test/e2e/common/apimachinery/resourceversion_matchers.go b/test/e2e/common/apimachinery/resourceversion_matchers.go index c7aaa0bcb5f..0b89b63a308 100644 --- a/test/e2e/common/apimachinery/resourceversion_matchers.go +++ b/test/e2e/common/apimachinery/resourceversion_matchers.go @@ -57,6 +57,10 @@ func (m *HaveValidResourceVersionMatcher) Match(actual interface{}) (success boo m.failureReason = fmt.Sprintf("resource version requires %d bits (more than 128)", val.BitLen()) return false, nil } + if val.Cmp(big.NewInt(0)) == 0 { + m.failureReason = "the resource version is zero which is not valid" + return false, nil + } return true, nil } diff --git a/test/e2e/common/apimachinery/resourceversion_matchers_test.go b/test/e2e/common/apimachinery/resourceversion_matchers_test.go index bc3639e4e50..eda5b0b4be4 100644 --- a/test/e2e/common/apimachinery/resourceversion_matchers_test.go +++ b/test/e2e/common/apimachinery/resourceversion_matchers_test.go @@ -38,7 +38,8 @@ func TestHaveValidResourceVersionMatch(t *testing.T) { { name: "zero resource version", resourceVersion: "0", - expectedMatch: true, + expectedMatch: false, + expectedFailure: "Expected resource version to be a valid uint128, but got \"0\": the resource version is zero which is not valid", }, { name: "negative resource version",