Skip to content

Commit

Permalink
Merge pull request #7821 from cPu1/fix-al2-arm64-upgrade
Browse files Browse the repository at this point in the history
Fix upgrading AL2 ARM64 nodegroups
  • Loading branch information
cPu1 committed Jun 7, 2024
2 parents 68695db + 54e9b87 commit 631488f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 18 deletions.
11 changes: 4 additions & 7 deletions pkg/actions/nodegroup/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,9 @@ func (m *Manager) upgradeUsingStack(ctx context.Context, options UpgradeOptions,
latestReleaseVersion, err := m.getLatestReleaseVersion(ctx, kubernetesVersion, nodegroup)
if err != nil {
return err
} else if latestReleaseVersion != "" {
}

if latestReleaseVersion != "" {
if err := m.updateReleaseVersion(latestReleaseVersion, options.LaunchTemplateVersion, nodegroup, ngResource); err != nil {
return err
}
Expand Down Expand Up @@ -337,15 +339,10 @@ func (m *Manager) requiresStackUpdate(ctx context.Context, nodeGroupName string)
}

func (m *Manager) getLatestReleaseVersion(ctx context.Context, kubernetesVersion string, nodeGroup *ekstypes.Nodegroup) (string, error) {
ssmParameterName, err := ami.MakeManagedSSMParameterName(kubernetesVersion, nodeGroup.AmiType)
if err != nil {
return "", err
}

ssmParameterName := ami.MakeManagedSSMParameterName(kubernetesVersion, nodeGroup.AmiType)
if ssmParameterName == "" {
return "", nil
}

ssmOutput, err := m.ctl.AWSProvider.SSM().GetParameter(ctx, &ssm.GetParameterInput{
Name: &ssmParameterName,
})
Expand Down
25 changes: 15 additions & 10 deletions pkg/ami/ssm_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,24 +84,29 @@ func MakeSSMParameterName(version, instanceType, imageFamily string) (string, er
}

// MakeManagedSSMParameterName creates an SSM parameter name for a managed nodegroup
func MakeManagedSSMParameterName(version string, amiType ekstypes.AMITypes) (string, error) {
func MakeManagedSSMParameterName(version string, amiType ekstypes.AMITypes) string {
makeAL2ParameterName := func(imageTypeSuffix string) string {
imageType := utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2) + imageTypeSuffix
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/recommended/release_version", version, imageType)
}
switch amiType {
case ekstypes.AMITypesAl2023X8664Standard:
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/x86_64/standard/recommended/release_version", version, utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2023)), nil
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/x86_64/standard/recommended/release_version", version, utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2023))
case ekstypes.AMITypesAl2023Arm64Standard:
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/arm64/standard/recommended/release_version", version, utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2023)), nil
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/arm64/standard/recommended/release_version", version, utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2023))
case ekstypes.AMITypesAl2X8664:
imageType := utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2)
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/recommended/release_version", version, imageType), nil
return makeAL2ParameterName("")
case ekstypes.AMITypesAl2X8664Gpu:
imageType := utils.ToKebabCase(api.NodeImageFamilyAmazonLinux2) + "-gpu"
return fmt.Sprintf("/aws/service/eks/optimized-ami/%s/%s/recommended/release_version", version, imageType), nil
return makeAL2ParameterName("-gpu")
case ekstypes.AMITypesAl2Arm64:
return makeAL2ParameterName("-arm64")
case ekstypes.AMITypesBottlerocketArm64, ekstypes.AMITypesBottlerocketArm64Nvidia:
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/arm64/latest/image_version", version), nil
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/arm64/latest/image_version", version)
case ekstypes.AMITypesBottlerocketX8664, ekstypes.AMITypesBottlerocketX8664Nvidia:
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/x86_64/latest/image_version", version), nil
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/x86_64/latest/image_version", version)
default:
return ""
}
return "", nil
}

// instanceEC2ArchName returns the name of the architecture as used by EC2
Expand Down
18 changes: 17 additions & 1 deletion pkg/ami/ssm_resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ package ami_test

import (
"context"
"strings"

"github.com/aws/aws-sdk-go-v2/aws"
ekstypes "github.com/aws/aws-sdk-go-v2/service/eks/types"
"github.com/aws/aws-sdk-go-v2/service/ssm"
ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types"

"github.com/aws/aws-sdk-go-v2/aws"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/mock"

. "github.com/weaveworks/eksctl/pkg/ami"
api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5"
"github.com/weaveworks/eksctl/pkg/testutils/mockprovider"
)

Expand Down Expand Up @@ -397,6 +400,19 @@ var _ = Describe("AMI Auto Resolution", func() {
})
})
})

Context("managed SSM parameter name", func() {
It("should support SSM parameter generation for all AMI types but Windows", func() {
var eksAMIType ekstypes.AMITypes
for _, amiType := range eksAMIType.Values() {
if amiType == ekstypes.AMITypesCustom || strings.HasPrefix(string(amiType), "WINDOWS_") {
continue
}
ssmParameterName := MakeManagedSSMParameterName(api.LatestVersion, amiType)
Expect(ssmParameterName).NotTo(BeEmpty(), "expected to generate SSM parameter name for AMI type %s", amiType)
}
})
})
})

func addMockGetParameter(p *mockprovider.MockProvider, name, amiID string) {
Expand Down

0 comments on commit 631488f

Please sign in to comment.