diff --git a/cmd/control/util.go b/cmd/control/util.go index 4f7730c9..1386b648 100644 --- a/cmd/control/util.go +++ b/cmd/control/util.go @@ -10,6 +10,7 @@ import ( "github.com/rancher/os/config" "github.com/rancher/os/pkg/log" + "github.com/rancher/os/pkg/util/versions" "github.com/pkg/errors" ) @@ -34,6 +35,7 @@ func formatImage(image string, cfg *config.CloudConfig) string { } func symLinkEngineBinary(version string) []symlink { + versionNum := strings.Replace(strings.Replace(version, "docker-", "", -1), "-ce", "", -1) baseSymlink := []symlink{ {"/var/lib/rancher/engine/docker", "/usr/bin/docker"}, {"/var/lib/rancher/engine/dockerd", "/usr/bin/dockerd"}, @@ -42,7 +44,7 @@ func symLinkEngineBinary(version string) []symlink { {"/usr/share/ros/os-release", "/usr/lib/os-release"}, {"/usr/share/ros/os-release", "/etc/os-release"}, } - if strings.Contains(version, "18.09") { + if versions.GreaterThanOrEqualTo(versionNum, "18.09.0") { baseSymlink = append(baseSymlink, []symlink{ {"/var/lib/rancher/engine/containerd", "/usr/bin/containerd"}, {"/var/lib/rancher/engine/ctr", "/usr/bin/ctr"}, diff --git a/pkg/util/versions/compare.go b/pkg/util/versions/compare.go new file mode 100644 index 00000000..611d4fed --- /dev/null +++ b/pkg/util/versions/compare.go @@ -0,0 +1,62 @@ +package versions + +import ( + "strconv" + "strings" +) + +// compare compares two version strings +// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise. +func compare(v1, v2 string) int { + var ( + currTab = strings.Split(v1, ".") + otherTab = strings.Split(v2, ".") + ) + + max := len(currTab) + if len(otherTab) > max { + max = len(otherTab) + } + for i := 0; i < max; i++ { + var currInt, otherInt int + + if len(currTab) > i { + currInt, _ = strconv.Atoi(currTab[i]) + } + if len(otherTab) > i { + otherInt, _ = strconv.Atoi(otherTab[i]) + } + if currInt > otherInt { + return 1 + } + if otherInt > currInt { + return -1 + } + } + return 0 +} + +// LessThan checks if a version is less than another +func LessThan(v, other string) bool { + return compare(v, other) == -1 +} + +// LessThanOrEqualTo checks if a version is less than or equal to another +func LessThanOrEqualTo(v, other string) bool { + return compare(v, other) <= 0 +} + +// GreaterThan checks if a version is greater than another +func GreaterThan(v, other string) bool { + return compare(v, other) == 1 +} + +// GreaterThanOrEqualTo checks if a version is greater than or equal to another +func GreaterThanOrEqualTo(v, other string) bool { + return compare(v, other) >= 0 +} + +// Equal checks if a version is equal to another +func Equal(v, other string) bool { + return compare(v, other) == 0 +} diff --git a/pkg/util/versions/compare_test.go b/pkg/util/versions/compare_test.go new file mode 100644 index 00000000..c2b96869 --- /dev/null +++ b/pkg/util/versions/compare_test.go @@ -0,0 +1,26 @@ +package versions + +import ( + "testing" +) + +func assertVersion(t *testing.T, a, b string, result int) { + if r := compare(a, b); r != result { + t.Fatalf("Unexpected version comparison result. Found %d, expected %d", r, result) + } +} + +func TestCompareVersion(t *testing.T) { + assertVersion(t, "1.12", "1.12", 0) + assertVersion(t, "1.0.0", "1", 0) + assertVersion(t, "1", "1.0.0", 0) + assertVersion(t, "1.05.00.0156", "1.0.221.9289", 1) + assertVersion(t, "1", "1.0.1", -1) + assertVersion(t, "1.0.1", "1", 1) + assertVersion(t, "1.0.1", "1.0.2", -1) + assertVersion(t, "1.0.2", "1.0.3", -1) + assertVersion(t, "1.0.3", "1.1", -1) + assertVersion(t, "1.1", "1.1.1", -1) + assertVersion(t, "1.1.1", "1.1.2", -1) + assertVersion(t, "1.1.2", "1.2", -1) +}