@@ -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