@@ -32,6 +32,10 @@ import (
3232 schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework"
3333)
3434
35+ var (
36+ cacheTtl = 1 * time .Second
37+ )
38+
3539func TestGetNodeInfosForGroups (t * testing.T ) {
3640 now := time .Now ()
3741 ready1 := BuildTestNode ("n1" , 1000 , 1000 )
@@ -81,7 +85,7 @@ func TestGetNodeInfosForGroups(t *testing.T) {
8185 ListerRegistry : registry ,
8286 },
8387 }
84- res , err := NewMixedTemplateNodeInfoProvider ().Process (& ctx , []* apiv1.Node {justReady5 , unready4 , unready3 , ready2 , ready1 }, []* appsv1.DaemonSet {}, nil , now )
88+ res , err := NewMixedTemplateNodeInfoProvider (& cacheTtl ).Process (& ctx , []* apiv1.Node {justReady5 , unready4 , unready3 , ready2 , ready1 }, []* appsv1.DaemonSet {}, nil , now )
8589 assert .NoError (t , err )
8690 assert .Equal (t , 5 , len (res ))
8791 info , found := res ["ng1" ]
@@ -108,7 +112,7 @@ func TestGetNodeInfosForGroups(t *testing.T) {
108112 ListerRegistry : registry ,
109113 },
110114 }
111- res , err = NewMixedTemplateNodeInfoProvider ().Process (& ctx , []* apiv1.Node {}, []* appsv1.DaemonSet {}, nil , now )
115+ res , err = NewMixedTemplateNodeInfoProvider (& cacheTtl ).Process (& ctx , []* apiv1.Node {}, []* appsv1.DaemonSet {}, nil , now )
112116 assert .NoError (t , err )
113117 assert .Equal (t , 0 , len (res ))
114118}
@@ -167,7 +171,7 @@ func TestGetNodeInfosForGroupsCache(t *testing.T) {
167171 ListerRegistry : registry ,
168172 },
169173 }
170- niProcessor := NewMixedTemplateNodeInfoProvider ()
174+ niProcessor := NewMixedTemplateNodeInfoProvider (& cacheTtl )
171175 res , err := niProcessor .Process (& ctx , []* apiv1.Node {unready4 , unready3 , ready2 , ready1 }, []* appsv1.DaemonSet {}, nil , now )
172176 assert .NoError (t , err )
173177 // Check results
@@ -187,10 +191,10 @@ func TestGetNodeInfosForGroupsCache(t *testing.T) {
187191 // Check cache
188192 cachedInfo , found := niProcessor .nodeInfoCache ["ng1" ]
189193 assert .True (t , found )
190- assertEqualNodeCapacities (t , ready1 , cachedInfo .Node ())
194+ assertEqualNodeCapacities (t , ready1 , cachedInfo .nodeInfo . Node ())
191195 cachedInfo , found = niProcessor .nodeInfoCache ["ng2" ]
192196 assert .True (t , found )
193- assertEqualNodeCapacities (t , ready2 , cachedInfo .Node ())
197+ assertEqualNodeCapacities (t , ready2 , cachedInfo .nodeInfo . Node ())
194198 cachedInfo , found = niProcessor .nodeInfoCache ["ng3" ]
195199 assert .False (t , found )
196200 cachedInfo , found = niProcessor .nodeInfoCache ["ng4" ]
@@ -216,14 +220,14 @@ func TestGetNodeInfosForGroupsCache(t *testing.T) {
216220 // Check cache
217221 cachedInfo , found = niProcessor .nodeInfoCache ["ng2" ]
218222 assert .True (t , found )
219- assertEqualNodeCapacities (t , ready2 , cachedInfo .Node ())
223+ assertEqualNodeCapacities (t , ready2 , cachedInfo .nodeInfo . Node ())
220224 cachedInfo , found = niProcessor .nodeInfoCache ["ng4" ]
221225 assert .False (t , found )
222226
223227 // Fill cache manually
224228 infoNg4Node6 := schedulerframework .NewNodeInfo ()
225229 infoNg4Node6 .SetNode (ready6 .DeepCopy ())
226- niProcessor .nodeInfoCache = map [string ]* schedulerframework. NodeInfo {"ng4" : infoNg4Node6 }
230+ niProcessor .nodeInfoCache = map [string ]cacheItem {"ng4" : { nodeInfo : infoNg4Node6 , added : now } }
227231 res , err = niProcessor .Process (& ctx , []* apiv1.Node {unready4 , unready3 , ready2 , ready1 }, []* appsv1.DaemonSet {}, nil , now )
228232 // Check if cache was used
229233 assert .NoError (t , err )
@@ -236,6 +240,55 @@ func TestGetNodeInfosForGroupsCache(t *testing.T) {
236240 assertEqualNodeCapacities (t , ready6 , info .Node ())
237241}
238242
243+ func TestGetNodeInfosCacheExpired (t * testing.T ) {
244+ now := time .Now ()
245+ ready1 := BuildTestNode ("n1" , 1000 , 1000 )
246+ SetNodeReadyState (ready1 , true , now .Add (- 2 * time .Minute ))
247+
248+ // Cloud provider with TemplateNodeInfo not implemented.
249+ provider := testprovider .NewTestAutoprovisioningCloudProvider (nil , nil , nil , nil , nil , nil )
250+ podLister := kube_util .NewTestPodLister ([]* apiv1.Pod {})
251+ registry := kube_util .NewListerRegistry (nil , nil , podLister , nil , nil , nil , nil , nil , nil , nil )
252+ predicateChecker , err := simulator .NewTestPredicateChecker ()
253+ assert .NoError (t , err )
254+
255+ ctx := context.AutoscalingContext {
256+ CloudProvider : provider ,
257+ PredicateChecker : predicateChecker ,
258+ AutoscalingKubeClients : context.AutoscalingKubeClients {
259+ ListerRegistry : registry ,
260+ },
261+ }
262+ tn := BuildTestNode ("tn" , 5000 , 5000 )
263+ tni := schedulerframework .NewNodeInfo ()
264+ tni .SetNode (tn )
265+ // Cache expire time is set.
266+ niProcessor1 := NewMixedTemplateNodeInfoProvider (& cacheTtl )
267+ niProcessor1 .nodeInfoCache = map [string ]cacheItem {
268+ "ng1" : {nodeInfo : tni , added : now .Add (- 2 * time .Second )},
269+ "ng2" : {nodeInfo : tni , added : now .Add (- 2 * time .Second )},
270+ }
271+ provider .AddNodeGroup ("ng1" , 1 , 10 , 1 )
272+ provider .AddNode ("ng1" , ready1 )
273+
274+ assert .Equal (t , 2 , len (niProcessor1 .nodeInfoCache ))
275+ _ , err = niProcessor1 .Process (& ctx , []* apiv1.Node {ready1 }, []* appsv1.DaemonSet {}, nil , now )
276+ assert .NoError (t , err )
277+ assert .Equal (t , 1 , len (niProcessor1 .nodeInfoCache ))
278+
279+ // Cache expire time isn't set.
280+ niProcessor2 := NewMixedTemplateNodeInfoProvider (nil )
281+ niProcessor2 .nodeInfoCache = map [string ]cacheItem {
282+ "ng1" : {nodeInfo : tni , added : now .Add (- 2 * time .Second )},
283+ "ng2" : {nodeInfo : tni , added : now .Add (- 2 * time .Second )},
284+ }
285+ assert .Equal (t , 2 , len (niProcessor2 .nodeInfoCache ))
286+ _ , err = niProcessor1 .Process (& ctx , []* apiv1.Node {ready1 }, []* appsv1.DaemonSet {}, nil , now )
287+ assert .NoError (t , err )
288+ assert .Equal (t , 2 , len (niProcessor2 .nodeInfoCache ))
289+
290+ }
291+
239292func assertEqualNodeCapacities (t * testing.T , expected , actual * apiv1.Node ) {
240293 t .Helper ()
241294 assert .NotEqual (t , actual .Status , nil , "" )
0 commit comments