diff --git a/api/holodeck/v1alpha1/types.go b/api/holodeck/v1alpha1/types.go index 213dc143..1afb16ed 100644 --- a/api/holodeck/v1alpha1/types.go +++ b/api/holodeck/v1alpha1/types.go @@ -181,16 +181,16 @@ const ( type Kubernetes struct { Install bool `json:"install"` // KubeConfig is the path to the kubeconfig file on the local machine - KubeConfig string `json:"kubeConfig"` - KubernetesFeatures []string `json:"Features"` - KubernetesVersion string `json:"Version"` - KubernetesInstaller string `json:"Installer"` - KubeletReleaseVersion string `json:"KubeletReleaseVersion"` - Arch string `json:"Arch"` - CniPluginsVersion string `json:"CniPluginsVersion"` - CalicoVersion string `json:"CalicoVersion"` - CrictlVersion string `json:"CrictlVersion"` - K8sEndpointHost string `json:"K8sEndpointHost"` + Config string `json:"kubeConfig"` + Features []string `json:"Features"` + Version string `json:"Version"` + KindVersion string `json:"KindVersion"` + Installer string `json:"Installer"` + Arch string `json:"Arch"` + CniPluginsVersion string `json:"CniPluginsVersion"` + CalicoVersion string `json:"CalicoVersion"` + CrictlVersion string `json:"CrictlVersion"` + K8sEndpointHost string `json:"K8sEndpointHost"` // A set of key=value pairs that describe feature gates for // alpha/experimental features K8sFeatureGates []string `json:"K8sFeatureGates"` diff --git a/api/holodeck/v1alpha1/zz_generated.deepcopy.go b/api/holodeck/v1alpha1/zz_generated.deepcopy.go index b387e749..46f941ca 100644 --- a/api/holodeck/v1alpha1/zz_generated.deepcopy.go +++ b/api/holodeck/v1alpha1/zz_generated.deepcopy.go @@ -262,8 +262,8 @@ func (in *Kernel) DeepCopy() *Kernel { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Kubernetes) DeepCopyInto(out *Kubernetes) { *out = *in - if in.KubernetesFeatures != nil { - in, out := &in.KubernetesFeatures, &out.KubernetesFeatures + if in.Features != nil { + in, out := &in.Features, &out.Features *out = make([]string, len(*in)) copy(*out, *in) } diff --git a/cmd/cli/create/create.go b/cmd/cli/create/create.go index e0e249cc..45cea4e7 100644 --- a/cmd/cli/create/create.go +++ b/cmd/cli/create/create.go @@ -199,9 +199,14 @@ func runProvision(log *logger.FunLogger, opts *options) error { } // Download kubeconfig - if opts.cfg.Spec.Kubernetes.Install && (opts.cfg.Spec.Kubernetes.KubeConfig != "" || opts.kubeconfig != "") { - if opts.cfg.Spec.Kubernetes.KubernetesInstaller == "microk8s" || opts.cfg.Spec.Kubernetes.KubernetesInstaller == "kind" { - log.Warning("kubeconfig retrieval is not supported for %s, skipping kubeconfig download", opts.cfg.Spec.Kubernetes.KubernetesInstaller) + if opts.cfg.Spec.Kubernetes.Install && (opts.cfg.Spec.Kubernetes.Config != "" || opts.kubeconfig != "") { + doesNotSupportKubeconfigRetrieval := map[string]bool{ + "microk8s": true, + "kind": true, + "nvkind": true, + } + if doesNotSupportKubeconfigRetrieval[opts.cfg.Spec.Kubernetes.Installer] { + log.Warning("kubeconfig retrieval is not supported for %s, skipping kubeconfig download", opts.cfg.Spec.Kubernetes.Installer) return nil } diff --git a/pkg/provisioner/dependency.go b/pkg/provisioner/dependency.go index c2dcc66d..14af6166 100644 --- a/pkg/provisioner/dependency.go +++ b/pkg/provisioner/dependency.go @@ -26,6 +26,7 @@ import ( const ( kubeadmInstaller = "kubeadm" kindInstaller = "kind" + nvkindInstaller = "nvkind" microk8sInstaller = "microk8s" containerdRuntime = "containerd" crioRuntime = "crio" @@ -37,9 +38,10 @@ const ( var ( functions = map[string]ProvisionFunc{ - kubeadmInstaller: kubeadm, - kindInstaller: kind, - microk8sInstaller: microk8s, + kubeadmInstaller: k8s, + kindInstaller: k8s, + nvkindInstaller: k8s, + microk8sInstaller: k8s, containerdRuntime: containerd, crioRuntime: criO, dockerRuntime: docker, @@ -76,7 +78,7 @@ func containerToolkit(tpl *bytes.Buffer, env v1alpha1.Environment) error { return containerToolkit.Execute(tpl, env) } -func kubeadm(tpl *bytes.Buffer, env v1alpha1.Environment) error { +func k8s(tpl *bytes.Buffer, env v1alpha1.Environment) error { kubernetes, err := templates.NewKubernetes(env) if err != nil { return err @@ -133,17 +135,19 @@ func NewDependencies(env v1alpha1.Environment) *DependencyResolver { } func (d *DependencyResolver) withKubernetes() { - switch d.env.Spec.Kubernetes.KubernetesInstaller { + switch d.env.Spec.Kubernetes.Installer { case kubeadmInstaller: d.Dependencies = append(d.Dependencies, functions[kubeadmInstaller]) case kindInstaller: d.Dependencies = append(d.Dependencies, functions[kindInstaller]) + case nvkindInstaller: + d.Dependencies = append(d.Dependencies, functions[nvkindInstaller]) case microk8sInstaller: // reset the list to only include microk8s d.Dependencies = nil d.Dependencies = append(d.Dependencies, functions[microk8sInstaller]) default: - // default to kubeadm if KubernetesInstaller is empty + // default to kubeadm if Installer is empty d.Dependencies = append(d.Dependencies, functions[kubeadmInstaller]) } } diff --git a/pkg/provisioner/dependency_test.go b/pkg/provisioner/dependency_test.go index d0f7cb3a..02b71074 100644 --- a/pkg/provisioner/dependency_test.go +++ b/pkg/provisioner/dependency_test.go @@ -21,7 +21,7 @@ func TestDependencyResolver_WithKubernetes(t *testing.T) { env := v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesInstaller: "kubeadm", + Installer: "kubeadm", }, }, } @@ -78,8 +78,8 @@ func TestDependencyResolver_Resolve(t *testing.T) { env := v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - Install: true, - KubernetesInstaller: "kubeadm", + Install: true, + Installer: "kubeadm", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Install: true, diff --git a/pkg/provisioner/dryrun.go b/pkg/provisioner/dryrun.go index 642c755a..be2bca12 100644 --- a/pkg/provisioner/dryrun.go +++ b/pkg/provisioner/dryrun.go @@ -30,13 +30,11 @@ func Dryrun(log *logger.FunLogger, env v1alpha1.Environment) error { go log.Loading("Resolving dependencies \U0001F4E6\n") // Kubernetes -> Container Toolkit -> Container Runtime -> NVDriver - if env.Spec.Kubernetes.Install && env.Spec.Kubernetes.KubernetesInstaller == "kubeadm" { + if env.Spec.Kubernetes.Install && env.Spec.Kubernetes.Installer == "kubeadm" { // check if env.Spec.Kubernetes.KubernetesVersion is in the format of vX.Y.Z - if env.Spec.Kubernetes.KubernetesVersion != "" { - if !strings.HasPrefix(env.Spec.Kubernetes.KubernetesVersion, "v") { - log.Fail <- struct{}{} - return fmt.Errorf("kubernetes version %s is not in the format of vX.Y.Z", env.Spec.Kubernetes.KubernetesVersion) - } + if env.Spec.Kubernetes.Installer == "kubeadm" && !strings.HasPrefix(env.Spec.Kubernetes.Version, "v") { + log.Fail <- struct{}{} + return fmt.Errorf("kubernetes version %s is not in the format of vX.Y.Z", env.Spec.Kubernetes.Version) } } diff --git a/pkg/provisioner/dryrun_test.go b/pkg/provisioner/dryrun_test.go index 7e81a113..318fc129 100644 --- a/pkg/provisioner/dryrun_test.go +++ b/pkg/provisioner/dryrun_test.go @@ -11,9 +11,9 @@ func TestDryrun_ValidKubernetesVersion(t *testing.T) { env := v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - Install: true, - KubernetesInstaller: "kubeadm", - KubernetesVersion: "v1.20.0", + Install: true, + Installer: "kubeadm", + Version: "v1.20.0", }, }, } @@ -28,9 +28,9 @@ func TestDryrun_InvalidKubernetesVersion(t *testing.T) { env := v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - Install: true, - KubernetesInstaller: "kubeadm", - KubernetesVersion: "1.20.0", + Install: true, + Installer: "kubeadm", + Version: "1.20.0", }, }, } diff --git a/pkg/provisioner/provisioner.go b/pkg/provisioner/provisioner.go index e4a0989f..b0a12ddd 100644 --- a/pkg/provisioner/provisioner.go +++ b/pkg/provisioner/provisioner.go @@ -120,7 +120,7 @@ func (p *Provisioner) Run(env v1alpha1.Environment) error { dependencies := NewDependencies(env) // Create kubeadm config file if required installer is kubeadm and not using legacy mode - if env.Spec.Kubernetes.KubernetesInstaller == "kubeadm" { + if env.Spec.Kubernetes.Installer == "kubeadm" { // Set the k8s endpoint host to the host url env.Spec.Kubernetes.K8sEndpointHost = p.HostUrl @@ -140,12 +140,16 @@ func (p *Provisioner) Run(env v1alpha1.Environment) error { // kind-config // Create kind config file if it is provided - if env.Spec.Kubernetes.KubernetesInstaller == "kind" && env.Spec.Kubernetes.KindConfig != "" { + if (env.Spec.Kubernetes.Installer == "kind" || env.Spec.Kubernetes.Installer == "nvkind") && env.Spec.Kubernetes.KindConfig != "" { if err := p.createKindConfig(env); err != nil { return fmt.Errorf("failed to create kind config file: %v", err) } } + if env.Spec.Kubernetes.Installer == "kubeadm" { + env.Spec.Kubernetes.K8sEndpointHost = p.HostUrl + } + for _, node := range dependencies.Resolve() { // Add script header and common functions to the script if err := addScriptHeader(&p.tpl); err != nil { diff --git a/pkg/provisioner/templates/container-toolkit.go b/pkg/provisioner/templates/container-toolkit.go index a2ea51ca..fe878abc 100644 --- a/pkg/provisioner/templates/container-toolkit.go +++ b/pkg/provisioner/templates/container-toolkit.go @@ -32,9 +32,9 @@ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dear sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \ && \ - sudo apt-get update + with_retry 3 10s sudo apt-get update -sudo apt-get install -y nvidia-container-toolkit +install_packages_with_retry nvidia-container-toolkit # Configure container runtime sudo nvidia-ctk runtime configure --runtime={{.ContainerRuntime}} --set-as-default --enable-cdi={{.EnableCDI}} diff --git a/pkg/provisioner/templates/docker.go b/pkg/provisioner/templates/docker.go index 0cc03326..2a4eebc7 100644 --- a/pkg/provisioner/templates/docker.go +++ b/pkg/provisioner/templates/docker.go @@ -30,7 +30,7 @@ const dockerTemplate = ` : ${DOCKER_VERSION:={{.Version}}} # Add Docker's official GPG key: -sudo apt-get update +with_retry 3 10s sudo apt-get update install_packages_with_retry ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg @@ -41,7 +41,7 @@ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -sudo apt-get update +with_retry 3 10s sudo apt-get update # if DOCKER_VERSION is latest, then install latest version, else install specific version if [ "$DOCKER_VERSION" = "latest" ]; then diff --git a/pkg/provisioner/templates/kubernetes.go b/pkg/provisioner/templates/kubernetes.go index 498c6fda..1293bde2 100644 --- a/pkg/provisioner/templates/kubernetes.go +++ b/pkg/provisioner/templates/kubernetes.go @@ -114,18 +114,24 @@ kubectl label node --all node-role.kubernetes.io/worker= kubectl label node --all nvidia.com/holodeck.managed=true ` -const KindTemplate = ` +const KindBaseTemplate = ` +: ${KIND_VERSION:={{.KindVersion}}} : ${INSTANCE_ENDPOINT_HOST:={{.K8sEndpointHost}}} KIND_CONFIG="" if [ -n "{{.KindConfig}}" ]; then KIND_CONFIG="--config /etc/kubernetes/kind.yaml" +ARCH=$(uname -m) +if [ "$ARCH" == "x86_64" ]; then + ARCH="amd64" +fi +if [ "$ARCH" == "aarch64" ]; then + ARCH="arm64" fi # Download kind -[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 -[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64 +curl -Lo ./kind https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-${ARCH} chmod +x ./kind sudo install ./kind /usr/local/bin/kind @@ -144,6 +150,9 @@ cd $HOME sudo nvidia-ctk runtime configure --set-as-default sudo systemctl restart docker sudo nvidia-ctk config --set accept-nvidia-visible-devices-as-volume-mounts --in-place +` + +const KindTemplate = ` # Create a cluster with the config file export KUBECONFIG="${HOME}/.kube/config:/var/run/kubernetes/admin.kubeconfig" @@ -156,12 +165,57 @@ echo "you can now access the cluster with:" echo "ssh -i ubuntu@${INSTANCE_ENDPOINT_HOST}" ` +const NVKindTemplate = ` + +# Go +# Set GO version +GO_VERSION="1.24.0" +ARCH=$(uname -m) +if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi +if [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi +wget https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz -O /tmp/go${GO_VERSION}.linux-${ARCH}.tar.gz +sudo rm -rf /usr/local/go +sudo tar -C /usr/local -xzf /tmp/go${GO_VERSION}.linux-${ARCH}.tar.gz + +# Add Go to PATH +if ! grep -q 'export PATH="/usr/local/go/bin:$PATH"' ~/.bashrc; then + echo 'export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"' >> ~/.bashrc +fi +export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH" + +# Make +install_packages_with_retry make + +# install nvkind +go install github.com/NVIDIA/nvkind/cmd/nvkind@latest + +# Load basic Kind config file +cat < kind-cluster-config.yml +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +featureGates: + DynamicResourceAllocation: true +containerdConfigPatches: +# Enable CDI as described in +# https://tags.cncf.io/container-device-interface#containerd-configuration +- |- + [plugins."io.containerd.grpc.v1.cri"] + enable_cdi = true +EOF + +nvkind cluster create --config-values kind-cluster-config.yml + +echo "NVKIND installed successfully" +echo "you can now access the cluster with:" +echo "ssh -i ubuntu@${INSTANCE_ENDPOINT_HOST}" +` + const microk8sTemplate = ` : ${INSTANCE_ENDPOINT_HOST:={{.K8sEndpointHost}}} # Install microk8s -sudo apt-get update +with_retry 3 10s sudo apt-get update sudo snap install microk8s --classic --channel={{.Version}} sudo microk8s enable gpu dashboard dns registry @@ -228,6 +282,7 @@ const ( type Kubernetes struct { Version string + KindVersion string Installer string KubeletReleaseVersion string Arch string @@ -261,16 +316,28 @@ type KubeadmConfig struct { func NewKubernetes(env v1alpha1.Environment) (*Kubernetes, error) { kubernetes := &Kubernetes{ - Version: env.Spec.Kubernetes.KubernetesVersion, + Version: env.Spec.Kubernetes.Version, } // check if env.Spec.Kubernetes.KubernetesVersion is in the format of vX.Y.Z // if not, set the default version - if !strings.HasPrefix(env.Spec.Kubernetes.KubernetesVersion, "v") && env.Spec.Kubernetes.KubernetesInstaller != "microk8s" { - fmt.Printf("Kubernetes version %s is not in the format of vX.Y.Z, setting default version v1.32.1\n", env.Spec.Kubernetes.KubernetesVersion) + if !strings.HasPrefix(env.Spec.Kubernetes.Version, "v") && env.Spec.Kubernetes.Installer != "microk8s" { + fmt.Printf("Kubernetes version %s is not in the format of vX.Y.Z, setting default version v1.32.1\n", env.Spec.Kubernetes.Version) kubernetes.Version = defaultKubernetesVersion } - if env.Spec.Kubernetes.KubeletReleaseVersion != "" { - kubernetes.KubeletReleaseVersion = env.Spec.Kubernetes.KubeletReleaseVersion + if env.Spec.Kubernetes.Installer == "kind" || env.Spec.Kubernetes.Installer == "nvkind" { + if env.Spec.Kubernetes.KindVersion != "" { + kubernetes.KindVersion = env.Spec.Kubernetes.KindVersion + } else { + kubernetes.KindVersion = defaultKubernetesVersion + } + } + if env.Spec.Kubernetes.Version != "" { + // For custom values, use v0.18.0, otherwise use default + if env.Spec.Kubernetes.Arch != "" || env.Spec.Kubernetes.CniPluginsVersion != "" || env.Spec.Kubernetes.CalicoVersion != "" || env.Spec.Kubernetes.CrictlVersion != "" { + kubernetes.KubeletReleaseVersion = "v0.18.0" + } else { + kubernetes.KubeletReleaseVersion = defaultKubeletReleaseVersion + } } else { kubernetes.KubeletReleaseVersion = defaultKubeletReleaseVersion } @@ -320,15 +387,25 @@ func NewKubernetes(env v1alpha1.Environment) (*Kubernetes, error) { func (k *Kubernetes) Execute(tpl *bytes.Buffer, env v1alpha1.Environment) error { kubernetesTemplate := new(template.Template) - switch env.Spec.Kubernetes.KubernetesInstaller { + switch env.Spec.Kubernetes.Installer { case "kubeadm": kubernetesTemplate = template.Must(template.New("kubeadm").Parse(KubeadmTemplate)) case "kind": + kindBase := template.Must(template.New("common-functions").Parse(KindBaseTemplate)) + if err := kindBase.Execute(tpl, k); err != nil { + return fmt.Errorf("failed to execute kind base template: %v", err) + } kubernetesTemplate = template.Must(template.New("kind").Parse(KindTemplate)) + case "nvkind": + kindBase := template.Must(template.New("common-functions").Parse(KindBaseTemplate)) + if err := kindBase.Execute(tpl, k); err != nil { + return fmt.Errorf("failed to execute kind base template: %v", err) + } + kubernetesTemplate = template.Must(template.New("nvkind").Parse(NVKindTemplate)) case "microk8s": kubernetesTemplate = template.Must(template.New("microk8s").Parse(microk8sTemplate)) default: - return fmt.Errorf("unknown kubernetes installer %s", env.Spec.Kubernetes.KubernetesInstaller) + return fmt.Errorf("unknown kubernetes installer %s", env.Spec.Kubernetes.Installer) } err := kubernetesTemplate.Execute(tpl, k) @@ -352,14 +429,14 @@ func NewKubeadmConfig(env v1alpha1.Environment) (*KubeadmConfig, error) { kConfig := &KubeadmConfig{ CriSocket: criSocket, // Assuming containerd as default ClusterName: "holodeck-cluster", - KubernetesVersion: env.Spec.Kubernetes.KubernetesVersion, // Uses provided Kubernetes version + KubernetesVersion: env.Spec.Kubernetes.Version, // Uses provided Kubernetes version ControlPlaneEndpoint: env.Spec.Kubernetes.K8sEndpointHost, PodSubnet: "192.168.0.0/16", // Default subnet, modify if needed FeatureGates: featureGates, // Convert slice to string for kubeadm RuntimeConfig: "resource.k8s.io/v1beta1=true", // Example runtime config } - if env.Spec.Kubernetes.KubernetesVersion == "" { + if env.Spec.Kubernetes.Version == "" { kConfig.KubernetesVersion = defaultKubernetesVersion } diff --git a/pkg/provisioner/templates/kubernetes_test.go b/pkg/provisioner/templates/kubernetes_test.go index a21d7119..403c2027 100644 --- a/pkg/provisioner/templates/kubernetes_test.go +++ b/pkg/provisioner/templates/kubernetes_test.go @@ -67,7 +67,7 @@ func TestNewKubernetes(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", + Version: "v1.30.0", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -91,7 +91,7 @@ func TestNewKubernetes(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.29.0", + Version: "v1.29.0", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -115,13 +115,12 @@ func TestNewKubernetes(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", - KubeletReleaseVersion: "v0.18.0", - Arch: "arm64", - CniPluginsVersion: "v1.7.0", - CalicoVersion: "v3.30.0", - CrictlVersion: "v1.32.0", - K8sFeatureGates: []string{"Feature1=true", "Feature2=false"}, + Version: "v1.30.0", + Arch: "arm64", + CniPluginsVersion: "v1.7.0", + CalicoVersion: "v3.30.0", + CrictlVersion: "v1.32.0", + K8sFeatureGates: []string{"Feature1=true", "Feature2=false"}, }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "docker", @@ -146,7 +145,7 @@ func TestNewKubernetes(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", + Version: "v1.30.0", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "invalid", @@ -184,8 +183,8 @@ func TestKubernetes_Execute(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", - KubernetesInstaller: "kubeadm", + Version: "v1.30.0", + Installer: "kubeadm", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -199,9 +198,9 @@ func TestKubernetes_Execute(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.29.0", - KubernetesInstaller: "kubeadm", - K8sEndpointHost: "test-host", + Version: "v1.29.0", + Installer: "kubeadm", + K8sEndpointHost: "test-host", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -217,8 +216,8 @@ func TestKubernetes_Execute(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", - KubernetesInstaller: "kind", + Version: "v1.30.0", + Installer: "kind", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -232,8 +231,8 @@ func TestKubernetes_Execute(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", - KubernetesInstaller: "microk8s", + Version: "v1.30.0", + Installer: "microk8s", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", @@ -247,8 +246,8 @@ func TestKubernetes_Execute(t *testing.T) { env: v1alpha1.Environment{ Spec: v1alpha1.EnvironmentSpec{ Kubernetes: v1alpha1.Kubernetes{ - KubernetesVersion: "v1.30.0", - KubernetesInstaller: "invalid", + Version: "v1.30.0", + Installer: "invalid", }, ContainerRuntime: v1alpha1.ContainerRuntime{ Name: "containerd", diff --git a/tests/aws_test.go b/tests/aws_test.go index 132be250..89e16f95 100644 --- a/tests/aws_test.go +++ b/tests/aws_test.go @@ -172,17 +172,17 @@ var _ = Describe("AWS Environment", func() { Describe("Kubernetes Configuration", func() { When("kubernetes is enabled", func() { BeforeEach(func() { - if state.opts.cfg.Spec.Kubernetes.KubernetesVersion == "" { + if state.opts.cfg.Spec.Kubernetes.Version == "" { Skip("Skipping test: Kubernetes version not specified in environment file") } }) It("should have valid kubernetes version", func() { - Expect(state.opts.cfg.Spec.Kubernetes.KubernetesVersion).NotTo(BeEmpty(), "Kubernetes version should not be empty") + Expect(state.opts.cfg.Spec.Kubernetes.Version).NotTo(BeEmpty(), "Kubernetes version should not be empty") }) It("should have valid kubernetes installer", func() { - Expect(state.opts.cfg.Spec.Kubernetes.KubernetesInstaller).NotTo(BeEmpty(), "Kubernetes installer should not be empty") + Expect(state.opts.cfg.Spec.Kubernetes.Installer).NotTo(BeEmpty(), "Kubernetes installer should not be empty") }) }) })