@@ -22,35 +22,16 @@ import (
2222 "strings"
2323
2424 corev1 "k8s.io/api/core/v1"
25+ "k8s.io/apimachinery/pkg/labels"
2526 "sigs.k8s.io/controller-runtime/pkg/client"
2627
2728 nvidiav1alpha1 "github.com/NVIDIA/gpu-operator/api/nvidia/v1alpha1"
2829 "github.com/NVIDIA/gpu-operator/internal/consts"
2930)
3031
31- // ValidateNodeSelector rejects selectors that use operator-managed routing labels
32- // or scope the default fallback driver.
33- func ValidateNodeSelector (driver * nvidiav1alpha1.NVIDIADriver ) error {
34- if driver == nil || driver .Spec .NodeSelector == nil {
35- return nil
36- }
37- if driver .IsDefault () && len (driver .Spec .NodeSelector ) > 0 {
38- return fmt .Errorf ("default NVIDIADriver %q cannot use nodeSelector" , driver .Name )
39- }
40- if _ , ok := driver .Spec .NodeSelector [consts .NVIDIADriverOwnerLabel ]; ok {
41- return fmt .Errorf ("NVIDIADriver %q nodeSelector cannot use reserved label %q" , driver .Name , consts .NVIDIADriverOwnerLabel )
42- }
43- return nil
44- }
45-
46- // NodeMatchesSelector returns true when all selector labels are present on the node.
47- func NodeMatchesSelector (node * corev1.Node , selector map [string ]string ) bool {
48- for key , value := range selector {
49- if node .Labels [key ] != value {
50- return false
51- }
52- }
53- return true
32+ // nodeMatchesSelector reports whether nodeLabels satisfy the NVIDIADriver nodeSelector.
33+ func nodeMatchesSelector (nodeLabels map [string ]string , selector map [string ]string ) bool {
34+ return labels .SelectorFromSet (selector ).Matches (labels .Set (nodeLabels ))
5435}
5536
5637// AssignOwners labels GPU nodes with the NVIDIADriver that should manage their driver pods.
@@ -62,22 +43,24 @@ func AssignOwners(ctx context.Context, c client.Client) (bool, error) {
6243 return false , fmt .Errorf ("failed to list NVIDIADriver CRs: %w" , err )
6344 }
6445
65- var defaultDriver * nvidiav1alpha1.NVIDIADriver
46+ var defaultDriver nvidiav1alpha1.NVIDIADriver
47+ hasDefaultDriver := false
6648 defaultDriverNames := []string {}
6749 nonDefaultDrivers := make ([]nvidiav1alpha1.NVIDIADriver , 0 , len (drivers .Items ))
68- for i := range drivers .Items {
69- if ! drivers . Items [ i ] .GetDeletionTimestamp ().IsZero () {
50+ for _ , driver := range drivers .Items {
51+ if ! driver .GetDeletionTimestamp ().IsZero () {
7052 continue
7153 }
72- if err := ValidateNodeSelector (& drivers . Items [ i ] ); err != nil {
54+ if err := driver . ValidateNodeSelector (); err != nil {
7355 return false , err
7456 }
75- if drivers .Items [i ].IsDefault () {
76- defaultDriverNames = append (defaultDriverNames , drivers .Items [i ].Name )
77- defaultDriver = & drivers .Items [i ]
57+ if driver .IsDefault () {
58+ defaultDriverNames = append (defaultDriverNames , driver .Name )
59+ defaultDriver = driver
60+ hasDefaultDriver = true
7861 continue
7962 }
80- nonDefaultDrivers = append (nonDefaultDrivers , drivers . Items [ i ] )
63+ nonDefaultDrivers = append (nonDefaultDrivers , driver )
8164 }
8265 if len (defaultDriverNames ) > 1 {
8366 return false , fmt .Errorf ("multiple default NVIDIADrivers found: %s" , strings .Join (defaultDriverNames , ", " ))
@@ -87,15 +70,15 @@ func AssignOwners(ctx context.Context, c client.Client) (bool, error) {
8770 return false , fmt .Errorf ("failed to list GPU nodes: %w" , err )
8871 }
8972
90- for i := range nodes .Items {
73+ for _ , node := range nodes .Items {
9174 matchingDrivers := []string {}
9275 for _ , driver := range nonDefaultDrivers {
93- if NodeMatchesSelector ( & nodes . Items [ i ] , driver .GetNodeSelector ()) {
76+ if nodeMatchesSelector ( node . Labels , driver .GetNodeSelector ()) {
9477 matchingDrivers = append (matchingDrivers , driver .Name )
9578 }
9679 }
9780 if len (matchingDrivers ) > 1 {
98- return false , fmt .Errorf ("multiple NVIDIADrivers match the same node %s: %v" , nodes . Items [ i ] .Name , matchingDrivers )
81+ return false , fmt .Errorf ("multiple NVIDIADrivers match the same node %s: %v" , node .Name , matchingDrivers )
9982 }
10083 }
10184
@@ -105,11 +88,11 @@ func AssignOwners(ctx context.Context, c client.Client) (bool, error) {
10588 originalNode := node .DeepCopy ()
10689 owner := ""
10790 for _ , driver := range nonDefaultDrivers {
108- if NodeMatchesSelector (node , driver .GetNodeSelector ()) {
91+ if nodeMatchesSelector (node . Labels , driver .GetNodeSelector ()) {
10992 owner = driver .Name
11093 }
11194 }
112- if owner == "" && defaultDriver != nil && NodeMatchesSelector (node , defaultDriver .GetNodeSelector ()) {
95+ if owner == "" && hasDefaultDriver && nodeMatchesSelector (node . Labels , defaultDriver .GetNodeSelector ()) {
11396 owner = defaultDriver .Name
11497 }
11598 if owner == "" {
0 commit comments