2019-07-16 15:19:33 +02:00
|
|
|
/*
|
|
|
|
|
Copyright 2019 The Rook Authors. All rights reserved.
|
|
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
|
limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-03-12 11:49:35 -07:00
|
|
|
package version
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
2019-04-07 00:03:29 -06:00
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2019-03-12 11:49:35 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestToString(t *testing.T) {
|
2024-10-02 14:11:55 -06:00
|
|
|
assert.Equal(t, "19.0.0-0 squid", Squid.String())
|
2019-03-12 11:49:35 -07:00
|
|
|
|
2022-07-01 10:38:15 -06:00
|
|
|
received := CephVersion{-1, 0, 0, 0, ""}
|
2019-12-02 11:47:45 +01:00
|
|
|
expected := fmt.Sprintf("-1.0.0-0 %s", unknownVersionString)
|
2020-11-06 09:46:09 +01:00
|
|
|
assert.Equal(t, expected, received.String())
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
|
2019-04-09 17:36:58 +02:00
|
|
|
func TestCephVersionFormatted(t *testing.T) {
|
2024-10-02 14:11:55 -06:00
|
|
|
assert.Equal(t, "ceph version 19.0.0-0 squid", Squid.CephVersionFormatted())
|
2019-04-09 17:36:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-03-12 11:49:35 -07:00
|
|
|
func TestReleaseName(t *testing.T) {
|
2024-10-02 14:11:55 -06:00
|
|
|
assert.Equal(t, "squid", Squid.ReleaseName())
|
2021-06-07 15:20:50 +05:30
|
|
|
ver := CephVersion{-1, 0, 0, 0, ""}
|
2019-03-12 11:49:35 -07:00
|
|
|
assert.Equal(t, unknownVersionString, ver.ReleaseName())
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-16 17:22:10 -06:00
|
|
|
func extractVersionHelper(t *testing.T, text string, major, minor, extra, build int, commitID string) {
|
2019-03-12 11:49:35 -07:00
|
|
|
v, err := ExtractCephVersion(text)
|
|
|
|
|
if assert.NoError(t, err) {
|
2021-06-07 15:20:50 +05:30
|
|
|
assert.Equal(t, *v, CephVersion{major, minor, extra, build, commitID})
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestExtractVersion(t *testing.T) {
|
|
|
|
|
// release build
|
2025-12-02 14:29:23 +05:30
|
|
|
v0c := "ceph version 19.2.6 (ae699615bac534ea496ee965ac6192cb7e0e07c1) squid (stable)"
|
2019-03-12 11:49:35 -07:00
|
|
|
v0d := `
|
|
|
|
|
root@7a97f5a78bc6:/# ceph --version
|
2025-12-02 14:29:23 +05:30
|
|
|
ceph version 19.2.6 (ae699615bac534ea496ee965ac6192cb7e0e07c1) squid (stable)
|
2019-03-12 11:49:35 -07:00
|
|
|
`
|
2025-12-02 14:29:23 +05:30
|
|
|
extractVersionHelper(t, v0c, 19, 2, 6, 0, "ae699615bac534ea496ee965ac6192cb7e0e07c1")
|
|
|
|
|
extractVersionHelper(t, v0d, 19, 2, 6, 0, "ae699615bac534ea496ee965ac6192cb7e0e07c1")
|
2019-03-12 11:49:35 -07:00
|
|
|
|
|
|
|
|
// development build
|
2025-12-02 14:29:23 +05:30
|
|
|
v1c := "ceph version 19.1.33-403-g7ba6bece41 (7ba6bece4187eda5d05a9b84211fe6ba8dd287bd) squid (rc)"
|
2019-03-12 11:49:35 -07:00
|
|
|
v1d := `
|
|
|
|
|
bin/ceph --version
|
|
|
|
|
*** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
|
2025-12-02 14:29:23 +05:30
|
|
|
ceph version 19.1.33-403-g7ba6bece41
|
|
|
|
|
(7ba6bece4187eda5d05a9b84211fe6ba8dd287bd) squid (rc)
|
2019-03-12 11:49:35 -07:00
|
|
|
`
|
2025-12-02 14:29:23 +05:30
|
|
|
extractVersionHelper(t, v1c, 19, 1, 33, 403, "7ba6bece4187eda5d05a9b84211fe6ba8dd287bd")
|
|
|
|
|
extractVersionHelper(t, v1d, 19, 1, 33, 403, "7ba6bece4187eda5d05a9b84211fe6ba8dd287bd")
|
2019-03-12 11:49:35 -07:00
|
|
|
|
|
|
|
|
// build without git version info. it is possible to build the ceph tree
|
|
|
|
|
// without a version number, but none of the container builds do this.
|
|
|
|
|
// it is arguable that this should be a requirement since we are
|
|
|
|
|
// explicitly adding fine-grained versioning to avoid issues with
|
|
|
|
|
// release granularity. adding the reverse name-to-version is easy
|
|
|
|
|
// enough if this ever becomes a need.
|
2025-12-02 14:29:23 +05:30
|
|
|
v2c := "ceph version Development (no_version) squid (rc)"
|
2019-03-12 11:49:35 -07:00
|
|
|
v2d := `
|
|
|
|
|
bin/ceph --version
|
|
|
|
|
*** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
|
2025-12-02 14:29:23 +05:30
|
|
|
ceph version Development (no_version) squid (rc)
|
2019-03-12 11:49:35 -07:00
|
|
|
`
|
|
|
|
|
v, err := ExtractCephVersion(v2c)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
assert.Nil(t, v)
|
|
|
|
|
|
|
|
|
|
v, err = ExtractCephVersion(v2d)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
assert.Nil(t, v)
|
2021-07-16 17:22:10 -06:00
|
|
|
|
|
|
|
|
// Test the round trip for serializing and deserializing the version
|
2025-12-02 14:29:23 +05:30
|
|
|
v3c := "ceph version 19.2.5-1 squid"
|
2021-07-16 17:22:10 -06:00
|
|
|
v, err = ExtractCephVersion(v3c)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.NotNil(t, v)
|
2025-12-02 14:29:23 +05:30
|
|
|
assert.Equal(t, "19.2.5-1 squid", v.String())
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSupported(t *testing.T) {
|
|
|
|
|
for _, v := range supportedVersions {
|
|
|
|
|
assert.True(t, v.Supported())
|
|
|
|
|
}
|
2025-12-01 13:38:18 +05:30
|
|
|
assert.False(t, Umbrella.Supported())
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIsRelease(t *testing.T) {
|
2024-10-02 14:11:55 -06:00
|
|
|
assert.True(t, Squid.isRelease(Squid))
|
2025-12-02 14:29:23 +05:30
|
|
|
assert.True(t, Tentacle.isRelease(Tentacle))
|
2019-03-12 11:49:35 -07:00
|
|
|
|
2025-12-02 14:29:23 +05:30
|
|
|
assert.False(t, Squid.isRelease(Tentacle))
|
2019-03-12 11:49:35 -07:00
|
|
|
|
2025-12-02 14:29:23 +05:30
|
|
|
SquidUpdate := Squid
|
|
|
|
|
SquidUpdate.Minor = 33
|
|
|
|
|
SquidUpdate.Extra = 4
|
|
|
|
|
assert.True(t, SquidUpdate.isRelease(Squid))
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVersionAtLeast(t *testing.T) {
|
2024-10-02 14:11:55 -06:00
|
|
|
assert.True(t, Squid.IsAtLeast(Squid))
|
2025-09-17 13:33:39 +05:30
|
|
|
assert.True(t, Tentacle.IsAtLeast(Tentacle))
|
|
|
|
|
assert.True(t, Tentacle.IsAtLeast(Squid))
|
2019-03-12 11:49:35 -07:00
|
|
|
|
2021-06-07 15:20:50 +05:30
|
|
|
assert.True(t, (&CephVersion{1, 0, 0, 0, ""}).IsAtLeast(CephVersion{0, 0, 0, 0, ""}))
|
|
|
|
|
assert.False(t, (&CephVersion{0, 0, 0, 0, ""}).IsAtLeast(CephVersion{1, 0, 0, 0, ""}))
|
|
|
|
|
assert.True(t, (&CephVersion{1, 1, 0, 0, ""}).IsAtLeast(CephVersion{1, 0, 0, 0, ""}))
|
|
|
|
|
assert.False(t, (&CephVersion{1, 0, 0, 0, ""}).IsAtLeast(CephVersion{1, 1, 0, 0, ""}))
|
|
|
|
|
assert.True(t, (&CephVersion{1, 1, 1, 0, ""}).IsAtLeast(CephVersion{1, 1, 0, 0, ""}))
|
|
|
|
|
assert.False(t, (&CephVersion{1, 1, 0, 0, ""}).IsAtLeast(CephVersion{1, 1, 1, 0, ""}))
|
|
|
|
|
assert.True(t, (&CephVersion{1, 1, 1, 0, ""}).IsAtLeast(CephVersion{1, 1, 1, 0, ""}))
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVersionAtLeastX(t *testing.T) {
|
2025-12-02 14:29:23 +05:30
|
|
|
assert.True(t, Squid.IsAtLeastSquid())
|
|
|
|
|
assert.False(t, Squid.IsAtLeastTentacle())
|
|
|
|
|
assert.True(t, Tentacle.IsAtLeastSquid())
|
|
|
|
|
assert.True(t, Tentacle.IsAtLeastTentacle())
|
2019-03-12 11:49:35 -07:00
|
|
|
}
|
2019-07-16 15:19:33 +02:00
|
|
|
|
|
|
|
|
func TestIsIdentical(t *testing.T) {
|
2021-08-26 16:43:42 +05:30
|
|
|
assert.True(t, IsIdentical(CephVersion{15, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.False(t, IsIdentical(CephVersion{16, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
2019-07-16 15:19:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIsSuperior(t *testing.T) {
|
2021-08-26 16:43:42 +05:30
|
|
|
assert.False(t, IsSuperior(CephVersion{15, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.False(t, IsSuperior(CephVersion{15, 2, 2, 0, ""}, CephVersion{16, 2, 2, 0, ""}))
|
|
|
|
|
assert.True(t, IsSuperior(CephVersion{16, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
2021-06-07 15:20:50 +05:30
|
|
|
assert.True(t, IsSuperior(CephVersion{15, 2, 2, 0, ""}, CephVersion{15, 1, 3, 0, ""}))
|
|
|
|
|
assert.True(t, IsSuperior(CephVersion{15, 2, 2, 0, ""}, CephVersion{15, 2, 1, 0, ""}))
|
|
|
|
|
assert.True(t, IsSuperior(CephVersion{15, 2, 2, 1, ""}, CephVersion{15, 2, 1, 0, ""}))
|
2019-07-16 15:19:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIsInferior(t *testing.T) {
|
2021-08-26 16:43:42 +05:30
|
|
|
assert.False(t, IsInferior(CephVersion{15, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.False(t, IsInferior(CephVersion{16, 2, 2, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.True(t, IsInferior(CephVersion{15, 2, 2, 0, ""}, CephVersion{16, 2, 2, 0, ""}))
|
2021-06-07 15:20:50 +05:30
|
|
|
assert.True(t, IsInferior(CephVersion{15, 1, 3, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.True(t, IsInferior(CephVersion{15, 2, 1, 0, ""}, CephVersion{15, 2, 2, 0, ""}))
|
|
|
|
|
assert.True(t, IsInferior(CephVersion{15, 2, 1, 0, ""}, CephVersion{15, 2, 2, 1, ""}))
|
2019-07-16 15:19:33 +02:00
|
|
|
}
|
2019-08-30 17:24:26 +02:00
|
|
|
|
|
|
|
|
func TestValidateCephVersionsBetweenLocalAndExternalClusters(t *testing.T) {
|
|
|
|
|
// TEST 1: versions are identical
|
2024-05-15 00:42:20 +00:00
|
|
|
localCephVersion := CephVersion{Major: 17, Minor: 2, Extra: 1}
|
|
|
|
|
externalCephVersion := CephVersion{Major: 17, Minor: 2, Extra: 1}
|
2019-08-30 17:24:26 +02:00
|
|
|
err := ValidateCephVersionsBetweenLocalAndExternalClusters(localCephVersion, externalCephVersion)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// TEST 2: local cluster version major is lower than external cluster version
|
2024-05-15 00:42:20 +00:00
|
|
|
localCephVersion = CephVersion{Major: 17, Minor: 2, Extra: 1}
|
|
|
|
|
externalCephVersion = CephVersion{Major: 18, Minor: 2, Extra: 1}
|
2019-08-30 17:24:26 +02:00
|
|
|
err = ValidateCephVersionsBetweenLocalAndExternalClusters(localCephVersion, externalCephVersion)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// TEST 3: local cluster version major is higher than external cluster version
|
2024-05-15 00:42:20 +00:00
|
|
|
localCephVersion = CephVersion{Major: 17, Minor: 2, Extra: 1}
|
|
|
|
|
externalCephVersion = CephVersion{Major: 16, Minor: 2, Extra: 1}
|
2019-08-30 17:24:26 +02:00
|
|
|
err = ValidateCephVersionsBetweenLocalAndExternalClusters(localCephVersion, externalCephVersion)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
// TEST 4: local version is > but from a minor release
|
|
|
|
|
// local version must never be higher
|
2024-05-15 00:42:20 +00:00
|
|
|
localCephVersion = CephVersion{Major: 17, Minor: 2, Extra: 2}
|
|
|
|
|
externalCephVersion = CephVersion{Major: 17, Minor: 2, Extra: 1}
|
2019-08-30 17:24:26 +02:00
|
|
|
err = ValidateCephVersionsBetweenLocalAndExternalClusters(localCephVersion, externalCephVersion)
|
|
|
|
|
assert.Error(t, err)
|
|
|
|
|
|
|
|
|
|
// TEST 5: external version is > but from a minor release
|
2021-08-26 16:43:42 +05:30
|
|
|
localCephVersion = CephVersion{Major: 15, Minor: 2, Extra: 1}
|
|
|
|
|
externalCephVersion = CephVersion{Major: 15, Minor: 2, Extra: 2}
|
2019-08-30 17:24:26 +02:00
|
|
|
err = ValidateCephVersionsBetweenLocalAndExternalClusters(localCephVersion, externalCephVersion)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
}
|
2020-11-05 18:24:06 +01:00
|
|
|
|
|
|
|
|
func TestCephVersion_Unsupported(t *testing.T) {
|
|
|
|
|
type fields struct {
|
|
|
|
|
Major int
|
|
|
|
|
Minor int
|
|
|
|
|
Extra int
|
|
|
|
|
Build int
|
|
|
|
|
}
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
fields fields
|
|
|
|
|
want bool
|
|
|
|
|
}{
|
2024-10-02 14:11:55 -06:00
|
|
|
{"squid", fields{Major: 19, Minor: 2, Extra: 0, Build: 0}, false},
|
2025-12-02 14:29:23 +05:30
|
|
|
{"squid", fields{Major: 19, Minor: 2, Extra: 0, Build: 0}, false},
|
2020-11-05 18:24:06 +01:00
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
v := &CephVersion{
|
|
|
|
|
Major: tt.fields.Major,
|
|
|
|
|
Minor: tt.fields.Minor,
|
|
|
|
|
Extra: tt.fields.Extra,
|
|
|
|
|
Build: tt.fields.Build,
|
|
|
|
|
}
|
|
|
|
|
if got := v.Unsupported(); got != tt.want {
|
|
|
|
|
t.Errorf("CephVersion.Unsupported() = %v, want %v", got, tt.want)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|