Skip to content

Commit b7c02b3

Browse files
authored
fix: Add exact match check to use specified addon versions (#8510)
1 parent 5b7cb21 commit b7c02b3

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

pkg/actions/addon/addon.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,17 @@ func (a *Manager) getLatestMatchingVersion(ctx context.Context, addon *api.Addon
122122
continue
123123
}
124124

125-
v, err := a.parseVersion(*addonVersionInfo.AddonVersion)
126-
if err != nil {
127-
return "", false, err
125+
// Check for exact match first - return immediately if found
126+
if *addonVersionInfo.AddonVersion == addonVersion {
127+
return *addonVersionInfo.AddonVersion, addonVersionInfo.RequiresIamPermissions, nil
128128
}
129129

130+
// If no exact match, collect versions for "latest" or partial matching
130131
if addonVersion == "latest" || strings.Contains(*addonVersionInfo.AddonVersion, addonVersion) {
132+
v, err := a.parseVersion(*addonVersionInfo.AddonVersion)
133+
if err != nil {
134+
return "", false, err
135+
}
131136
versions = append(versions, v)
132137
}
133138
}

pkg/actions/addon/update_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ var _ = Describe("Update", func() {
8585
{
8686
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
8787
},
88+
{
89+
// This version would be incorrectly selected by old logic when user requests v1.0.0-eksbuild.2
90+
AddonVersion: aws.String("v1.0.0-eksbuild.20"),
91+
},
8892
},
8993
},
9094
},
@@ -204,6 +208,61 @@ var _ = Describe("Update", func() {
204208
Expect(err).To(MatchError(ContainSubstring("no version(s) found matching \"1.7.8\" for \"my-addon\"")))
205209
})
206210
})
211+
212+
When("the version selection prioritizes exact matches", func() {
213+
It("should select exact match v1.0.0-eksbuild.2 over partial match v1.0.0-eksbuild.20", func() {
214+
// This test demonstrates the fix for the version selection bug
215+
// where strings.Contains("v1.0.0-eksbuild.20", "v1.0.0-eksbuild.2") returns true
216+
// causing the wrong version to be selected
217+
err := addonManager.Update(context.Background(), &api.Addon{
218+
Name: "my-addon",
219+
Version: "v1.0.0-eksbuild.2", // User requests exact version
220+
}, &podIdentityIAMUpdater, 0)
221+
222+
Expect(err).NotTo(HaveOccurred())
223+
Expect(*describeAddonInput.ClusterName).To(Equal("my-cluster"))
224+
Expect(*describeAddonInput.AddonName).To(Equal("my-addon"))
225+
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
226+
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))
227+
// The key assertion: should select exact match, not v1.0.0-eksbuild.20
228+
Expect(*updateAddonInput.AddonVersion).To(Equal("v1.0.0-eksbuild.2"))
229+
Expect(*updateAddonInput.ServiceAccountRoleArn).To(Equal("original-arn"))
230+
})
231+
232+
It("should select exact match v1.0.0-eksbuild.20 when specifically requested", func() {
233+
// This test ensures that v1.0.0-eksbuild.20 can still be selected when explicitly requested
234+
err := addonManager.Update(context.Background(), &api.Addon{
235+
Name: "my-addon",
236+
Version: "v1.0.0-eksbuild.20", // User requests this specific version
237+
}, &podIdentityIAMUpdater, 0)
238+
239+
Expect(err).NotTo(HaveOccurred())
240+
Expect(*describeAddonInput.ClusterName).To(Equal("my-cluster"))
241+
Expect(*describeAddonInput.AddonName).To(Equal("my-addon"))
242+
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
243+
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))
244+
// Should select the exact version requested
245+
Expect(*updateAddonInput.AddonVersion).To(Equal("v1.0.0-eksbuild.20"))
246+
Expect(*updateAddonInput.ServiceAccountRoleArn).To(Equal("original-arn"))
247+
})
248+
249+
It("should still support partial matching when no exact match exists", func() {
250+
// This test ensures partial matching still works for legitimate use cases
251+
err := addonManager.Update(context.Background(), &api.Addon{
252+
Name: "my-addon",
253+
Version: "v1.0.0-eksbuild", // Partial match - should find highest matching version
254+
}, &podIdentityIAMUpdater, 0)
255+
256+
Expect(err).NotTo(HaveOccurred())
257+
Expect(*describeAddonInput.ClusterName).To(Equal("my-cluster"))
258+
Expect(*describeAddonInput.AddonName).To(Equal("my-addon"))
259+
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
260+
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))
261+
// Should select the highest version among partial matches (v1.0.0-eksbuild.20)
262+
Expect(*updateAddonInput.AddonVersion).To(Equal("v1.0.0-eksbuild.20"))
263+
Expect(*updateAddonInput.ServiceAccountRoleArn).To(Equal("original-arn"))
264+
})
265+
})
207266
})
208267

209268
When("wait is true", func() {

0 commit comments

Comments
 (0)