Skip to content

Commit 89261d5

Browse files
chore: Add error for AL2 with K8s 1.33+ (#8151)
Co-authored-by: Jason Deal <dealj@umich.edu>
1 parent 8427b4c commit 89261d5

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

pkg/controllers/nodeclass/ami.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ func NewAMIReconciler(provider amifamily.Provider) *AMI {
4747
func (a *AMI) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass) (reconcile.Result, error) {
4848
amis, err := a.amiProvider.List(ctx, nodeClass)
4949
if err != nil {
50+
if amifamily.IsAl2DeprecationError(err) {
51+
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeAMIsReady, "UnsupportedAlias", err.Error())
52+
return reconcile.Result{}, reconcile.TerminalError(fmt.Errorf("getting amis, %w", err))
53+
}
5054
return reconcile.Result{}, fmt.Errorf("getting amis, %w", err)
5155
}
5256
if len(amis) == 0 {

pkg/providers/amifamily/ami.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package amifamily
1717
import (
1818
"context"
1919
"fmt"
20+
"strconv"
2021
"strings"
2122
"sync"
2223

@@ -87,6 +88,14 @@ func (p *DefaultProvider) DescribeImageQueries(ctx context.Context, nodeClass *v
8788
// This is enforced by a CEL validation, we will treat this as an invariant.
8889
if alias := nodeClass.Alias(); alias != nil {
8990
kubernetesVersion := p.versionProvider.Get(ctx)
91+
if alias.Family == v1.AMIFamilyAL2 {
92+
minorVersion, err := strconv.Atoi(strings.Split(kubernetesVersion, ".")[1])
93+
if err == nil && minorVersion >= 33 {
94+
return nil, &AL2DeprecationError{
95+
error: fmt.Errorf("AL2 aliases are no longer supported on EKS 1.33+ (see https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions-standard.html#kubernetes-1-33)"),
96+
}
97+
}
98+
}
9099
query, err := GetAMIFamily(alias.Family, nil).DescribeImageQuery(ctx, p.ssmProvider, kubernetesVersion, alias.Version)
91100
if err != nil {
92101
return []DescribeImageQuery{}, err

pkg/providers/amifamily/suite_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,43 @@ var _ = AfterSuite(func() {
132132
Expect(env.Stop()).To(Succeed(), "Failed to stop environment")
133133
})
134134

135+
type MockVersionProvider struct {
136+
version string
137+
}
138+
139+
func (m *MockVersionProvider) Get(ctx context.Context) string {
140+
return m.version
141+
}
142+
143+
func amiProviderWithEKSVersionOverride(version string) *amifamily.DefaultProvider {
144+
mockVersionProvider := &MockVersionProvider{version: version}
145+
return amifamily.NewDefaultProvider(awsEnv.Clock, mockVersionProvider, awsEnv.SSMProvider, awsEnv.EC2API, awsEnv.EC2Cache)
146+
}
147+
135148
var _ = Describe("AMIProvider", func() {
136149
var version string
137150
BeforeEach(func() {
138151
version = awsEnv.VersionProvider.Get(ctx)
139152
nodeClass = test.EC2NodeClass()
140153
})
154+
DescribeTable(
155+
"should fail when AL2 is used with Kubernetes version 1.33 or greater",
156+
func(k8sVersion string, amiAlias string, expectError bool) {
157+
amiProvider := amiProviderWithEKSVersionOverride(k8sVersion)
158+
nodeClass.Spec.AMISelectorTerms = []v1.AMISelectorTerm{{Alias: amiAlias}}
159+
_, err := amiProvider.DescribeImageQueries(ctx, nodeClass)
160+
if expectError {
161+
Expect(err).To(HaveOccurred())
162+
} else {
163+
Expect(err).ToNot(HaveOccurred())
164+
}
165+
},
166+
Entry("should fail for AL2 on 1.33.0", "1.33.0", "al2@latest", true),
167+
Entry("should fail for AL2 on 1.34.2", "1.34.2", "al2@latest", true),
168+
Entry("should succeed for AL2 on 1.32.0", "1.32.0", "al2@latest", false),
169+
Entry("should succeed for AL2023 on 1.33.0", "1.33.0", "al2023@latest", false),
170+
)
171+
141172
It("should succeed to resolve AMIs (AL2)", func() {
142173
nodeClass.Spec.AMISelectorTerms = []v1.AMISelectorTerm{{Alias: "al2@latest"}}
143174
awsEnv.SSMAPI.Parameters = map[string]string{

pkg/providers/amifamily/types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ limitations under the License.
1515
package amifamily
1616

1717
import (
18+
"errors"
1819
"fmt"
1920
"math"
2021
"sort"
@@ -128,3 +129,15 @@ func (q DescribeImageQuery) RequirementsForImageWithArchitecture(image string, a
128129
}
129130
return []scheduling.Requirements{scheduling.NewRequirements(scheduling.NewRequirement(corev1.LabelArchStable, corev1.NodeSelectorOpIn, arch))}
130131
}
132+
133+
type AL2DeprecationError struct {
134+
error
135+
}
136+
137+
func IsAl2DeprecationError(err error) bool {
138+
if err == nil {
139+
return false
140+
}
141+
var al2Err *AL2DeprecationError
142+
return errors.As(err, &al2Err)
143+
}

pkg/test/environment.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ type Environment struct {
9595
AMIResolver *amifamily.DefaultResolver
9696
VersionProvider *version.DefaultProvider
9797
LaunchTemplateProvider *launchtemplate.DefaultProvider
98+
SSMProvider *ssmp.DefaultProvider
9899
}
99100

100101
func NewEnvironment(ctx context.Context, env *coretest.Environment) *Environment {
@@ -205,6 +206,7 @@ func NewEnvironment(ctx context.Context, env *coretest.Environment) *Environment
205206
AMIProvider: amiProvider,
206207
AMIResolver: amiResolver,
207208
VersionProvider: versionProvider,
209+
SSMProvider: ssmProvider,
208210
}
209211
}
210212

0 commit comments

Comments
 (0)