diff --git a/pkg/apis/v1/ec2nodeclass_conversion.go b/pkg/apis/v1/ec2nodeclass_conversion.go index caa5284d13c3..86ccdf5e6a20 100644 --- a/pkg/apis/v1/ec2nodeclass_conversion.go +++ b/pkg/apis/v1/ec2nodeclass_conversion.go @@ -51,6 +51,17 @@ func (in *EC2NodeClass) ConvertTo(ctx context.Context, to apis.Convertible) erro v1beta1enc.Spec.AMIFamily = lo.ToPtr(in.AMIFamily()) } + if term, ok := lo.Find(in.Spec.AMISelectorTerms, func(term AMISelectorTerm) bool { + return term.Alias != "" + }); ok { + version := AMIVersionFromAlias(term.Alias) + if version != "latest" { + v1beta1enc.Annotations = lo.Assign(v1beta1enc.Annotations, map[string]string{ + AnnotationAliasVersionCompatibilityKey: version, + }) + } + } + in.Spec.convertTo(&v1beta1enc.Spec) in.Status.convertTo((&v1beta1enc.Status)) return nil @@ -127,6 +138,7 @@ func (in *EC2NodeClassStatus) convertTo(v1beta1enc *v1beta1.EC2NodeClassStatus) func (in *EC2NodeClass) ConvertFrom(ctx context.Context, from apis.Convertible) error { v1beta1enc := from.(*v1beta1.EC2NodeClass) in.ObjectMeta = v1beta1enc.ObjectMeta + in.Annotations = lo.OmitByKeys(in.Annotations, []string{AnnotationAliasVersionCompatibilityKey}) switch lo.FromPtr(v1beta1enc.Spec.AMIFamily) { case AMIFamilyAL2, AMIFamilyAL2023, AMIFamilyBottlerocket, AMIFamilyWindows2019, AMIFamilyWindows2022: @@ -135,7 +147,11 @@ func (in *EC2NodeClass) ConvertFrom(ctx context.Context, from apis.Convertible) if len(v1beta1enc.Spec.AMISelectorTerms) == 0 { in.Spec.AMIFamily = nil in.Spec.AMISelectorTerms = []AMISelectorTerm{{ - Alias: fmt.Sprintf("%s@latest", strings.ToLower(lo.FromPtr(v1beta1enc.Spec.AMIFamily))), + Alias: fmt.Sprintf( + "%s@%s", + strings.ToLower(lo.FromPtr(v1beta1enc.Spec.AMIFamily)), + lo.ValueOr(v1beta1enc.Annotations, AnnotationAliasVersionCompatibilityKey, "latest"), + ), }} } else { in.Spec.AMIFamily = v1beta1enc.Spec.AMIFamily diff --git a/pkg/apis/v1/ec2nodeclass_conversion_test.go b/pkg/apis/v1/ec2nodeclass_conversion_test.go index 4c25eec22ca7..a598e72f030b 100644 --- a/pkg/apis/v1/ec2nodeclass_conversion_test.go +++ b/pkg/apis/v1/ec2nodeclass_conversion_test.go @@ -121,6 +121,12 @@ var _ = Describe("Convert v1 to v1beta1 EC2NodeClass API", func() { Expect(v1ec2nodeclass.ConvertTo(ctx, v1beta1ec2nodeclass)).To(Succeed()) Expect(lo.FromPtr(v1beta1ec2nodeclass.Spec.AMIFamily)).To(Equal(v1beta1.AMIFamilyAL2023)) }) + It("should convert v1 ec2nodeclass alias (pinned)", func() { + v1ec2nodeclass.Spec.AMISelectorTerms = []AMISelectorTerm{{Alias: "al2023@v20240807"}} + Expect(v1ec2nodeclass.ConvertTo(ctx, v1beta1ec2nodeclass)).To(Succeed()) + Expect(lo.FromPtr(v1beta1ec2nodeclass.Spec.AMIFamily)).To(Equal(v1beta1.AMIFamilyAL2023)) + Expect(v1beta1ec2nodeclass.Annotations).To(HaveKeyWithValue(AnnotationAliasVersionCompatibilityKey, "v20240807")) + }) It("should convert v1 ec2nodeclass ami selector terms with the Ubuntu compatibility annotation", func() { v1ec2nodeclass.Annotations = lo.Assign(v1ec2nodeclass.Annotations, map[string]string{ AnnotationUbuntuCompatibilityKey: fmt.Sprintf("%s,%s", AnnotationUbuntuCompatibilityAMIFamily, AnnotationUbuntuCompatibilityBlockDeviceMappings), @@ -402,6 +408,14 @@ var _ = Describe("Convert v1beta1 to v1 EC2NodeClass API", func() { Expect(v1ec2nodeclass.ConvertFrom(ctx, v1beta1ec2nodeclass)).To(Succeed()) Expect(v1ec2nodeclass.Spec.AMISelectorTerms).To(ContainElement(AMISelectorTerm{Alias: "al2023@latest"})) }) + It("should convert v1beta1 ec2nodeclass ami family (alias version annotation)", func() { + v1beta1ec2nodeclass.Spec.AMIFamily = &v1beta1.AMIFamilyAL2023 + v1beta1ec2nodeclass.Annotations = lo.Assign(v1beta1ec2nodeclass.Annotations, map[string]string{ + AnnotationAliasVersionCompatibilityKey: "v20240807", + }) + Expect(v1ec2nodeclass.ConvertFrom(ctx, v1beta1ec2nodeclass)).To(Succeed()) + Expect(v1ec2nodeclass.Spec.AMISelectorTerms).To(ContainElement(AMISelectorTerm{Alias: "al2023@v20240807"})) + }) It("should convert v1beta1 ec2nodeclass ami family with non-custom ami family and ami selector terms", func() { v1beta1ec2nodeclass.Spec.AMIFamily = &v1beta1.AMIFamilyAL2023 v1beta1ec2nodeclass.Spec.AMISelectorTerms = []v1beta1.AMISelectorTerm{{ diff --git a/pkg/apis/v1/labels.go b/pkg/apis/v1/labels.go index c391b0faab01..9ffa96c0d925 100644 --- a/pkg/apis/v1/labels.go +++ b/pkg/apis/v1/labels.go @@ -131,6 +131,8 @@ var ( AnnotationUbuntuCompatibilityAMIFamily = "amiFamily" AnnotationUbuntuCompatibilityBlockDeviceMappings = "blockDeviceMappings" + AnnotationAliasVersionCompatibilityKey = apis.CompatibilityGroup + "/v1-alias-version" + TagNodeClaim = coreapis.Group + "/nodeclaim" TagManagedLaunchTemplate = apis.Group + "/cluster" TagName = "Name"