@@ -22,6 +22,7 @@ import (
2222 "fmt"
2323 "time"
2424
25+ corev1 "k8s.io/api/core/v1"
2526 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627 "k8s.io/apimachinery/pkg/util/wait"
2728 "k8s.io/klog/v2"
@@ -31,16 +32,16 @@ import (
3132)
3233
3334const (
34- draDependencyName = "DRATestDriver"
35- //TODO: this needs to be converted into a parameter. Will will not need this until parititionable devices test
35+ draDependencyName = "DRATestDriver"
3636 draNamespace = "dra-example-driver"
37+ draManifests = "manifests/*.yaml"
3738 defaultWorkerNodeCount = "100"
3839 draDaemonsetName = "dra-example-driver-kubeletplugin"
3940 checkDRAReadyInterval = 30 * time .Second
4041 defaultDRATimeout = 10 * time .Minute
4142)
4243
43- //go:embed manifests/*.yaml
44+ //go:embed manifests/**/* .yaml
4445var manifestsFS embed.FS
4546
4647func init () {
@@ -57,13 +58,24 @@ type draDependency struct{}
5758
5859func (d * draDependency ) Setup (config * dependency.Config ) error {
5960 klog .V (2 ).Infof ("%s: Installing DRA example driver" , d )
60- if err := client .CreateNamespace (config .ClusterFramework .GetClientSets ().GetClient (), draNamespace ); err != nil {
61- return fmt .Errorf ("namespace %s creation error: %v" , draNamespace , err )
61+
62+ namespace , err := getNamespace (config )
63+ if err != nil {
64+ return err
6265 }
6366
64- namespace , ok := config .Params ["Namespace" ]
65- if ! ok {
66- namespace = draNamespace
67+ if err := client .CreateNamespace (config .ClusterFramework .GetClientSets ().GetClient (), namespace ); err != nil {
68+ return fmt .Errorf ("namespace %s creation error: %v" , namespace , err )
69+ }
70+
71+ manifests , err := getManifests (config )
72+ if err != nil {
73+ return err
74+ }
75+
76+ daemonsetName , err := getDaemonset (config )
77+ if err != nil {
78+ return err
6779 }
6880
6981 mapping := map [string ]interface {}{
@@ -72,7 +84,7 @@ func (d *draDependency) Setup(config *dependency.Config) error {
7284 }
7385 if err := config .ClusterFramework .ApplyTemplatedManifests (
7486 manifestsFS ,
75- " manifests/*.yaml" ,
87+ manifests ,
7688 mapping ,
7789 client .Retry (client .IsRetryableAPIError ),
7890 ); err != nil {
@@ -82,8 +94,8 @@ func (d *draDependency) Setup(config *dependency.Config) error {
8294 if err != nil {
8395 return err
8496 }
85- klog .V (2 ).Infof ("%s: checking if DRA driver %s is healthy" , d , draDaemonsetName )
86- if err := d .waitForDRADriverToBeHealthy (config , timeout ); err != nil {
97+ klog .V (2 ).Infof ("%s: checking if DRA driver %s is healthy" , d , daemonsetName )
98+ if err := d .waitForDRADriverToBeHealthy (config , timeout , daemonsetName , namespace ); err != nil {
8799 return err
88100 }
89101
@@ -94,25 +106,30 @@ func (d *draDependency) Setup(config *dependency.Config) error {
94106func (d * draDependency ) Teardown (config * dependency.Config ) error {
95107 klog .V (2 ).Infof ("%s: Tearing down DRA example driver" , d )
96108
109+ namespace , err := getNamespace (config )
110+ if err != nil {
111+ return err
112+ }
113+
97114 // Delete namespace (this will delete all resources in it)
98- if err := client .DeleteNamespace (config .ClusterFramework .GetClientSets ().GetClient (), draNamespace ); err != nil {
99- return fmt .Errorf ("deleting %s namespace error: %v" , draNamespace , err )
115+ if err := client .DeleteNamespace (config .ClusterFramework .GetClientSets ().GetClient (), namespace ); err != nil {
116+ return fmt .Errorf ("deleting %s namespace error: %v" , namespace , err )
100117 }
101118
102- if err := client .WaitForDeleteNamespace (config .ClusterFramework .GetClientSets ().GetClient (), draNamespace , client .DefaultNamespaceDeletionTimeout ); err != nil {
119+ if err := client .WaitForDeleteNamespace (config .ClusterFramework .GetClientSets ().GetClient (), namespace , client .DefaultNamespaceDeletionTimeout ); err != nil {
103120 return err
104121 }
105122
106123 klog .V (2 ).Infof ("%s: DRA example driver uninstalled successfully" , d )
107124 return nil
108125}
109126
110- func (d * draDependency ) waitForDRADriverToBeHealthy (config * dependency.Config , timeout time.Duration ) error {
127+ func (d * draDependency ) waitForDRADriverToBeHealthy (config * dependency.Config , timeout time.Duration , daemonsetName string , namespace string ) error {
111128 if err := wait .PollImmediate (
112129 checkDRAReadyInterval ,
113130 timeout ,
114131 func () (done bool , err error ) {
115- return d .isDRADriverReady (config )
132+ return d .isDRADriverReady (config , daemonsetName , namespace )
116133 }); err != nil {
117134 return err
118135 }
@@ -127,27 +144,33 @@ func (d *draDependency) waitForDRADriverToBeHealthy(config *dependency.Config, t
127144 return nil
128145}
129146
130- func (d * draDependency ) isDRADriverReady (config * dependency.Config ) (done bool , err error ) {
147+ func (d * draDependency ) isDRADriverReady (config * dependency.Config , daemonsetName string , namespace string ) (done bool , err error ) {
131148 ds , err := config .ClusterFramework .GetClientSets ().
132149 GetClient ().
133150 AppsV1 ().
134- DaemonSets (draNamespace ).
135- Get (context .Background (), draDaemonsetName , metav1.GetOptions {})
151+ DaemonSets (namespace ).
152+ Get (context .Background (), daemonsetName , metav1.GetOptions {})
136153 if err != nil {
137- return false , fmt .Errorf ("failed to get %s: %v" , draDaemonsetName , err )
154+ return false , fmt .Errorf ("failed to get %s: %v" , daemonsetName , err )
138155 }
139156 ready := ds .Status .NumberReady == ds .Status .DesiredNumberScheduled
140157 if ! ready {
141158 klog .V (2 ).Infof ("%s is not ready, " +
142- "DesiredNumberScheduled: %d, NumberReady: %d" , draDaemonsetName , ds .Status .DesiredNumberScheduled , ds .Status .NumberReady )
159+ "DesiredNumberScheduled: %d, NumberReady: %d" , daemonsetName , ds .Status .DesiredNumberScheduled , ds .Status .NumberReady )
143160 }
144161 return ready , nil
145162}
146163
147164func isResourceSlicesPublished (config * dependency.Config ) (bool , error ) {
148- workerCount := int (getWorkerCount (config ).(float64 ))
165+ // Get a list of all nodes
166+ nodes , err := getReadyNodesCount (config )
167+ if err != nil {
168+ return false , fmt .Errorf ("failed to list nodes: %v" , err )
169+ }
170+
171+ workerCount := nodes
149172
150- resourceSlices , err := config .ClusterFramework .GetClientSets ().GetClient ().ResourceV1beta1 ().ResourceSlices ().List (context .Background (), metav1.ListOptions {})
173+ resourceSlices , err := config .ClusterFramework .GetClientSets ().GetClient ().ResourceV1 ().ResourceSlices ().List (context .Background (), metav1.ListOptions {})
151174 if err != nil {
152175 return false , fmt .Errorf ("failed to list resourceslices: %v" , err )
153176 }
@@ -159,6 +182,25 @@ func isResourceSlicesPublished(config *dependency.Config) (bool, error) {
159182 return true , nil
160183}
161184
185+ func getReadyNodesCount (config * dependency.Config ) (int , error ) {
186+ // Get a list of all nodes
187+ nodes , err := config .ClusterFramework .GetClientSets ().GetClient ().CoreV1 ().Nodes ().List (context .Background (), metav1.ListOptions {})
188+ if err != nil {
189+ return 0 , fmt .Errorf ("failed to list nodes: %v" , err )
190+ }
191+
192+ readyNodes := 0
193+ for _ , node := range nodes .Items {
194+ for _ , condition := range node .Status .Conditions {
195+ if condition .Type == corev1 .NodeReady && condition .Status == corev1 .ConditionTrue {
196+ readyNodes ++
197+ break // Found the Ready condition, move to the next node
198+ }
199+ }
200+ }
201+ return readyNodes , nil
202+ }
203+
162204func getWorkerCount (config * dependency.Config ) interface {} {
163205 workerCount , ok := config .Params ["WorkerNodeCount" ]
164206 if ! ok {
@@ -167,6 +209,43 @@ func getWorkerCount(config *dependency.Config) interface{} {
167209 return workerCount
168210}
169211
212+ func getNamespace (config * dependency.Config ) (string , error ) {
213+ namespace , ok := config .Params ["Namespace" ]
214+ if ! ok {
215+ namespace = draNamespace
216+ }
217+ namespaceString , ok := namespace .(string )
218+
219+ if ! ok {
220+ return "" , fmt .Errorf ("namespace parameter is not a string: %v" , namespace )
221+ }
222+ return namespaceString , nil
223+ }
224+
225+ func getManifests (config * dependency.Config ) (string , error ) {
226+ manifests , ok := config .Params ["Manifests" ]
227+ if ! ok {
228+ manifests = draManifests
229+ }
230+ manifestsString , ok := manifests .(string )
231+ if ! ok {
232+ return "" , fmt .Errorf ("manifests parameter is not a string: %v" , manifests )
233+ }
234+ return "manifests/" + manifestsString + "/*.yaml" , nil
235+ }
236+
237+ func getDaemonset (config * dependency.Config ) (string , error ) {
238+ daemonsetName , ok := config .Params ["DaemonsetName" ]
239+ if ! ok {
240+ daemonsetName = draDaemonsetName
241+ }
242+ daemonsetNameString , ok := daemonsetName .(string )
243+ if ! ok {
244+ return "" , fmt .Errorf ("DaemonsetName parameter is not a string: %v" , daemonsetName )
245+ }
246+ return daemonsetNameString , nil
247+ }
248+
170249// String returns string representation of this dependency.
171250func (d * draDependency ) String () string {
172251 return draDependencyName
0 commit comments