Skip to content

Commit

Permalink
Add bottlerocket user data format
Browse files Browse the repository at this point in the history
  • Loading branch information
cartermckinnon committed Jun 3, 2024
1 parent 95c9a60 commit 7f411ff
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 31 deletions.
8 changes: 6 additions & 2 deletions kubetest2/internal/deployers/eksapi/nodegroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func (m *NodegroupManager) createManagedNodegroup(infra *Infrastructure, cluster
func (m *NodegroupManager) createUnmanagedNodegroup(infra *Infrastructure, cluster *Cluster, opts *deployerOptions) error {
stackName := m.getUnmanagedNodegroupStackName()
klog.Infof("creating unmanaged nodegroup stack...")
userData, err := generateUserData(opts.UserDataFormat, cluster)
userData, userDataIsMimePart, err := generateUserData(opts.UserDataFormat, cluster)
if err != nil {
return err
}
Expand Down Expand Up @@ -145,6 +145,10 @@ func (m *NodegroupManager) createUnmanagedNodegroup(infra *Infrastructure, clust
ParameterKey: aws.String("UserData"),
ParameterValue: aws.String(userData),
},
{
ParameterKey: aws.String("UserDataIsMIMEPart"),
ParameterValue: aws.String(strconv.FormatBool(userDataIsMimePart)),
},
{
ParameterKey: aws.String("ClusterName"),
ParameterValue: aws.String(cluster.name),
Expand Down Expand Up @@ -203,7 +207,7 @@ func (m *NodegroupManager) createUnmanagedNodegroup(infra *Infrastructure, clust
func (m *NodegroupManager) createUnmanagedNodegroupWithEFA(infra *Infrastructure, cluster *Cluster, opts *deployerOptions) error {
stackName := m.getUnmanagedNodegroupStackName()
klog.Infof("creating unmanaged nodegroup with EFA stack...")
userData, err := generateUserData(opts.UserDataFormat, cluster)
userData, _, err := generateUserData(opts.UserDataFormat, cluster)
if err != nil {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions kubetest2/internal/deployers/eksapi/templates/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ var (
//go:embed userdata_nodeadm.yaml.mimepart.template
userDataNodeadmTemplate string
UserDataNodeadm = template.Must(template.New("userDataNodeadm").Parse(userDataNodeadmTemplate))

//go:embed userdata_bottlerocket.toml.template
userDataBottlerocketTemplate string
UserDataBottlerocket = template.Must(template.New("userDataBottlerocket").Parse(userDataBottlerocketTemplate))
)

type UserDataTemplateData struct {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ Parameters:
UserData:
Type: String

UserDataIsMIMEPart:
Description: "User data should be embedded as a part of a multi-part MIME document"
Default: true
Type: String
AllowedValues: [true, false]

Conditions:
IsUserDataMIMEPart:
!Equals [true, !Ref UserDataIsMIMEPart]

Resources:
NodeInstanceProfile:
Type: AWS::IAM::InstanceProfile
Expand Down Expand Up @@ -97,24 +107,28 @@ Resources:
KeyName: !Ref SSHKeyPair
UserData:
Fn::Base64:
Fn::Sub: |
Content-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0

--BOUNDARY
${UserData}

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0

#!/usr/bin/env bash
/opt/aws/bin/cfn-signal \
--stack ${AWS::StackName} \
--resource NodeGroup \
--region ${AWS::Region}

--BOUNDARY--
Fn::If:
- IsUserDataMIMEPart
- Fn::Sub: |
Content-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0

--BOUNDARY
${UserData}

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0

#!/usr/bin/env bash
/opt/aws/bin/cfn-signal \
--stack ${AWS::StackName} \
--resource NodeGroup \
--region ${AWS::Region}

--BOUNDARY--
- Fn::Sub: |
${UserData}
IamInstanceProfile:
Arn: !GetAtt NodeInstanceProfile.Arn
ImageId: !Ref AMIId
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[settings.kubernetes]
"cluster-name" = "{{.Name}}"
"api-server" = "{{.APIServerEndpoint}}"
"cluster-certificate" = "{{.CertificateAuthority}}"

[settings.host-containers.admin]
"enabled" = true
12 changes: 8 additions & 4 deletions kubetest2/internal/deployers/eksapi/userdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,20 @@ import (
"github.com/aws/aws-k8s-tester/kubetest2/internal/deployers/eksapi/templates"
)

func generateUserData(format string, cluster *Cluster) (string, error) {
func generateUserData(format string, cluster *Cluster) (string, bool, error) {
userDataIsMimePart := true
var t *template.Template
switch format {
case "bootstrap.sh":
t = templates.UserDataBootstrapSh
case "nodeadm":
// TODO: replace the YAML template with proper usage of the nodeadm API go types
t = templates.UserDataNodeadm
case "bottlerocket":
t = templates.UserDataBottlerocket
userDataIsMimePart = false
default:
return "", fmt.Errorf("uknown user data format: '%s'", format)
return "", false, fmt.Errorf("uknown user data format: '%s'", format)
}
buf := bytes.Buffer{}
if err := t.Execute(&buf, templates.UserDataTemplateData{
Expand All @@ -26,7 +30,7 @@ func generateUserData(format string, cluster *Cluster) (string, error) {
CIDR: cluster.cidr,
Name: cluster.name,
}); err != nil {
return "", err
return "", false, err
}
return buf.String(), nil
return buf.String(), userDataIsMimePart, nil
}
18 changes: 11 additions & 7 deletions kubetest2/internal/deployers/eksapi/userdata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,26 +38,30 @@ spec:

func Test_generateUserData(t *testing.T) {
cases := []struct {
format string
expected string
format string
expected string
expectedIsMimePart bool
}{
{
format: "bootstrap.sh",
expected: bootstrapShUserData,
format: "bootstrap.sh",
expected: bootstrapShUserData,
expectedIsMimePart: true,
},
{
format: "nodeadm",
expected: nodeadmUserData,
format: "nodeadm",
expected: nodeadmUserData,
expectedIsMimePart: true,
},
}
for _, c := range cases {
t.Run(c.format, func(t *testing.T) {
actual, err := generateUserData(c.format, &cluster)
actual, isMimePart, err := generateUserData(c.format, &cluster)
if err != nil {
t.Log(err)
t.Error(err)
}
assert.Equal(t, c.expected, actual)
assert.Equal(t, c.expectedIsMimePart, isMimePart)
})
}
}

0 comments on commit 7f411ff

Please sign in to comment.