@@ -38,13 +38,17 @@ import (
38
38
"k8s.io/apimachinery/pkg/util/sets"
39
39
"k8s.io/apimachinery/pkg/util/uuid"
40
40
"k8s.io/apimachinery/pkg/util/wait"
41
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
41
42
"k8s.io/client-go/tools/record"
43
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
42
44
pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
43
45
watcherapi "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
46
+ "k8s.io/kubernetes/pkg/features"
44
47
"k8s.io/kubernetes/pkg/kubelet/checkpointmanager"
45
48
"k8s.io/kubernetes/pkg/kubelet/cm/containermap"
46
49
"k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint"
47
50
plugin "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/plugin/v1beta1"
51
+ "k8s.io/kubernetes/pkg/kubelet/cm/resourceupdates"
48
52
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
49
53
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
50
54
"k8s.io/kubernetes/pkg/kubelet/config"
@@ -1953,3 +1957,76 @@ func sortContainerStatuses(statuses []v1.ContainerStatus) {
1953
1957
}
1954
1958
}
1955
1959
}
1960
+
1961
+ func TestFeatureGateResourceHealthStatus (t * testing.T ) {
1962
+ tmpDir , err := os .MkdirTemp ("" , "checkpoint" )
1963
+ require .NoError (t , err , "err should be nil" )
1964
+ defer func () {
1965
+ err = os .RemoveAll (tmpDir )
1966
+ if err != nil {
1967
+ t .Fatalf ("Fail to remove tmpdir: %v" , err )
1968
+ }
1969
+ }()
1970
+ ckm , err := checkpointmanager .NewCheckpointManager (tmpDir )
1971
+ require .NoError (t , err , "err should be nil" )
1972
+ resourceName := "domain1.com/resource1"
1973
+ existDevices := map [string ]DeviceInstances {
1974
+ resourceName : map [string ]pluginapi.Device {
1975
+ "dev1" : {
1976
+ ID : "dev1" ,
1977
+ Health : pluginapi .Healthy ,
1978
+ },
1979
+ "dev2" : {
1980
+ ID : "dev2" ,
1981
+ Health : pluginapi .Unhealthy ,
1982
+ },
1983
+ },
1984
+ }
1985
+ testManager := & ManagerImpl {
1986
+ allDevices : ResourceDeviceInstances (existDevices ),
1987
+ endpoints : make (map [string ]endpointInfo ),
1988
+ healthyDevices : make (map [string ]sets.Set [string ]),
1989
+ unhealthyDevices : make (map [string ]sets.Set [string ]),
1990
+ allocatedDevices : make (map [string ]sets.Set [string ]),
1991
+ podDevices : newPodDevices (),
1992
+ checkpointManager : ckm ,
1993
+ update : make (chan resourceupdates.Update ),
1994
+ }
1995
+
1996
+ podID := "pod1"
1997
+ contID := "con1"
1998
+ devices := checkpoint.DevicesPerNUMA {0 : []string {"dev1" }, 1 : []string {"dev1" }}
1999
+
2000
+ testManager .podDevices .insert (podID , contID , resourceName ,
2001
+ devices ,
2002
+ newContainerAllocateResponse (
2003
+ withDevices (map [string ]string {"/dev/r1dev1" : "/dev/r1dev1" , "/dev/r1dev2" : "/dev/r1dev2" }),
2004
+ withMounts (map [string ]string {"/home/r1lib1" : "/usr/r1lib1" }),
2005
+ ),
2006
+ )
2007
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .ResourceHealthStatus , true )
2008
+
2009
+ testManager .genericDeviceUpdateCallback (resourceName , []pluginapi.Device {
2010
+ {ID : "dev1" , Health : pluginapi .Healthy },
2011
+ {ID : "dev2" , Health : pluginapi .Unhealthy },
2012
+ })
2013
+ // update chan no data
2014
+ assert .Empty (t , len (testManager .update ), 0 )
2015
+
2016
+ // update chan receive pod1
2017
+ var wg sync.WaitGroup
2018
+ go func () {
2019
+ defer wg .Done ()
2020
+ u := <- testManager .update
2021
+ assert .Equal (t , resourceupdates.Update {
2022
+ PodUIDs : []string {"pod1" },
2023
+ }, u )
2024
+ }()
2025
+ wg .Add (1 )
2026
+ testManager .genericDeviceUpdateCallback (resourceName , []pluginapi.Device {
2027
+ {ID : "dev1" , Health : pluginapi .Unhealthy },
2028
+ {ID : "dev2" , Health : pluginapi .Healthy },
2029
+ })
2030
+ wg .Wait ()
2031
+
2032
+ }
0 commit comments