diff --git a/pkg/controller/cluster/cluster.go b/pkg/controller/cluster/cluster.go index fa34469a..6ed1697b 100644 --- a/pkg/controller/cluster/cluster.go +++ b/pkg/controller/cluster/cluster.go @@ -269,8 +269,8 @@ func (c *ClusterReconciler) reconcile(ctx context.Context, cluster *v1beta1.Clus // if the Version is not specified we will try to use the same Kubernetes version of the host. // This version is stored in the Status object, and it will not be updated if already set. - if cluster.Spec.Version == "" && cluster.Status.HostVersion == "" { - log.V(1).Info("Cluster version not set. Using host version.") + if cluster.Status.HostVersion == "" { + log.V(1).Info("Cluster host version not set.") hostVersion, err := c.DiscoveryClient.ServerVersion() if err != nil { @@ -278,8 +278,9 @@ func (c *ClusterReconciler) reconcile(ctx context.Context, cluster *v1beta1.Clus } // update Status HostVersion - k8sVersion := strings.Split(hostVersion.GitVersion, "+")[0] - cluster.Status.HostVersion = k8sVersion + "-k3s1" + k8sVersion, _, _ := strings.Cut(hostVersion.GitVersion, "+") + k8sVersion, _, _ = strings.Cut(k8sVersion, "-") + cluster.Status.HostVersion = k8sVersion } token, err := c.token(ctx, cluster) diff --git a/pkg/controller/cluster/cluster_test.go b/pkg/controller/cluster/cluster_test.go index 539b9227..232627fd 100644 --- a/pkg/controller/cluster/cluster_test.go +++ b/pkg/controller/cluster/cluster_test.go @@ -2,7 +2,6 @@ package cluster_test import ( "context" - "fmt" "time" "k8s.io/utils/ptr" @@ -73,7 +72,6 @@ var _ = Describe("Cluster Controller", Label("controller"), Label("Cluster"), fu serverVersion, err := k8s.ServerVersion() Expect(err).To(Not(HaveOccurred())) - expectedHostVersion := fmt.Sprintf("%s-k3s1", serverVersion.GitVersion) Eventually(func() string { err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) @@ -82,7 +80,7 @@ var _ = Describe("Cluster Controller", Label("controller"), Label("Cluster"), fu }). WithTimeout(time.Second * 30). WithPolling(time.Second). - Should(Equal(expectedHostVersion)) + Should(Equal(serverVersion.GitVersion)) // check NetworkPolicy expectedNetworkPolicy := &networkingv1.NetworkPolicy{ diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 11e528d0..0b1da271 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -25,21 +25,24 @@ var Backoff = wait.Backoff{ Jitter: 0.1, } -// Image returns the rancher/k3s image tagged with the specified Version. -// If Version is empty it will use with the same k8s version of the host cluster, -// stored in the Status object. It will return the latest version as last fallback. +// K3SImage returns the rancher/k3s image tagged with the found K3SVersion. func K3SImage(cluster *v1beta1.Cluster, k3SImage string) string { - image := k3SImage - - imageVersion := "latest" + return k3SImage + ":" + K3SVersion(cluster) +} +// K3SVersion returns the rancher/k3s specified version. +// If empty it will return the k3s version of the Kubernetes version of the host cluster, stored in the Status object. +// Returns the latest version as fallback. +func K3SVersion(cluster *v1beta1.Cluster) string { if cluster.Spec.Version != "" { - imageVersion = cluster.Spec.Version - } else if cluster.Status.HostVersion != "" { - imageVersion = cluster.Status.HostVersion + return cluster.Spec.Version } - return image + ":" + imageVersion + if cluster.Status.HostVersion != "" { + return cluster.Status.HostVersion + "-k3s1" + } + + return "latest" } // SafeConcatNameWithPrefix runs the SafeConcatName with extra prefix. diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go index eb350b5e..5aab2f90 100644 --- a/pkg/controller/controller_test.go +++ b/pkg/controller/controller_test.go @@ -51,7 +51,7 @@ func Test_K3S_Image(t *testing.T) { }, }, }, - expectedData: "rancher/k3s:v4.5.6", + expectedData: "rancher/k3s:v4.5.6-k3s1", }, { name: "cluster with empty version spec and empty hostVersion status", diff --git a/tests/cli_test.go b/tests/cli_test.go index a112443d..5970efd8 100644 --- a/tests/cli_test.go +++ b/tests/cli_test.go @@ -7,10 +7,6 @@ import ( "time" "k8s.io/apimachinery/pkg/util/rand" - "sigs.k8s.io/controller-runtime/pkg/client" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -47,12 +43,7 @@ var _ = When("using the k3kcli", Label("cli"), func() { clusterNamespace := "k3k-" + clusterName DeferCleanup(func() { - err := k8sClient.Delete(context.Background(), &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - }) - Expect(client.IgnoreNotFound(err)).To(Not(HaveOccurred())) + DeleteNamespaces(clusterNamespace) }) _, stderr, err = K3kcli("cluster", "create", clusterName) @@ -78,6 +69,24 @@ var _ = When("using the k3kcli", Label("cli"), func() { WithPolling(time.Second). Should(BeEmpty()) }) + + It("can create a cluster with the specified kubernetes version", func() { + var ( + stderr string + err error + ) + + clusterName := "cluster-" + rand.String(5) + clusterNamespace := "k3k-" + clusterName + + DeferCleanup(func() { + DeleteNamespaces(clusterNamespace) + }) + + _, stderr, err = K3kcli("cluster", "create", "--version", "v1.33.6-k3s1", clusterName) + Expect(err).To(Not(HaveOccurred()), string(stderr)) + Expect(stderr).To(ContainSubstring("You can start using the cluster")) + }) }) When("trying the policy commands", func() { @@ -122,12 +131,7 @@ var _ = When("using the k3kcli", Label("cli"), func() { clusterNamespace := "k3k-" + clusterName DeferCleanup(func() { - err := k8sClient.Delete(context.Background(), &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - }) - Expect(client.IgnoreNotFound(err)).To(Not(HaveOccurred())) + DeleteNamespaces(clusterNamespace) }) _, stderr, err = K3kcli("cluster", "create", clusterName) diff --git a/tests/common_test.go b/tests/common_test.go index 15625879..131d83cc 100644 --- a/tests/common_test.go +++ b/tests/common_test.go @@ -17,6 +17,7 @@ import ( "k8s.io/kubectl/pkg/scheme" "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -118,7 +119,7 @@ func DeleteNamespaces(names ...string) { err := k8s.CoreV1().Namespaces().Delete(context.Background(), name, metav1.DeleteOptions{ GracePeriodSeconds: ptr.To[int64](0), }) - Expect(err).To(Not(HaveOccurred())) + Expect(client.IgnoreNotFound(err)).To(Not(HaveOccurred())) }() }