Skip to content

Commit 1c42748

Browse files
committed
Fix DRATestDriver readiness passing with zero pods and slices.
Wait for WorkerNodeCount driver DaemonSet pods and ResourceSlices before FastFill starts, instead of treating unset status as ready.
1 parent d14a402 commit 1c42748

1 file changed

Lines changed: 34 additions & 56 deletions

File tree

  • clusterloader2/pkg/dependency/dra

clusterloader2/pkg/dependency/dra/dra.go

Lines changed: 34 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ import (
2020
"context"
2121
"embed"
2222
"fmt"
23-
"strings"
2423
"time"
2524

26-
corev1 "k8s.io/api/core/v1"
2725
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2826
"k8s.io/apimachinery/pkg/util/wait"
2927
"k8s.io/klog/v2"
@@ -36,7 +34,7 @@ const (
3634
draDependencyName = "DRATestDriver"
3735
draNamespace = "dra-example-driver"
3836
draManifests = "dra-example-driver"
39-
defaultWorkerNodeCount = "100"
37+
defaultWorkerNodeCount = 100
4038
draDaemonsetName = "dra-example-driver-kubeletplugin"
4139
checkDRAReadyInterval = 30 * time.Second
4240
defaultDRATimeout = 10 * time.Minute
@@ -79,9 +77,14 @@ func (d *draDependency) Setup(config *dependency.Config) error {
7977
return err
8078
}
8179

80+
workerCount, err := getWorkerCount(config)
81+
if err != nil {
82+
return err
83+
}
84+
8285
mapping := map[string]interface{}{
8386
"Namespace": namespace,
84-
"WorkerNodeCount": getWorkerCount(config),
87+
"WorkerNodeCount": workerCount,
8588
"ImageRegistry": config.ClusterLoaderConfig.ImageRegistry,
8689
}
8790

@@ -131,94 +134,69 @@ func (d *draDependency) Teardown(config *dependency.Config) error {
131134
}
132135

133136
func (d *draDependency) waitForDRADriverToBeHealthy(config *dependency.Config, timeout time.Duration, daemonsetName string, namespace string) error {
137+
var desiredCount int32
134138
if err := wait.PollImmediate(
135139
checkDRAReadyInterval,
136140
timeout,
137141
func() (done bool, err error) {
138-
return d.isDRADriverReady(config, daemonsetName, namespace)
142+
ready, desired, pollErr := d.isDRADriverReady(config, daemonsetName, namespace)
143+
if pollErr != nil {
144+
return false, pollErr
145+
}
146+
desiredCount = desired
147+
return ready, nil
139148
}); err != nil {
140149
return err
141150
}
142151
if err := wait.PollImmediate(
143152
checkDRAReadyInterval,
144153
timeout,
145154
func() (done bool, err error) {
146-
return isResourceSlicesPublished(config, namespace)
155+
return isResourceSlicesPublished(config, int(desiredCount))
147156
}); err != nil {
148157
return err
149158
}
150159
return nil
151160
}
152161

153-
func (d *draDependency) isDRADriverReady(config *dependency.Config, daemonsetName string, namespace string) (done bool, err error) {
162+
func (d *draDependency) isDRADriverReady(config *dependency.Config, daemonsetName string, namespace string) (ready bool, desired int32, err error) {
154163
ds, err := config.ClusterFramework.GetClientSets().
155164
GetClient().
156165
AppsV1().
157166
DaemonSets(namespace).
158167
Get(context.Background(), daemonsetName, metav1.GetOptions{})
159168
if err != nil {
160-
return false, fmt.Errorf("failed to get %s: %v", daemonsetName, err)
161-
}
162-
ready := ds.Status.NumberReady == ds.Status.DesiredNumberScheduled
163-
if !ready {
164-
klog.V(2).Infof("%s is not ready, "+
165-
"DesiredNumberScheduled: %d, NumberReady: %d", daemonsetName, ds.Status.DesiredNumberScheduled, ds.Status.NumberReady)
169+
return false, 0, fmt.Errorf("failed to get %s: %v", daemonsetName, err)
166170
}
167-
return ready, nil
168-
}
169171

170-
func isResourceSlicesPublished(config *dependency.Config, namespace string) (bool, error) {
171-
// Get a list of all nodes
172-
// nodes, err := getReadyNodesCount(config)
173-
// if err != nil {
174-
// return false, fmt.Errorf("failed to list nodes: %v", err)
175-
// }
176-
177-
driverPluginPods, err := getDriverPluginPods(config, namespace, draDaemonsetName)
178-
if err != nil {
179-
return false, fmt.Errorf("failed to list driverPluginPods: %v", err)
172+
if ds.Status.DesiredNumberScheduled == 0 {
173+
klog.V(2).Infof("%s is not ready, DesiredNumberScheduled is 0", daemonsetName)
174+
return false, 0, nil
180175
}
176+
if ds.Status.NumberReady != ds.Status.DesiredNumberScheduled {
177+
klog.V(2).Infof("%s is not ready, DesiredNumberScheduled: %d, NumberReady: %d",
178+
daemonsetName, ds.Status.DesiredNumberScheduled, ds.Status.NumberReady)
179+
return false, ds.Status.DesiredNumberScheduled, nil
180+
}
181+
return true, ds.Status.DesiredNumberScheduled, nil
182+
}
181183

182-
workerCount := driverPluginPods
183-
184+
func isResourceSlicesPublished(config *dependency.Config, expected int) (bool, error) {
184185
resourceSlices, err := config.ClusterFramework.GetClientSets().GetClient().ResourceV1().ResourceSlices().List(context.Background(), metav1.ListOptions{})
185186
if err != nil {
186187
return false, fmt.Errorf("failed to list resourceslices: %v", err)
187188
}
188-
if len(resourceSlices.Items) != workerCount {
189-
klog.V(2).Infof("waiting for resourceslices to be available, "+
190-
"DesiredResourceSliceCount: %d, NumberResourceSlicesAvailable: %d", workerCount, len(resourceSlices.Items))
189+
if len(resourceSlices.Items) < expected {
190+
klog.V(2).Infof("waiting for resourceslices to be available, expected: %d, available: %d",
191+
expected, len(resourceSlices.Items))
191192
return false, nil
192193
}
194+
klog.V(2).Infof("resourceslices ready, expected: %d, available: %d", expected, len(resourceSlices.Items))
193195
return true, nil
194196
}
195197

196-
func getDriverPluginPods(config *dependency.Config, namespace string, namePrefix string) (int, error) {
197-
pods, err := config.ClusterFramework.GetClientSets().GetClient().CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{})
198-
if err != nil {
199-
return 0, fmt.Errorf("failed to list pods in namespace %s: %w", namespace, err)
200-
}
201-
202-
runningPods := 0
203-
for _, pod := range pods.Items {
204-
if !strings.HasPrefix(pod.Name, namePrefix) {
205-
continue
206-
}
207-
208-
if pod.Status.Phase == corev1.PodRunning {
209-
runningPods++
210-
}
211-
}
212-
213-
return runningPods, nil
214-
}
215-
216-
func getWorkerCount(config *dependency.Config) interface{} {
217-
workerCount, ok := config.Params["WorkerNodeCount"]
218-
if !ok {
219-
workerCount = defaultWorkerNodeCount
220-
}
221-
return workerCount
198+
func getWorkerCount(config *dependency.Config) (int, error) {
199+
return util.GetIntOrDefault(config.Params, "WorkerNodeCount", defaultWorkerNodeCount)
222200
}
223201

224202
func getNamespace(config *dependency.Config) (string, error) {

0 commit comments

Comments
 (0)