From bab66a0e48efb78512eeab92550c1dc486ab2165 Mon Sep 17 00:00:00 2001 From: Himanshu Kumar Date: Wed, 1 Oct 2025 19:57:37 +0100 Subject: [PATCH 1/3] Ignore Node Version and EKS Version check if AMI Type is bottlerocket --- pkg/resource/nodegroup/hook.go | 50 ++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/pkg/resource/nodegroup/hook.go b/pkg/resource/nodegroup/hook.go index 4a018f4..9dd1385 100644 --- a/pkg/resource/nodegroup/hook.go +++ b/pkg/resource/nodegroup/hook.go @@ -330,22 +330,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), + ) + } } } @@ -359,6 +361,24 @@ 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 + } + + switch *amiType { + case string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64), string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64_FIPS), + string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64_NVIDIA), string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64), + string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64_FIPS), string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64_NVIDIA): + return true + default: + 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 From 243b5cf91c5926a5833be31a374186f5152fd0b4 Mon Sep 17 00:00:00 2001 From: Himanshu Kumar Date: Wed, 1 Oct 2025 20:45:43 +0100 Subject: [PATCH 2/3] casing of the function name --- pkg/resource/nodegroup/hook.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/resource/nodegroup/hook.go b/pkg/resource/nodegroup/hook.go index 9dd1385..1bc30e9 100644 --- a/pkg/resource/nodegroup/hook.go +++ b/pkg/resource/nodegroup/hook.go @@ -330,7 +330,7 @@ func (rm *resourceManager) customUpdate( if desired.ko.Spec.Version != nil && desired.ko.Spec.ReleaseVersion != nil && *desired.ko.Spec.Version != "" && *desired.ko.Spec.ReleaseVersion != "" { - if !isAMITypeBottleRocket(desired.ko.Spec.AMIType) { + 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 { @@ -361,10 +361,10 @@ func (rm *resourceManager) customUpdate( return updatedRes, nil } -// BottleRocket AMI types do not follow the same versioning scheme as other AMI types. +// 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 { +func isAMITypeBottlerocket(amiType *string) bool { if amiType == nil { return false } From e7910ec12b2aec13cfab86403f4789654a414c6c Mon Sep 17 00:00:00 2001 From: Himanshu Kumar Date: Thu, 2 Oct 2025 07:11:48 +0100 Subject: [PATCH 3/3] added tests --- pkg/resource/nodegroup/hook.go | 10 +++--- pkg/resource/nodegroup/hook_test.go | 50 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/pkg/resource/nodegroup/hook.go b/pkg/resource/nodegroup/hook.go index 1bc30e9..0efc5b9 100644 --- a/pkg/resource/nodegroup/hook.go +++ b/pkg/resource/nodegroup/hook.go @@ -18,6 +18,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "time" ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare" @@ -369,14 +370,11 @@ func isAMITypeBottlerocket(amiType *string) bool { return false } - switch *amiType { - case string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64), string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64_FIPS), - string(svcapitypes.AMITypes_BOTTLEROCKET_ARM_64_NVIDIA), string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64), - string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64_FIPS), string(svcapitypes.AMITypes_BOTTLEROCKET_x86_64_NVIDIA): + if strings.HasPrefix(*amiType, "BOTTLEROCKET_") { return true - default: - return false } + + return false } // newUpdateLabelsPayload determines which of the labels should be added or diff --git a/pkg/resource/nodegroup/hook_test.go b/pkg/resource/nodegroup/hook_test.go index 6222ca6..2e022c8 100644 --- a/pkg/resource/nodegroup/hook_test.go +++ b/pkg/resource/nodegroup/hook_test.go @@ -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)) + }) + } +}