Skip to content

Commit 2976013

Browse files
authored
chore: add tests for k3s (#391)
1 parent 4b0730e commit 2976013

File tree

6 files changed

+98
-2
lines changed

6 files changed

+98
-2
lines changed

config/rbac/role.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ rules:
2828
- apiGroups:
2929
- controlplane.cluster.x-k8s.io
3030
resources:
31-
- kubeadmcontrolplanetemplates
3231
- kthreescontrolplanes
33-
- kthreescontrolplanetemplates
32+
- kthreescontrolplanetemplates
33+
- kubeadmcontrolplanetemplates
3434
verbs:
3535
- create
3636
- delete
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# SPDX-FileCopyrightText: (C) 2026 Intel Corporation
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
apiVersion: edge-orchestrator.intel.com/v1alpha1
5+
kind: ClusterTemplate
6+
metadata:
7+
labels:
8+
app.kubernetes.io/name: template-controller
9+
app.kubernetes.io/managed-by: kustomize
10+
name: clustertemplate-k3s-sample
11+
spec:
12+
controlPlaneProviderType: k3s
13+
infraProviderType: intel
14+
kubernetesVersion: v1.33.5+k3s1
15+
clusterConfiguration: '{"kind":"KThreesControlPlaneTemplate","apiVersion":"controlplane.cluster.x-k8s.io/v1beta2","spec":{"template":{"spec":{"kthreesConfigSpec":{"agentConfig":{"airGapped":false},"preK3sCommands":["echo hello"]}}}}}'
16+
clusterNetwork:
17+
pods:
18+
cidrBlocks:
19+
- 10.42.0.0/16
20+
services:
21+
cidrBlocks:
22+
- 10.43.0.0/16
23+
clusterLabels:
24+
default-extension: baseline

internal/controller/clustertemplate_controller.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ type ClusterTemplateReconciler struct {
4040
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=intelmachinetemplates,verbs=get;list;watch;create;delete
4141
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=intelclustertemplates,verbs=get;list;watch;create;delete
4242
// +kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=kubeadmcontrolplanetemplates,verbs=get;list;watch;create;delete
43+
// +kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=kthreescontrolplanes,verbs=get;list;watch;create;delete
44+
// +kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=kthreescontrolplanetemplates,verbs=get;list;watch;create;delete
4345
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusterclasses,verbs=get;list;watch;create;delete
4446
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusters,verbs=get;list;watch;create;delete
4547

internal/controller/clustertemplate_controller_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
kubeadmcpv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
2020
dockerv1beta1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1"
2121

22+
intelv1alpha1 "github.com/open-edge-platform/cluster-api-provider-intel/api/v1alpha1"
23+
kthreescpv1beta2 "github.com/k3s-io/cluster-api-k3s/controlplane/api/v1beta2"
2224
clusterv1alpha1 "github.com/open-edge-platform/cluster-manager/v2/api/v1alpha1"
2325
)
2426

@@ -134,5 +136,47 @@ var _ = Describe("ClusterTemplate Controller", func() {
134136
Expect(err).NotTo(HaveOccurred())
135137
},
136138
),
139+
140+
Entry("for K3s CP and Docker Infra",
141+
"k3s", "docker", "v1.33.5+k3s1",
142+
"{\"kind\":\"KThreesControlPlaneTemplate\",\"apiVersion\":\"controlplane.cluster.x-k8s.io/v1beta2\",\"spec\":{\"template\":{\"spec\":{\"kthreesConfigSpec\":{\"agentConfig\":{\"airGapped\":false},\"preK3sCommands\":[\"echo hello\"]}}}}}",
143+
func() {
144+
By("validating the DockerMachineTemplate is created")
145+
err := k8sClient.Get(ctx, types.NamespacedName{
146+
Name: fmt.Sprintf("%s-controlplane", typeNamespacedName.Name),
147+
Namespace: typeNamespacedName.Namespace,
148+
}, &dockerv1beta1.DockerMachineTemplate{})
149+
Expect(err).NotTo(HaveOccurred())
150+
151+
By("validating the DockerClusterTemplate is created")
152+
err = k8sClient.Get(ctx, typeNamespacedName, &dockerv1beta1.DockerClusterTemplate{})
153+
Expect(err).NotTo(HaveOccurred())
154+
155+
By("validating the KThreesControlPlaneTemplate is created")
156+
err = k8sClient.Get(ctx, typeNamespacedName, &kthreescpv1beta2.KThreesControlPlaneTemplate{})
157+
Expect(err).NotTo(HaveOccurred())
158+
},
159+
),
160+
161+
Entry("for K3s CP and Intel Infra",
162+
"k3s", "intel", "v1.33.5+k3s1",
163+
"{\"kind\":\"KThreesControlPlaneTemplate\",\"apiVersion\":\"controlplane.cluster.x-k8s.io/v1beta2\",\"spec\":{\"template\":{\"spec\":{\"kthreesConfigSpec\":{\"agentConfig\":{\"airGapped\":false},\"preK3sCommands\":[\"echo hello\"]}}}}}",
164+
func() {
165+
By("validating the IntelMachineTemplate is created")
166+
err := k8sClient.Get(ctx, types.NamespacedName{
167+
Name: fmt.Sprintf("%s-controlplane", typeNamespacedName.Name),
168+
Namespace: typeNamespacedName.Namespace,
169+
}, &intelv1alpha1.IntelMachineTemplate{})
170+
Expect(err).NotTo(HaveOccurred())
171+
172+
By("validating the IntelClusterTemplate is created")
173+
err = k8sClient.Get(ctx, typeNamespacedName, &intelv1alpha1.IntelClusterTemplate{})
174+
Expect(err).NotTo(HaveOccurred())
175+
176+
By("validating the KThreesControlPlaneTemplate is created")
177+
err = k8sClient.Get(ctx, typeNamespacedName, &kthreescpv1beta2.KThreesControlPlaneTemplate{})
178+
Expect(err).NotTo(HaveOccurred())
179+
},
180+
),
137181
)
138182
})

internal/controller/suite_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import (
2929

3030
// Imports for CAPI resources
3131
intelv1alpha1 "github.com/open-edge-platform/cluster-api-provider-intel/api/v1alpha1"
32+
kthreesbootstrapv1beta2 "github.com/k3s-io/cluster-api-k3s/bootstrap/api/v1beta2"
33+
kthreescpv1beta2 "github.com/k3s-io/cluster-api-k3s/controlplane/api/v1beta2"
3234
capi "sigs.k8s.io/cluster-api/api/v1beta1"
3335
kubeadmbootstrapv1beta1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
3436
kubeadmcp "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
@@ -82,6 +84,7 @@ func getModuleVersionFromGoMod(modulePath string) string {
8284
func buildCRDPaths() []string {
8385
capiVersion := getModuleVersionFromGoMod("sigs.k8s.io/cluster-api")
8486
intelVersion := getModuleVersionFromGoMod("github.com/open-edge-platform/cluster-api-provider-intel")
87+
k3sVersion := getModuleVersionFromGoMod("github.com/k3s-io/cluster-api-k3s")
8588

8689
modPath := filepath.Join(build.Default.GOPATH, "pkg", "mod")
8790

@@ -92,6 +95,9 @@ func buildCRDPaths() []string {
9295
// note: cluster-api/test is a separate module with different path structure
9396
filepath.Join(modPath, "sigs.k8s.io", "cluster-api", "test@"+capiVersion, "infrastructure", "docker", "config", "crd", "bases"),
9497
filepath.Join(modPath, "github.com", "open-edge-platform", "cluster-api-provider-intel@"+intelVersion, "config", "crd", "bases"),
98+
// K3s control plane and bootstrap provider CRDs
99+
filepath.Join(modPath, "github.com", "k3s-io", "cluster-api-k3s@"+k3sVersion, "controlplane", "config", "crd", "bases"),
100+
filepath.Join(modPath, "github.com", "k3s-io", "cluster-api-k3s@"+k3sVersion, "bootstrap", "config", "crd", "bases"),
95101
}
96102

97103
return paths
@@ -126,6 +132,15 @@ var _ = BeforeSuite(func() {
126132
err = kubeadmcp.AddToScheme(scheme.Scheme)
127133
Expect(err).NotTo(HaveOccurred())
128134

135+
// ---- K3S CONTROL PLANE PROVIDER ----
136+
// Add scheme for K3s bootstrap provider
137+
err = kthreesbootstrapv1beta2.AddToScheme(scheme.Scheme)
138+
Expect(err).NotTo(HaveOccurred())
139+
140+
// Add scheme for K3s control plane provider
141+
err = kthreescpv1beta2.AddToScheme(scheme.Scheme)
142+
Expect(err).NotTo(HaveOccurred())
143+
129144
// ---- CAPI ----
130145
// Add scheme for Cluster API core resources
131146
err = capi.AddToScheme(scheme.Scheme)

internal/webhook/v1alpha1/clustertemplate_webhook_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ var _ = Describe("ClusterTemplate Webhook", func() {
5757
By("validating the kubeadm template")
5858
_, err = validator.ValidateCreate(ctx, kubeadmTemplate)
5959
Expect(err).To(BeNil(), "Expected kubeadm template to be valid")
60+
61+
By("reading the k3s template from file")
62+
k3sTemplate := &clusterv1alpha1.ClusterTemplate{}
63+
k3sTemplateFile, err := os.ReadFile("../../../examples/cluster_v1alpha1_clustertemplate_k3s.yaml")
64+
Expect(err).NotTo(HaveOccurred(), "Failed to read k3s template file")
65+
err = yaml.Unmarshal(k3sTemplateFile, k3sTemplate)
66+
Expect(err).NotTo(HaveOccurred(), "Failed to unmarshal k3s template")
67+
68+
By("validating the k3s template")
69+
_, err = validator.ValidateCreate(ctx, k3sTemplate)
70+
Expect(err).To(BeNil(), "Expected k3s template to be valid")
6071
})
6172

6273
It("Should only allow deletion of ClusterTemplates not in use", func() {})

0 commit comments

Comments
 (0)