@@ -85,6 +85,10 @@ var _ = Describe("Update", func() {
85
85
{
86
86
AddonVersion : aws .String ("v1.0.0-eksbuild.2" ),
87
87
},
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
+ },
88
92
},
89
93
},
90
94
},
@@ -204,6 +208,61 @@ var _ = Describe("Update", func() {
204
208
Expect (err ).To (MatchError (ContainSubstring ("no version(s) found matching \" 1.7.8\" for \" my-addon\" " )))
205
209
})
206
210
})
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
+ })
207
266
})
208
267
209
268
When ("wait is true" , func () {
0 commit comments