Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 33 additions & 15 deletions pkg/resource/nodegroup/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"reflect"
"strconv"
"strings"
"time"

ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare"
Expand Down Expand Up @@ -330,22 +331,24 @@ func (rm *resourceManager) customUpdate(
if desired.ko.Spec.Version != nil && desired.ko.Spec.ReleaseVersion != nil &&
*desired.ko.Spec.Version != "" && *desired.ko.Spec.ReleaseVersion != "" {

// First parse the user provided release version and desired release
desiredReleaseVersionTrimmed, err := util.GetEKSVersionFromReleaseVersion(*desired.ko.Spec.ReleaseVersion)
if err != nil {
return nil, ackerr.NewTerminalError(err)
}
if !isAMITypeBottlerocket(desired.ko.Spec.AMIType) {
// First parse the user provided release version and desired release
desiredReleaseVersionTrimmed, err := util.GetEKSVersionFromReleaseVersion(*desired.ko.Spec.ReleaseVersion)
if err != nil {
return nil, ackerr.NewTerminalError(err)
}

// Set a terminal condition if the release version and version do not match.
// e.g if the user provides a release version of 1.16.8-20211201 and a version of 1.17
// They will either need to provide one of the following:
// 2. A version
// 1. A release version
// 3. A version and release version that matches (e.g 1.16 and 1.16.8-20211201)
if desiredReleaseVersionTrimmed != *desired.ko.Spec.Version {
return nil, ackerr.NewTerminalError(
fmt.Errorf("version and release version do not match: %s and %s", *desired.ko.Spec.Version, desiredReleaseVersionTrimmed),
)
// Set a terminal condition if the release version and version do not match.
// e.g if the user provides a release version of 1.16.8-20211201 and a version of 1.17
// They will either need to provide one of the following:
// 2. A version
// 1. A release version
// 3. A version and release version that matches (e.g 1.16 and 1.16.8-20211201)
if desiredReleaseVersionTrimmed != *desired.ko.Spec.Version {
return nil, ackerr.NewTerminalError(
fmt.Errorf("version and release version do not match: %s and %s", *desired.ko.Spec.Version, desiredReleaseVersionTrimmed),
)
}
}
}

Expand All @@ -359,6 +362,21 @@ func (rm *resourceManager) customUpdate(
return updatedRes, nil
}

// Bottlerocket AMI types do not follow the same versioning scheme as other AMI types.
// For more information, see https://github.com/awslabs/amazon-eks-ami/releases
// and https://github.com/bottlerocket-os/bottlerocket/releases
func isAMITypeBottlerocket(amiType *string) bool {
if amiType == nil {
return false
}

if strings.HasPrefix(*amiType, "BOTTLEROCKET_") {
return true
}

return false
}

// newUpdateLabelsPayload determines which of the labels should be added or
// updated, and which labels should be removed, based on the desired vs the
// latest
Expand Down
50 changes: 50 additions & 0 deletions pkg/resource/nodegroup/hook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -550,3 +550,53 @@ func Test_newUpdateNodegroupPayload(t *testing.T) {
})
}
}

func Test_AMITypeBottlerocket(t *testing.T) {
tests := []struct {
name string
amiType *string
want bool
}{
{
name: "nil ami type",
amiType: nil,
want: false,
},
{
name: "BOTTLEROCKET_ARM_64 AMI",
amiType: aws.String("BOTTLEROCKET_ARM_64"),
want: true,
},
{
name: "BOTTLEROCKET_ARM_64_NVIDIA AMI",
amiType: aws.String("BOTTLEROCKET_ARM_64_NVIDIA"),
want: true,
},
{
name: "BOTTLEROCKET_x86_64 AMI",
amiType: aws.String("BOTTLEROCKET_x86_64"),
want: true,
},
{
name: "BOTTLEROCKET_x86_64_FIPS AMI",
amiType: aws.String("BOTTLEROCKET_x86_64_FIPS"),
want: true,
},
{
name: "BOTTLEROCKET_x86_64_NVIDIA AMI",
amiType: aws.String("BOTTLEROCKET_x86_64_NVIDIA"),
want: true,
},
{
name: "RANDOM AMI",
amiType: aws.String("RANDOM"),
want: false,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert.Equal(t, tt.want, isAMITypeBottlerocket(tt.amiType))
})
}
}