Skip to content

Commit

Permalink
Add tests and docs
Browse files Browse the repository at this point in the history
  • Loading branch information
suket22 committed May 3, 2022
1 parent e480948 commit 250fb32
Show file tree
Hide file tree
Showing 5 changed files with 343 additions and 217 deletions.
54 changes: 53 additions & 1 deletion pkg/cloudprovider/aws/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@ import (
"context"
"encoding/base64"
"fmt"
"github.com/aws/karpenter/pkg/controllers/state"
"io/ioutil"
"math"
"strings"
"testing"

"github.com/aws/karpenter/pkg/controllers/state"

"github.com/Pallinder/go-randomdata"
"github.com/aws/amazon-vpc-resource-controller-k8s/pkg/aws/vpc"
"github.com/aws/karpenter/pkg/apis/provisioning/v1alpha5"
Expand Down Expand Up @@ -659,6 +662,55 @@ var _ = Describe("Allocation", func() {
userData, _ := base64.StdEncoding.DecodeString(*input.LaunchTemplateData.UserData)
Expect(string(userData)).To(ContainSubstring("--container-runtime dockerd"))
})
Context("Bottlerocket", func() {
It("should merge in custom user data", func() {
provider, _ := v1alpha1.Deserialize(provisioner.Spec.Provider)
provider.AMIFamily = &v1alpha1.AMIFamilyBottlerocket
content, _ := ioutil.ReadFile("testdata/br_userdata_input.golden")
provider.UserData = aws.String(base64.StdEncoding.EncodeToString([]byte(content)))
controller = provisioning.NewController(injection.WithOptions(ctx, opts), env.Client, clientSet.CoreV1(), cloudProvider, cluster)
newProvisioner := test.Provisioner(test.ProvisionerOptions{Provider: provider})
ExpectApplied(ctx, env.Client, newProvisioner)
pod := ExpectProvisioned(ctx, env.Client, controller, test.UnschedulablePod())[0]
ExpectScheduled(ctx, env.Client, pod)
Expect(fakeEC2API.CalledWithCreateLaunchTemplateInput.Cardinality()).To(Equal(1))
input := fakeEC2API.CalledWithCreateLaunchTemplateInput.Pop().(*ec2.CreateLaunchTemplateInput)
userData, _ := base64.StdEncoding.DecodeString(*input.LaunchTemplateData.UserData)
content, _ = ioutil.ReadFile("testdata/br_userdata_merged.golden")
// Newlines are always added for missing TOML fields, so strip them out before comparisons.
actualUserData := strings.Replace(string(userData), "\n", "", -1)
fmt.Printf("%v", actualUserData)
expectedUserData := strings.Replace(fmt.Sprintf(string(content), newProvisioner.Name), "\n", "", -1)
Expect(expectedUserData).To(Equal(actualUserData))
})
It("should bootstrap when custom user data is empty", func() {
provider, _ := v1alpha1.Deserialize(provisioner.Spec.Provider)
provider.AMIFamily = &v1alpha1.AMIFamilyBottlerocket
controller = provisioning.NewController(injection.WithOptions(ctx, opts), env.Client, clientSet.CoreV1(), cloudProvider, cluster)
newProvisioner := test.Provisioner(test.ProvisionerOptions{Provider: provider})
ExpectApplied(ctx, env.Client, newProvisioner)
pod := ExpectProvisioned(ctx, env.Client, controller, test.UnschedulablePod())[0]
ExpectScheduled(ctx, env.Client, pod)
Expect(fakeEC2API.CalledWithCreateLaunchTemplateInput.Cardinality()).To(Equal(1))
input := fakeEC2API.CalledWithCreateLaunchTemplateInput.Pop().(*ec2.CreateLaunchTemplateInput)
userData, _ := base64.StdEncoding.DecodeString(*input.LaunchTemplateData.UserData)
content, _ := ioutil.ReadFile("testdata/br_userdata_unmerged.golden")
actualUserData := strings.Replace(string(userData), "\n", "", -1)
expectedUserData := strings.Replace(fmt.Sprintf(string(content), newProvisioner.Name), "\n", "", -1)
Expect(expectedUserData).To(Equal(actualUserData))
})
It("should not bootstrap on invalid toml user data", func() {
provider, _ := v1alpha1.Deserialize(provisioner.Spec.Provider)
provider.AMIFamily = &v1alpha1.AMIFamilyBottlerocket
provider.UserData = aws.String("#/bin/bash\n ./not-toml.sh")
controller = provisioning.NewController(injection.WithOptions(ctx, opts), env.Client, clientSet.CoreV1(), cloudProvider, cluster)
newProvisioner := test.Provisioner(test.ProvisionerOptions{Provider: provider})
ExpectApplied(ctx, env.Client, newProvisioner)
pod := ExpectProvisioned(ctx, env.Client, controller, test.UnschedulablePod())[0]
// This will not be scheduled since userData cannot be generated for the prospective node.
ExpectNotScheduled(ctx, env.Client, pod)
})
})
Context("Kubelet Args", func() {
It("should specify the --dns-cluster-ip flag when clusterDNSIP is set", func() {
ExpectApplied(ctx, env.Client, test.Provisioner(test.ProvisionerOptions{
Expand Down
4 changes: 4 additions & 0 deletions pkg/cloudprovider/aws/testdata/br_userdata_input.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[settings.kubernetes.eviction-hard]
"memory.available" = "12%"
[settings.kubernetes]
"unknown-setting" = "unknown"
15 changes: 15 additions & 0 deletions pkg/cloudprovider/aws/testdata/br_userdata_merged.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[settings]
[settings.kubernetes]
api-server = 'https://test-cluster'
cluster-certificate = 'ca-bundle'
cluster-name = 'test-cluster'
max-pods = 110

[settings.kubernetes.node-labels]
'karpenter.sh/capacity-type' = 'on-demand'
'karpenter.sh/provisioner-name' = '%s'

[settings.kubernetes.node-taints]

[settings.kubernetes.eviction-hard]
'memory.available' = '12%%'
12 changes: 12 additions & 0 deletions pkg/cloudprovider/aws/testdata/br_userdata_unmerged.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[settings]
[settings.kubernetes]
api-server = 'https://test-cluster'
cluster-certificate = 'ca-bundle'
cluster-name = 'test-cluster'
max-pods = 110

[settings.kubernetes.node-labels]
'karpenter.sh/capacity-type' = 'on-demand'
'karpenter.sh/provisioner-name' = '%s'

[settings.kubernetes.node-taints]
Loading

0 comments on commit 250fb32

Please sign in to comment.