From 89da784733cf4f15dc87044a49e4ba9ff59bf889 Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Mon, 4 Sep 2023 09:22:57 -0300 Subject: [PATCH 1/6] doccument cri --- docs/resources/cluster.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/cluster.md b/docs/resources/cluster.md index 60dd4292..e325a2ab 100644 --- a/docs/resources/cluster.md +++ b/docs/resources/cluster.md @@ -95,7 +95,7 @@ The following arguments are supported: * `dind_storage_driver` - (Optional/Experimental) DinD RKE cluster storage driver (string) * `dind_dns_server` - (Optional/Experimental) DinD RKE cluster dns (string) * `dns` - (Optional) RKE k8s cluster DNS Config (list maxitems:1) -* `enable_cri_dockerd` - (Optional) Enable/Disable CRI dockerd for kubelet. Default `false` (bool) +* `enable_cri_dockerd` - (Optional) Enable/Disable CRI dockerd for kubelet; set it to true starting from Kubernetes version 1.24 or later. Default `false` (bool) * `ignore_docker_version` - (Optional) Enable/Disable RKE k8s cluster strict docker version checking. Default `false` (bool) * `ingress` - (Optional) RKE k8s cluster ingress controller configuration (list maxitems:1) * `kubernetes_version` - (Optional) K8s version to deploy. If kubernetes image is specified, image version takes precedence. Default: `rke default` (string) From c2ac33439cbae424b3639f17cb51e6e3d0fd975d Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Mon, 30 Oct 2023 11:09:51 -0300 Subject: [PATCH 2/6] Add validation on cri --- rke/structure_rke_cluster.go | 29 +++ rke/structure_rke_cluster_test.go | 281 ++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+) create mode 100644 rke/structure_rke_cluster_test.go diff --git a/rke/structure_rke_cluster.go b/rke/structure_rke_cluster.go index 7ad1c919..75093960 100644 --- a/rke/structure_rke_cluster.go +++ b/rke/structure_rke_cluster.go @@ -1,10 +1,14 @@ package rke import ( + "context" "fmt" + "sort" + "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/rancher/rke/cluster" + "github.com/rancher/rke/metadata" rancher "github.com/rancher/rke/types" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1" @@ -371,6 +375,10 @@ func expandRKECluster(in *schema.ResourceData) (string, *rancher.RancherKubernet obj.Services.Kubeproxy.ExtraArgs["conntrack-max-per-core"] = "0" } + if k8sVersionRequiresCri(obj.Version) && obj.EnableCRIDockerd != nil && !*obj.EnableCRIDockerd { + return "", nil, fmt.Errorf("kubernetes version %s requires enable_cri_dockerd to be set to true", obj.Version) + } + objYml, err := patchRKEClusterYaml(obj) if err != nil { return "", nil, fmt.Errorf("Failed to patch RKE cluster yaml: %v", err) @@ -505,3 +513,24 @@ func expandRKEClusterFlag(in *schema.ResourceData, clusterFilePath string) clust return obj } + +func k8sVersionRequiresCri(kuberenetsVersion string) bool { + metadata.InitMetadata(context.Background()) + versions := make([]*version.Version, 0, len(metadata.K8sVersionToRKESystemImages)) + for k := range metadata.K8sVersionToRKESystemImages { + v, _ := version.NewVersion(k) + versions = append(versions, v) + } + + sort.Sort(sort.Reverse(version.Collection(versions))) + kuberenetsVersion = kuberenetsVersion[1:] + for _, v := range versions { + if v.String() == kuberenetsVersion { + return true + } + if v.String() == "1.23.4-rancher1-1" { + break + } + } + return false +} diff --git a/rke/structure_rke_cluster_test.go b/rke/structure_rke_cluster_test.go new file mode 100644 index 00000000..aa400de8 --- /dev/null +++ b/rke/structure_rke_cluster_test.go @@ -0,0 +1,281 @@ +package rke + +import "testing" + +func Test_k8sVersionRequiresCri(t *testing.T) { + type args struct { + kuberenetsVersion string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "v1.26.4-rancher2-1", + args: args{ + kuberenetsVersion: "v1.26.4-rancher2-1", + }, + want: true, + }, + { + name: "v1.25.9-rancher2-2", + args: args{ + kuberenetsVersion: "v1.25.9-rancher2-2", + }, + want: true, + }, + { + name: "v1.25.9-rancher2-1", + args: args{ + kuberenetsVersion: "v1.25.9-rancher2-1", + }, + want: true, + }, + { + name: "v1.25.6-rancher4-1", + args: args{ + kuberenetsVersion: "v1.25.6-rancher4-1", + }, + want: true, + }, + { + name: "v1.25.6-rancher2-1", + args: args{ + kuberenetsVersion: "v1.25.6-rancher2-1", + }, + want: true, + }, + { + name: "v1.24.13-rancher2-2", + args: args{ + kuberenetsVersion: "v1.24.13-rancher2-2", + }, + want: true, + }, + { + name: "v1.24.13-rancher2-1", + args: args{ + kuberenetsVersion: "v1.24.13-rancher2-1", + }, + want: true, + }, + { + name: "v1.24.10-rancher4-1", + args: args{ + kuberenetsVersion: "v1.24.10-rancher4-1", + }, + want: true, + }, + { + name: "v1.24.10-rancher2-1", + args: args{ + kuberenetsVersion: "v1.24.10-rancher2-1", + }, + want: true, + }, + { + name: "v1.24.9-rancher1-1", + args: args{ + kuberenetsVersion: "v1.24.9-rancher1-1", + }, + want: true, + }, + { + name: "v1.24.8-rancher1-1", + args: args{ + kuberenetsVersion: "v1.24.8-rancher1-1", + }, + want: true, + }, + { + name: "v1.24.6-rancher1-1", + args: args{ + kuberenetsVersion: "v1.24.6-rancher1-1", + }, + want: true, + }, + { + name: "v1.24.4-rancher1-1", + args: args{ + kuberenetsVersion: "v1.24.4-rancher1-1", + }, + want: true, + }, + { + name: "v1.24.2-rancher1-1", + args: args{ + kuberenetsVersion: "v1.24.2-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.16-rancher2-3", + args: args{ + kuberenetsVersion: "v1.23.16-rancher2-3", + }, + want: true, + }, + { + name: "v1.23.16-rancher2-1", + args: args{ + kuberenetsVersion: "v1.23.16-rancher2-1", + }, + want: true, + }, + { + name: "v1.23.15-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.15-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.14-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.14-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.12-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.12-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.10-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.10-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.8-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.8-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.7-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.7-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.6-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.6-rancher1-1", + }, + want: true, + }, + { + name: "v1.23.4-rancher1-2", + args: args{ + kuberenetsVersion: "v1.23.4-rancher1-2", + }, + want: true, + }, + { + name: "v1.23.4-rancher1-1", + args: args{ + kuberenetsVersion: "v1.23.4-rancher1-2", + }, + want: true, + }, + { + name: "v1.22.17-rancher1-2", + args: args{ + kuberenetsVersion: "v1.22.17-rancher1-2", + }, + want: false, + }, + { + name: "v1.22.17-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.17-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.16-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.16-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.15-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.15-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.13-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.13-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.11-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.11-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.10-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.10-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.9-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.9-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.7-rancher1-2", + args: args{ + kuberenetsVersion: "v1.22.7-rancher1-2", + }, + want: false, + }, + { + name: "v1.22.7-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.7-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.6-rancher1-1", + args: args{ + kuberenetsVersion: "v1.22.6-rancher1-1", + }, + want: false, + }, + { + name: "v1.22.5-rancher2-1", + args: args{ + kuberenetsVersion: "v1.22.5-rancher2-1", + }, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := k8sVersionRequiresCri(tt.args.kuberenetsVersion); got != tt.want { + t.Errorf("k8sVersionRequiresCri() = %v, want %v", got, tt.want) + } + }) + } +} From 1880c554036ff5d5afe16867134e55a03f58b101 Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Tue, 31 Oct 2023 10:16:20 -0300 Subject: [PATCH 3/6] fix typo and improve tests/validation --- rke/structure_rke_cluster.go | 17 ++- rke/structure_rke_cluster_test.go | 208 +++++++++++++++++------------- 2 files changed, 128 insertions(+), 97 deletions(-) diff --git a/rke/structure_rke_cluster.go b/rke/structure_rke_cluster.go index 75093960..095960be 100644 --- a/rke/structure_rke_cluster.go +++ b/rke/structure_rke_cluster.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "sort" + "strings" "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -514,23 +515,25 @@ func expandRKEClusterFlag(in *schema.ResourceData, clusterFilePath string) clust return obj } -func k8sVersionRequiresCri(kuberenetsVersion string) bool { +func k8sVersionRequiresCri(kubernetesVersion string) bool { metadata.InitMetadata(context.Background()) + // Get data from RKE package, change it to a slice so we can sort it. versions := make([]*version.Version, 0, len(metadata.K8sVersionToRKESystemImages)) for k := range metadata.K8sVersionToRKESystemImages { v, _ := version.NewVersion(k) versions = append(versions, v) } - sort.Sort(sort.Reverse(version.Collection(versions))) - kuberenetsVersion = kuberenetsVersion[1:] + // Removes the "v" from the version, so it matches the rke versions + kubernetesVersion = kubernetesVersion[1:] + // Go through the newer versions, stopping on 1.23.x for _, v := range versions { - if v.String() == kuberenetsVersion { - return true - } - if v.String() == "1.23.4-rancher1-1" { + if strings.Contains(v.String(), "1.23.") { break } + if v.String() == kubernetesVersion { + return true + } } return false } diff --git a/rke/structure_rke_cluster_test.go b/rke/structure_rke_cluster_test.go index aa400de8..5c32fb57 100644 --- a/rke/structure_rke_cluster_test.go +++ b/rke/structure_rke_cluster_test.go @@ -4,7 +4,7 @@ import "testing" func Test_k8sVersionRequiresCri(t *testing.T) { type args struct { - kuberenetsVersion string + kubernetesVersion string } tests := []struct { name string @@ -14,266 +14,294 @@ func Test_k8sVersionRequiresCri(t *testing.T) { { name: "v1.26.4-rancher2-1", args: args{ - kuberenetsVersion: "v1.26.4-rancher2-1", + kubernetesVersion: "v1.26.4-rancher2-1", }, want: true, }, { name: "v1.25.9-rancher2-2", args: args{ - kuberenetsVersion: "v1.25.9-rancher2-2", + kubernetesVersion: "v1.25.9-rancher2-2", }, want: true, }, { - name: "v1.25.9-rancher2-1", + name: "v1.25.6-rancher2-1", args: args{ - kuberenetsVersion: "v1.25.9-rancher2-1", + kubernetesVersion: "v1.25.6-rancher2-1", }, want: true, }, { - name: "v1.25.6-rancher4-1", + name: "v1.24.13-rancher2-2", args: args{ - kuberenetsVersion: "v1.25.6-rancher4-1", + kubernetesVersion: "v1.24.13-rancher2-2", }, want: true, }, { - name: "v1.25.6-rancher2-1", + name: "v1.24.10-rancher4-1", args: args{ - kuberenetsVersion: "v1.25.6-rancher2-1", + kubernetesVersion: "v1.24.10-rancher4-1", }, want: true, }, { - name: "v1.24.13-rancher2-2", + name: "v1.24.9-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.13-rancher2-2", + kubernetesVersion: "v1.24.9-rancher1-1", }, want: true, }, { - name: "v1.24.13-rancher2-1", + name: "v1.24.8-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.13-rancher2-1", + kubernetesVersion: "v1.24.8-rancher1-1", }, want: true, }, { - name: "v1.24.10-rancher4-1", + name: "v1.24.6-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.10-rancher4-1", + kubernetesVersion: "v1.24.6-rancher1-1", }, want: true, }, { - name: "v1.24.10-rancher2-1", + name: "v1.24.4-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.10-rancher2-1", + kubernetesVersion: "v1.24.4-rancher1-1", }, want: true, }, { - name: "v1.24.9-rancher1-1", + name: "v1.23.16-rancher2-3", args: args{ - kuberenetsVersion: "v1.24.9-rancher1-1", + kubernetesVersion: "v1.23.16-rancher2-3", }, - want: true, + want: false, }, { - name: "v1.24.8-rancher1-1", + name: "v1.23.15-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.8-rancher1-1", + kubernetesVersion: "v1.23.15-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.24.6-rancher1-1", + name: "v1.23.14-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.6-rancher1-1", + kubernetesVersion: "v1.23.14-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.24.4-rancher1-1", + name: "v1.23.12-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.4-rancher1-1", + kubernetesVersion: "v1.23.12-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.24.2-rancher1-1", + name: "v1.23.10-rancher1-1", args: args{ - kuberenetsVersion: "v1.24.2-rancher1-1", + kubernetesVersion: "v1.23.10-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.16-rancher2-3", + name: "v1.23.8-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.16-rancher2-3", + kubernetesVersion: "v1.23.8-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.16-rancher2-1", + name: "v1.23.7-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.16-rancher2-1", + kubernetesVersion: "v1.23.7-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.15-rancher1-1", + name: "v1.23.6-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.15-rancher1-1", + kubernetesVersion: "v1.23.6-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.14-rancher1-1", + name: "v1.23.4-rancher1-2", args: args{ - kuberenetsVersion: "v1.23.14-rancher1-1", + kubernetesVersion: "v1.23.4-rancher1-2", }, - want: true, + want: false, }, { - name: "v1.23.12-rancher1-1", + name: "v1.22.17-rancher1-2", args: args{ - kuberenetsVersion: "v1.23.12-rancher1-1", + kubernetesVersion: "v1.22.17-rancher1-2", }, - want: true, + want: false, }, { - name: "v1.23.10-rancher1-1", + name: "v1.22.16-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.10-rancher1-1", + kubernetesVersion: "v1.22.16-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.8-rancher1-1", + name: "v1.22.15-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.8-rancher1-1", + kubernetesVersion: "v1.22.15-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.7-rancher1-1", + name: "v1.22.13-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.7-rancher1-1", + kubernetesVersion: "v1.22.13-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.6-rancher1-1", + name: "v1.22.11-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.6-rancher1-1", + kubernetesVersion: "v1.22.11-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.4-rancher1-2", + name: "v1.22.10-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.4-rancher1-2", + kubernetesVersion: "v1.22.10-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.23.4-rancher1-1", + name: "v1.22.9-rancher1-1", args: args{ - kuberenetsVersion: "v1.23.4-rancher1-2", + kubernetesVersion: "v1.22.9-rancher1-1", }, - want: true, + want: false, }, { - name: "v1.22.17-rancher1-2", + name: "v1.22.7-rancher1-2", args: args{ - kuberenetsVersion: "v1.22.17-rancher1-2", + kubernetesVersion: "v1.22.7-rancher1-2", }, want: false, }, { - name: "v1.22.17-rancher1-1", + name: "v1.22.7-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.17-rancher1-1", + kubernetesVersion: "v1.22.7-rancher1-1", }, want: false, }, { - name: "v1.22.16-rancher1-1", + name: "v1.22.6-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.16-rancher1-1", + kubernetesVersion: "v1.22.6-rancher1-1", }, want: false, }, { - name: "v1.22.15-rancher1-1", + name: "v1.22.5-rancher2-1", args: args{ - kuberenetsVersion: "v1.22.15-rancher1-1", + kubernetesVersion: "v1.22.5-rancher2-1", }, want: false, }, { - name: "v1.22.13-rancher1-1", + name: "v1.22.4-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.13-rancher1-1", + kubernetesVersion: "v1.22.4-rancher1-1", }, want: false, }, { - name: "v1.22.11-rancher1-1", + name: "v1.21.14-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.11-rancher1-1", + kubernetesVersion: "v1.21.14-rancher1-1", }, want: false, }, { - name: "v1.22.10-rancher1-1", + name: "v1.21.13-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.10-rancher1-1", + kubernetesVersion: "v1.21.13-rancher1-1", }, want: false, }, { - name: "v1.22.9-rancher1-1", + name: "v1.21.12-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.9-rancher1-1", + kubernetesVersion: "v1.21.12-rancher1-1", }, want: false, }, { - name: "v1.22.7-rancher1-2", + name: "v1.21.10-rancher1-1", args: args{ - kuberenetsVersion: "v1.22.7-rancher1-2", + kubernetesVersion: "v1.21.10-rancher1-1", }, want: false, }, { - name: "v1.22.7-rancher1-1", + name: "v1.21.9-rancher1-2", args: args{ - kuberenetsVersion: "v1.22.7-rancher1-1", + kubernetesVersion: "v1.21.9-rancher1-2", }, want: false, }, { - name: "v1.22.6-rancher1-1", + name: "v1.21.8-rancher2-1", args: args{ - kuberenetsVersion: "v1.22.6-rancher1-1", + kubernetesVersion: "v1.21.8-rancher2-1", }, want: false, }, { - name: "v1.22.5-rancher2-1", + name: "v1.21.7-rancher1-1", + args: args{ + kubernetesVersion: "v1.21.7-rancher1-1", + }, + want: false, + }, + { + name: "v1.21.6-rancher1-2", + args: args{ + kubernetesVersion: "v1.21.6-rancher1-2", + }, + want: false, + }, + { + name: "v1.21.5-rancher1-1", + args: args{ + kubernetesVersion: "v1.21.5-rancher1-1", + }, + want: false, + }, + { + name: "v1.21.4-rancher1-1", + args: args{ + kubernetesVersion: "v1.21.4-rancher1-1", + }, + want: false, + }, + { + name: "v1.20.15-rancher2-2", args: args{ - kuberenetsVersion: "v1.22.5-rancher2-1", + kubernetesVersion: "v1.20.15-rancher2-2", }, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := k8sVersionRequiresCri(tt.args.kuberenetsVersion); got != tt.want { + if got := k8sVersionRequiresCri(tt.args.kubernetesVersion); got != tt.want { t.Errorf("k8sVersionRequiresCri() = %v, want %v", got, tt.want) } }) From b580ada49a3a29c96a30833bb58454f9eab2fe19 Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Thu, 2 Nov 2023 16:30:08 -0300 Subject: [PATCH 4/6] address comments --- rke/structure_rke_cluster.go | 4 +- rke/structure_rke_cluster_test.go | 238 ------------------------------ 2 files changed, 3 insertions(+), 239 deletions(-) diff --git a/rke/structure_rke_cluster.go b/rke/structure_rke_cluster.go index 095960be..f79c263e 100644 --- a/rke/structure_rke_cluster.go +++ b/rke/structure_rke_cluster.go @@ -15,6 +15,8 @@ import ( apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1" ) +const latestK8sMinorThatWorksWithoutCri = "1.23." + // Flatteners func flattenRKEClusterFlag(d *schema.ResourceData, in *cluster.ExternalFlags) { @@ -528,7 +530,7 @@ func k8sVersionRequiresCri(kubernetesVersion string) bool { kubernetesVersion = kubernetesVersion[1:] // Go through the newer versions, stopping on 1.23.x for _, v := range versions { - if strings.Contains(v.String(), "1.23.") { + if strings.Contains(v.String(), latestK8sMinorThatWorksWithoutCri) { break } if v.String() == kubernetesVersion { diff --git a/rke/structure_rke_cluster_test.go b/rke/structure_rke_cluster_test.go index 5c32fb57..04698490 100644 --- a/rke/structure_rke_cluster_test.go +++ b/rke/structure_rke_cluster_test.go @@ -25,13 +25,6 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: true, }, - { - name: "v1.25.6-rancher2-1", - args: args{ - kubernetesVersion: "v1.25.6-rancher2-1", - }, - want: true, - }, { name: "v1.24.13-rancher2-2", args: args{ @@ -39,41 +32,6 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: true, }, - { - name: "v1.24.10-rancher4-1", - args: args{ - kubernetesVersion: "v1.24.10-rancher4-1", - }, - want: true, - }, - { - name: "v1.24.9-rancher1-1", - args: args{ - kubernetesVersion: "v1.24.9-rancher1-1", - }, - want: true, - }, - { - name: "v1.24.8-rancher1-1", - args: args{ - kubernetesVersion: "v1.24.8-rancher1-1", - }, - want: true, - }, - { - name: "v1.24.6-rancher1-1", - args: args{ - kubernetesVersion: "v1.24.6-rancher1-1", - }, - want: true, - }, - { - name: "v1.24.4-rancher1-1", - args: args{ - kubernetesVersion: "v1.24.4-rancher1-1", - }, - want: true, - }, { name: "v1.23.16-rancher2-3", args: args{ @@ -81,62 +39,6 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: false, }, - { - name: "v1.23.15-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.15-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.14-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.14-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.12-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.12-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.10-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.10-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.8-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.8-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.7-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.7-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.6-rancher1-1", - args: args{ - kubernetesVersion: "v1.23.6-rancher1-1", - }, - want: false, - }, - { - name: "v1.23.4-rancher1-2", - args: args{ - kubernetesVersion: "v1.23.4-rancher1-2", - }, - want: false, - }, { name: "v1.22.17-rancher1-2", args: args{ @@ -144,83 +46,6 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: false, }, - { - name: "v1.22.16-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.16-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.15-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.15-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.13-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.13-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.11-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.11-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.10-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.10-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.9-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.9-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.7-rancher1-2", - args: args{ - kubernetesVersion: "v1.22.7-rancher1-2", - }, - want: false, - }, - { - name: "v1.22.7-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.7-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.6-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.6-rancher1-1", - }, - want: false, - }, - { - name: "v1.22.5-rancher2-1", - args: args{ - kubernetesVersion: "v1.22.5-rancher2-1", - }, - want: false, - }, - { - name: "v1.22.4-rancher1-1", - args: args{ - kubernetesVersion: "v1.22.4-rancher1-1", - }, - want: false, - }, { name: "v1.21.14-rancher1-1", args: args{ @@ -228,69 +53,6 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: false, }, - { - name: "v1.21.13-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.13-rancher1-1", - }, - want: false, - }, - { - name: "v1.21.12-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.12-rancher1-1", - }, - want: false, - }, - { - name: "v1.21.10-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.10-rancher1-1", - }, - want: false, - }, - { - name: "v1.21.9-rancher1-2", - args: args{ - kubernetesVersion: "v1.21.9-rancher1-2", - }, - want: false, - }, - { - name: "v1.21.8-rancher2-1", - args: args{ - kubernetesVersion: "v1.21.8-rancher2-1", - }, - want: false, - }, - { - name: "v1.21.7-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.7-rancher1-1", - }, - want: false, - }, - { - name: "v1.21.6-rancher1-2", - args: args{ - kubernetesVersion: "v1.21.6-rancher1-2", - }, - want: false, - }, - { - name: "v1.21.5-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.5-rancher1-1", - }, - want: false, - }, - { - name: "v1.21.4-rancher1-1", - args: args{ - kubernetesVersion: "v1.21.4-rancher1-1", - }, - want: false, - }, { name: "v1.20.15-rancher2-2", args: args{ From 1c060086791ed57130f8a8ae2c46730dc47415d7 Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Tue, 14 Nov 2023 13:56:10 -0300 Subject: [PATCH 5/6] improve cluster version validation --- rke/structure_rke_cluster.go | 36 ++++++++----------------------- rke/structure_rke_cluster_test.go | 7 ++++++ rke/util.go | 13 +++++++++++ 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/rke/structure_rke_cluster.go b/rke/structure_rke_cluster.go index f79c263e..da37200d 100644 --- a/rke/structure_rke_cluster.go +++ b/rke/structure_rke_cluster.go @@ -1,22 +1,17 @@ package rke import ( - "context" "fmt" - "sort" - "strings" - "github.com/hashicorp/go-version" + "github.com/blang/semver" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/rancher/rke/cluster" - "github.com/rancher/rke/metadata" rancher "github.com/rancher/rke/types" + log "github.com/sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1" ) -const latestK8sMinorThatWorksWithoutCri = "1.23." - // Flatteners func flattenRKEClusterFlag(d *schema.ResourceData, in *cluster.ExternalFlags) { @@ -518,24 +513,11 @@ func expandRKEClusterFlag(in *schema.ResourceData, clusterFilePath string) clust } func k8sVersionRequiresCri(kubernetesVersion string) bool { - metadata.InitMetadata(context.Background()) - // Get data from RKE package, change it to a slice so we can sort it. - versions := make([]*version.Version, 0, len(metadata.K8sVersionToRKESystemImages)) - for k := range metadata.K8sVersionToRKESystemImages { - v, _ := version.NewVersion(k) - versions = append(versions, v) - } - sort.Sort(sort.Reverse(version.Collection(versions))) - // Removes the "v" from the version, so it matches the rke versions - kubernetesVersion = kubernetesVersion[1:] - // Go through the newer versions, stopping on 1.23.x - for _, v := range versions { - if strings.Contains(v.String(), latestK8sMinorThatWorksWithoutCri) { - break - } - if v.String() == kubernetesVersion { - return true - } - } - return false + + version, err := getClusterVersion(kubernetesVersion) + if err != nil { + // Ignoring the error, if the k8sVersion is not valid it should fail during the validation of the field. + log.Debug("invalid kubernetes version") + } + return semver.MustParseRange(">= 1.24.0-rancher0")(version) } diff --git a/rke/structure_rke_cluster_test.go b/rke/structure_rke_cluster_test.go index 04698490..4c5b1ab9 100644 --- a/rke/structure_rke_cluster_test.go +++ b/rke/structure_rke_cluster_test.go @@ -60,6 +60,13 @@ func Test_k8sVersionRequiresCri(t *testing.T) { }, want: false, }, + { + name: "invalid", + args: args{ + kubernetesVersion: "invalid", + }, + want: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/rke/util.go b/rke/util.go index 5994eeb0..daaf5763 100644 --- a/rke/util.go +++ b/rke/util.go @@ -12,6 +12,7 @@ import ( "sort" "strings" + "github.com/blang/semver" ghodssyaml "github.com/ghodss/yaml" gover "github.com/hashicorp/go-version" uuid "github.com/satori/go.uuid" @@ -252,6 +253,18 @@ func sortVersions(list map[string]string) ([]*gover.Version, error) { return versions, nil } +func getClusterVersion(version string) (semver.Version, error) { + var parsedVersion semver.Version + if len(version) <= 1 || !strings.HasPrefix(version, "v") { + return parsedVersion, fmt.Errorf("%s is not valid version", version) + } + parsedVersion, err := semver.Parse(version[1:]) + if err != nil { + return parsedVersion, fmt.Errorf("%s is not valid semver", version) + } + return parsedVersion, nil +} + func getLatestVersion(list map[string]string) (string, error) { sorted, err := sortVersions(list) if err != nil { From 91e4c6fd59b2aee0839f3c823b9cfff1f9970f2f Mon Sep 17 00:00:00 2001 From: felipe-colussi Date: Wed, 15 Nov 2023 09:44:13 -0300 Subject: [PATCH 6/6] improve code --- rke/structure_rke_cluster.go | 9 ++++----- rke/util.go | 2 ++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rke/structure_rke_cluster.go b/rke/structure_rke_cluster.go index da37200d..d502c944 100644 --- a/rke/structure_rke_cluster.go +++ b/rke/structure_rke_cluster.go @@ -3,7 +3,6 @@ package rke import ( "fmt" - "github.com/blang/semver" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/rancher/rke/cluster" rancher "github.com/rancher/rke/types" @@ -513,11 +512,11 @@ func expandRKEClusterFlag(in *schema.ResourceData, clusterFilePath string) clust } func k8sVersionRequiresCri(kubernetesVersion string) bool { - version, err := getClusterVersion(kubernetesVersion) if err != nil { - // Ignoring the error, if the k8sVersion is not valid it should fail during the validation of the field. - log.Debug("invalid kubernetes version") + // This debug / error is not supposed to happen, the kubernetesVersion should be validated by the provider. + log.Debugf("Unable to get the semantic version for kubernetesVersion, value: %s", kubernetesVersion) + return false } - return semver.MustParseRange(">= 1.24.0-rancher0")(version) + return parsedRangeAtLeast124(version) } diff --git a/rke/util.go b/rke/util.go index daaf5763..bf3c538c 100644 --- a/rke/util.go +++ b/rke/util.go @@ -19,6 +19,8 @@ import ( "gopkg.in/yaml.v2" ) +var parsedRangeAtLeast124 = semver.MustParseRange(">= 1.24.0-rancher0") + func splitImportID(s string) ([]string, error) { sep := ":" if len(s) == 0 {