diff --git a/pkg/manager/member/tidb_member_manager_test.go b/pkg/manager/member/tidb_member_manager_test.go index 51d745a588f..fb446fc589f 100644 --- a/pkg/manager/member/tidb_member_manager_test.go +++ b/pkg/manager/member/tidb_member_manager_test.go @@ -2798,6 +2798,19 @@ func TestTiDBMemberManagerSetServerLabels(t *testing.T) { }, setCount: 0, }, + { + name: "sha256 version string", + tidbVersion: "d7f62aab6315b4378cbbfaaaaaaaaaaaaaaaa90ecaf7e0f22d2225304822ee2e", + members: []Member{ + { + node: "node-1", + }, + { + node: "node-2", + }, + }, + setCount: 2, + }, { name: "skip unhealthy pods", members: []Member{ diff --git a/pkg/util/cmpver/cmpver.go b/pkg/util/cmpver/cmpver.go index 825659db281..5ff02bdd96b 100644 --- a/pkg/util/cmpver/cmpver.go +++ b/pkg/util/cmpver/cmpver.go @@ -14,6 +14,7 @@ package cmpver import ( + "encoding/hex" "fmt" "strings" @@ -98,8 +99,12 @@ func NewConstraint(op Operation, version string) (*Constraint, error) { // Dirty versions and pre versions are regarded as standard version. // For example: 'v5.1.2-dev' and 'v5.1.2-betav1' are regarded as 'v5.1.2'. // -// Latest, nightly or master version is larger than any version +// sha256, Latest, nightly or master version is larger than any version func (c *Constraint) Check(version string) (bool, error) { + if isSha(version) { + return compareSha(c.op), nil + } + if isLatest(version) { return compareLatest(c.op), nil } @@ -155,3 +160,27 @@ func compareLatest(op Operation) bool { return false } + +func isSha(version string) bool { + if len(version) != 64 { + return false + } + _, err := hex.DecodeString(version) + if err != nil { + return false + } + + return true +} + +func compareSha(op Operation) bool { + // Sha is greater than any version + switch op { + case Greater, GreaterOrEqual: + return true + case Less, LessOrEqual: + return false + } + + return false +} diff --git a/pkg/util/cmpver/cmpver_test.go b/pkg/util/cmpver/cmpver_test.go index 58837e85274..5657265e545 100644 --- a/pkg/util/cmpver/cmpver_test.go +++ b/pkg/util/cmpver/cmpver_test.go @@ -75,6 +75,7 @@ func genTestCases() []testcase { {"latest-dev", Greater, "v5.3.1", true}, {"nightly-dev", Greater, "v5.3.1", true}, {"master-dev", Greater, "v5.3.1", true}, + {"d7f62aab6315b4378cbbfaaaaaaaaaaaaaaaa90ecaf7e0f22d2225304822ee2e", Greater, "v5.3.1", true}, // GreaterOrEqual {"v5.3.1", GreaterOrEqual, "v5.1.2", true}, {"5.3.1", GreaterOrEqual, "5.1.2", true}, @@ -90,6 +91,7 @@ func genTestCases() []testcase { {"latest-dev", GreaterOrEqual, "v5.3.1", true}, {"nightly-dev", GreaterOrEqual, "v5.3.1", true}, {"master-dev", GreaterOrEqual, "v5.3.1", true}, + {"d7f62aab6315b4378cbbfaaaaaaaaaaaaaaaa90ecaf7e0f22d2225304822ee2e", GreaterOrEqual, "v5.3.1", true}, // Less {"v5.3.1", Less, "v5.1.2", false}, {"v5.1.2", Less, "v5.3.1", true}, @@ -104,6 +106,7 @@ func genTestCases() []testcase { {"latest-dev", Less, "v5.3.1", false}, {"nightly-dev", Less, "v5.3.1", false}, {"master-dev", Less, "v5.3.1", false}, + {"d7f62aab6315b4378cbbfaaaaaaaaaaaaaaaa90ecaf7e0f22d2225304822ee2e", Less, "v5.3.1", false}, // LessOrEqual {"v5.3.1", LessOrEqual, "v5.1.2", false}, {"5.3.1", LessOrEqual, "5.1.2", false}, @@ -118,5 +121,6 @@ func genTestCases() []testcase { {"latest-dev", LessOrEqual, "v5.3.1", false}, {"nightly-dev", LessOrEqual, "v5.3.1", false}, {"master-dev", LessOrEqual, "v5.3.1", false}, + {"d7f62aab6315b4378cbbfaaaaaaaaaaaaaaaa90ecaf7e0f22d2225304822ee2e", LessOrEqual, "v5.3.1", false}, } }