@@ -62,6 +62,9 @@ var nodeClass *v1.EC2NodeClass
62
62
var nodeClaim * karpv1.NodeClaim
63
63
var node * corev1.Node
64
64
65
+ var standardAMI v1.AMI
66
+ var nvidiaAMI v1.AMI
67
+
65
68
func TestAWS (t * testing.T ) {
66
69
ctx = TestContextWithLogger (t )
67
70
RegisterFailHandler (Fail )
@@ -101,6 +104,37 @@ var _ = BeforeEach(func() {
101
104
})
102
105
Expect (awsEnv .InstanceTypesProvider .UpdateInstanceTypes (ctx )).To (Succeed ())
103
106
Expect (awsEnv .InstanceTypesProvider .UpdateInstanceTypeOfferings (ctx )).To (Succeed ())
107
+ standardAMI = v1.AMI {
108
+ Name : "standard-ami" ,
109
+ ID : "ami-standard-test" ,
110
+ Requirements : []corev1.NodeSelectorRequirement {
111
+ {
112
+ Key : corev1 .LabelArchStable ,
113
+ Operator : corev1 .NodeSelectorOpIn ,
114
+ Values : []string {karpv1 .ArchitectureAmd64 },
115
+ },
116
+ {
117
+ Key : v1 .LabelInstanceGPUCount ,
118
+ Operator : corev1 .NodeSelectorOpDoesNotExist ,
119
+ },
120
+ },
121
+ }
122
+ nvidiaAMI = v1.AMI {
123
+ Name : "nvidia-ami" ,
124
+ ID : "ami-nvidia-test" ,
125
+ Requirements : []corev1.NodeSelectorRequirement {
126
+ {
127
+ Key : corev1 .LabelArchStable ,
128
+ Operator : corev1 .NodeSelectorOpIn ,
129
+ Values : []string {karpv1 .ArchitectureAmd64 },
130
+ },
131
+ {
132
+ Key : v1 .LabelInstanceGPUCount ,
133
+ Operator : corev1 .NodeSelectorOpExists ,
134
+ },
135
+ },
136
+ }
137
+ nodeClass .Status .AMIs = []v1.AMI {standardAMI , nvidiaAMI }
104
138
})
105
139
106
140
var _ = AfterEach (func () {
@@ -118,6 +152,7 @@ var _ = Describe("CapacityCache", func() {
118
152
corev1 .LabelInstanceTypeStable : "t3.medium" ,
119
153
karpv1 .NodeRegisteredLabelKey : "true" ,
120
154
"karpenter.k8s.aws/ec2nodeclass" : nodeClass .Name ,
155
+ corev1 .LabelArchStable : karpv1 .ArchitectureAmd64 ,
121
156
},
122
157
},
123
158
Capacity : corev1.ResourceList {
@@ -174,4 +209,62 @@ var _ = Describe("CapacityCache", func() {
174
209
mem .Sub (resource .MustParse (fmt .Sprintf ("%dMi" , int64 (math .Ceil (float64 (mem .Value ())* options .FromContext (ctx ).VMMemoryOverheadPercent / 1024 / 1024 )))))
175
210
Expect (i .Capacity .Memory ().Value ()).To (Equal (mem .Value ()), "Expected capacity to match VMMemoryOverheadPercent calculation" )
176
211
})
212
+
213
+ It ("should properly update discovered capacity when matching AMI is not the first in the list" , func () {
214
+ // Update nodeClass AMIs for this test
215
+ nodeClass .Status .AMIs = []v1.AMI {standardAMI }
216
+ ExpectApplied (ctx , env .Client , nodeClass )
217
+
218
+ // Get available instance types from the test environment
219
+ availableInstanceTypes , err := awsEnv .InstanceTypesProvider .List (ctx , nodeClass )
220
+ Expect (err ).To (BeNil ())
221
+ Expect (availableInstanceTypes ).ToNot (BeEmpty (), "No instance types available in test environment" )
222
+
223
+ // Choose the first instance type for testing
224
+ testInstanceType := availableInstanceTypes [0 ]
225
+ instanceTypeName := testInstanceType .Name
226
+
227
+ // Create a test node with the discovered instance type
228
+ memoryCapacity := resource .MustParse ("4Gi" )
229
+
230
+ testNodeClassNvidiaFirst := test .EC2NodeClass ()
231
+ testNodeClassNvidiaFirst .Status .AMIs = []v1.AMI {nvidiaAMI , standardAMI }
232
+ ExpectApplied (ctx , env .Client , testNodeClassNvidiaFirst )
233
+
234
+ testNodeClaim := coretest .NodeClaim ()
235
+ testNodeClaim .Spec .NodeClassRef = & karpv1.NodeClassReference {
236
+ Group : object .GVK (testNodeClassNvidiaFirst ).Group ,
237
+ Kind : object .GVK (testNodeClassNvidiaFirst ).Kind ,
238
+ Name : testNodeClassNvidiaFirst .Name ,
239
+ }
240
+ testNodeClaim .Status .Capacity = corev1.ResourceList {
241
+ corev1 .ResourceMemory : memoryCapacity ,
242
+ }
243
+ testNodeClaim .Labels [corev1 .LabelInstanceTypeStable ] = instanceTypeName
244
+ testNodeClaim .Labels [corev1 .LabelArchStable ] = karpv1 .ArchitectureAmd64
245
+ testNodeClaim .Status .ImageID = "ami-standard-test"
246
+ ExpectApplied (ctx , env .Client , testNodeClaim )
247
+
248
+ testNode := coretest .NodeClaimLinkedNode (testNodeClaim )
249
+ ExpectApplied (ctx , env .Client , testNode )
250
+
251
+ ExpectObjectReconciled (ctx , env .Client , controller , testNode )
252
+
253
+ // Verify that the cache was updated by getting the instance types and checking the memory capacity
254
+ instanceTypesAfterUpdateReversed , err := awsEnv .InstanceTypesProvider .List (ctx , testNodeClassNvidiaFirst )
255
+ Expect (err ).To (BeNil ())
256
+
257
+ // Find our instance type and verify its memory capacity was updated
258
+ found := false
259
+ for _ , it := range instanceTypesAfterUpdateReversed {
260
+ if it .Name == instanceTypeName {
261
+ found = true
262
+ // Memory capacity should now match what we set on the node
263
+ memValue := it .Capacity .Memory ().Value ()
264
+ Expect (memValue ).To (Equal (memoryCapacity .Value ()))
265
+ break
266
+ }
267
+ }
268
+ Expect (found ).To (BeTrue ())
269
+ })
177
270
})
0 commit comments