Skip to content

Commit

Permalink
fix: ensure alias version isn't dropped round-trip (aws#6777)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmdeal committed Sep 13, 2024
1 parent a723318 commit e3ac507
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 4 deletions.
18 changes: 17 additions & 1 deletion pkg/apis/v1/ec2nodeclass_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -123,6 +134,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:
Expand All @@ -131,7 +143,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
Expand Down
14 changes: 14 additions & 0 deletions pkg/apis/v1/ec2nodeclass_conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,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.AMIFamilyAL2))
})
It("should convert v1 ec2nodeclass alias (pinned)", func() {
v1ec2nodeclass.Spec.AMISelectorTerms = []AMISelectorTerm{{Alias: "al2@v20240807"}}
Expect(v1ec2nodeclass.ConvertTo(ctx, v1beta1ec2nodeclass)).To(Succeed())
Expect(lo.FromPtr(v1beta1ec2nodeclass.Spec.AMIFamily)).To(Equal(v1beta1.AMIFamilyAL2))
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),
Expand Down Expand Up @@ -375,6 +381,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: "al2@latest"}))
})
It("should convert v1beta1 ec2nodeclass ami family (alias version annotation)", func() {
v1beta1ec2nodeclass.Spec.AMIFamily = &v1beta1.AMIFamilyAL2
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: "al2@v20240807"}))
})
It("should convert v1beta1 ec2nodeclass ami family with non-custom ami family and ami selector terms", func() {
v1beta1ec2nodeclass.Spec.AMIFamily = &v1beta1.AMIFamilyAL2
v1beta1ec2nodeclass.Spec.AMISelectorTerms = []v1beta1.AMISelectorTerm{{
Expand Down
8 changes: 5 additions & 3 deletions pkg/apis/v1/labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@ var (
AnnotationUbuntuCompatibilityAMIFamily = "amiFamily"
AnnotationUbuntuCompatibilityBlockDeviceMappings = "blockDeviceMappings"

TagNodeClaim = karpv1.Group + "/nodeclaim"
TagManagedLaunchTemplate = Group + "/cluster"
TagName = "Name"
TagNodeClaim = karpv1.Group + "/nodeclaim"
TagManagedLaunchTemplate = Group + "/cluster"
AnnotationAliasVersionCompatibilityKey = CompatibilityGroup + "/v1-alias-version"

TagName = "Name"
)

0 comments on commit e3ac507

Please sign in to comment.