@@ -44,6 +44,7 @@ import (
44
44
k8sLabels "k8s.io/apimachinery/pkg/labels"
45
45
"k8s.io/apimachinery/pkg/types"
46
46
k8sclient "k8s.io/client-go/kubernetes"
47
+ restclient "k8s.io/client-go/rest"
47
48
"k8s.io/client-go/tools/leaderelection"
48
49
"k8s.io/client-go/tools/leaderelection/resourcelock"
49
50
"k8s.io/klog/v2"
@@ -150,6 +151,7 @@ type nfdMaster struct {
150
151
healthServer * grpc.Server
151
152
stop chan struct {}
152
153
ready chan struct {}
154
+ kubeconfig * restclient.Config
153
155
k8sClient k8sclient.Interface
154
156
nodeUpdaterPool * nodeUpdaterPool
155
157
deniedNs
@@ -200,6 +202,7 @@ func NewNfdMaster(opts ...NfdMasterOption) (NfdMaster, error) {
200
202
if err != nil {
201
203
return nfd , err
202
204
}
205
+ nfd .kubeconfig = kubeconfig
203
206
cli , err := k8sclient .NewForConfig (kubeconfig )
204
207
if err != nil {
205
208
return nfd , err
@@ -528,7 +531,7 @@ func (m *nfdMaster) prune() error {
528
531
return nil
529
532
}
530
533
531
- nodes , err := m . getNodes ()
534
+ nodes , err := getNodes (m . k8sClient )
532
535
if err != nil {
533
536
return err
534
537
}
@@ -537,14 +540,14 @@ func (m *nfdMaster) prune() error {
537
540
klog .InfoS ("pruning node..." , "nodeName" , node .Name )
538
541
539
542
// Prune labels and extended resources
540
- err := m .updateNodeObject (& node , Labels {}, Annotations {}, ExtendedResources {}, []corev1.Taint {})
543
+ err := m .updateNodeObject (m . k8sClient , & node , Labels {}, Annotations {}, ExtendedResources {}, []corev1.Taint {})
541
544
if err != nil {
542
545
nodeUpdateFailures .Inc ()
543
546
return fmt .Errorf ("failed to prune node %q: %v" , node .Name , err )
544
547
}
545
548
546
549
// Prune annotations
547
- node , err := m . getNode (node .Name )
550
+ node , err := getNode (m . k8sClient , node .Name )
548
551
if err != nil {
549
552
return err
550
553
}
@@ -564,7 +567,7 @@ func (m *nfdMaster) prune() error {
564
567
// "nfd.node.kubernetes.io/master.version" annotation, if it exists.
565
568
// TODO: Drop when nfdv1alpha1.MasterVersionAnnotation is removed.
566
569
func (m * nfdMaster ) updateMasterNode () error {
567
- node , err := m . getNode (m .nodeName )
570
+ node , err := getNode (m . k8sClient , m .nodeName )
568
571
if err != nil {
569
572
return err
570
573
}
@@ -575,7 +578,7 @@ func (m *nfdMaster) updateMasterNode() error {
575
578
nil ,
576
579
"/metadata/annotations" )
577
580
578
- err = m . patchNode (node .Name , p )
581
+ err = patchNode (m . k8sClient , node .Name , p )
579
582
if err != nil {
580
583
return fmt .Errorf ("failed to patch node annotations: %w" , err )
581
584
}
@@ -727,12 +730,12 @@ func (m *nfdMaster) SetLabels(c context.Context, r *pb.SetLabelsRequest) (*pb.Se
727
730
}
728
731
if ! m .config .NoPublish {
729
732
// Fetch the node object.
730
- node , err := m . getNode (r .NodeName )
733
+ node , err := getNode (m . k8sClient , r .NodeName )
731
734
if err != nil {
732
735
return & pb.SetLabelsReply {}, err
733
736
}
734
737
// Create labels et al
735
- if err := m .refreshNodeFeatures (node , r .GetLabels (), r .GetFeatures ()); err != nil {
738
+ if err := m .refreshNodeFeatures (m . k8sClient , node , r .GetLabels (), r .GetFeatures ()); err != nil {
736
739
nodeUpdateFailures .Inc ()
737
740
return & pb.SetLabelsReply {}, err
738
741
}
@@ -743,7 +746,7 @@ func (m *nfdMaster) SetLabels(c context.Context, r *pb.SetLabelsRequest) (*pb.Se
743
746
func (m * nfdMaster ) nfdAPIUpdateAllNodes () error {
744
747
klog .InfoS ("will process all nodes in the cluster" )
745
748
746
- nodes , err := m . getNodes ()
749
+ nodes , err := getNodes (m . k8sClient )
747
750
if err != nil {
748
751
return err
749
752
}
@@ -755,7 +758,7 @@ func (m *nfdMaster) nfdAPIUpdateAllNodes() error {
755
758
return nil
756
759
}
757
760
758
- func (m * nfdMaster ) nfdAPIUpdateOneNode (node * corev1.Node ) error {
761
+ func (m * nfdMaster ) nfdAPIUpdateOneNode (cli k8sclient. Interface , node * corev1.Node ) error {
759
762
if m .nfdController == nil || m .nfdController .featureLister == nil {
760
763
return nil
761
764
}
@@ -810,7 +813,7 @@ func (m *nfdMaster) nfdAPIUpdateOneNode(node *corev1.Node) error {
810
813
// Update node labels et al. This may also mean removing all NFD-owned
811
814
// labels (et al.), for example in the case no NodeFeature objects are
812
815
// present.
813
- if err := m .refreshNodeFeatures (node , features .Labels , & features .Features ); err != nil {
816
+ if err := m .refreshNodeFeatures (cli , node , features .Labels , & features .Features ); err != nil {
814
817
return err
815
818
}
816
819
@@ -855,7 +858,7 @@ func filterExtendedResource(name, value string, features *nfdv1alpha1.Features)
855
858
return filteredValue , nil
856
859
}
857
860
858
- func (m * nfdMaster ) refreshNodeFeatures (node * corev1.Node , labels map [string ]string , features * nfdv1alpha1.Features ) error {
861
+ func (m * nfdMaster ) refreshNodeFeatures (cli k8sclient. Interface , node * corev1.Node , labels map [string ]string , features * nfdv1alpha1.Features ) error {
859
862
if m .config .AutoDefaultNs {
860
863
labels = addNsToMapKeys (labels , nfdv1alpha1 .FeatureLabelNs )
861
864
} else if labels == nil {
@@ -889,7 +892,7 @@ func (m *nfdMaster) refreshNodeFeatures(node *corev1.Node, labels map[string]str
889
892
return nil
890
893
}
891
894
892
- err := m .updateNodeObject (node , labels , annotations , extendedResources , taints )
895
+ err := m .updateNodeObject (cli , node , labels , annotations , extendedResources , taints )
893
896
if err != nil {
894
897
klog .ErrorS (err , "failed to update node" , "nodeName" , node .Name )
895
898
return err
@@ -901,7 +904,7 @@ func (m *nfdMaster) refreshNodeFeatures(node *corev1.Node, labels map[string]str
901
904
// setTaints sets node taints and annotations based on the taints passed via
902
905
// nodeFeatureRule custom resorce. If empty list of taints is passed, currently
903
906
// NFD owned taints and annotations are removed from the node.
904
- func ( m * nfdMaster ) setTaints ( taints []corev1.Taint , node * corev1.Node ) error {
907
+ func setTaints ( cli k8sclient. Interface , taints []corev1.Taint , node * corev1.Node ) error {
905
908
// De-serialize the taints annotation into corev1.Taint type for comparision below.
906
909
var err error
907
910
oldTaints := []corev1.Taint {}
@@ -940,7 +943,7 @@ func (m *nfdMaster) setTaints(taints []corev1.Taint, node *corev1.Node) error {
940
943
}
941
944
942
945
if taintsUpdated {
943
- if err := controller .PatchNodeTaints (context .TODO (), m . k8sClient , node .Name , node , newNode ); err != nil {
946
+ if err := controller .PatchNodeTaints (context .TODO (), cli , node .Name , node , newNode ); err != nil {
944
947
return fmt .Errorf ("failed to patch the node %v" , node .Name )
945
948
}
946
949
klog .InfoS ("updated node taints" , "nodeName" , node .Name )
@@ -960,7 +963,7 @@ func (m *nfdMaster) setTaints(taints []corev1.Taint, node *corev1.Node) error {
960
963
961
964
patches := createPatches ([]string {nfdv1alpha1 .NodeTaintsAnnotation }, node .Annotations , newAnnotations , "/metadata/annotations" )
962
965
if len (patches ) > 0 {
963
- if err := m . patchNode (node .Name , patches ); err != nil {
966
+ if err := patchNode (cli , node .Name , patches ); err != nil {
964
967
return fmt .Errorf ("error while patching node object: %w" , err )
965
968
}
966
969
klog .V (1 ).InfoS ("patched node annotations for taints" , "nodeName" , node .Name )
@@ -1057,7 +1060,7 @@ func (m *nfdMaster) processNodeFeatureRule(nodeName string, features *nfdv1alpha
1057
1060
// updateNodeObject ensures the Kubernetes node object is up to date,
1058
1061
// creating new labels and extended resources where necessary and removing
1059
1062
// outdated ones. Also updates the corresponding annotations.
1060
- func (m * nfdMaster ) updateNodeObject (node * corev1.Node , labels Labels , featureAnnotations Annotations , extendedResources ExtendedResources , taints []corev1.Taint ) error {
1063
+ func (m * nfdMaster ) updateNodeObject (cli k8sclient. Interface , node * corev1.Node , labels Labels , featureAnnotations Annotations , extendedResources ExtendedResources , taints []corev1.Taint ) error {
1061
1064
annotations := make (Annotations )
1062
1065
1063
1066
// Store names of labels in an annotation
@@ -1110,13 +1113,13 @@ func (m *nfdMaster) updateNodeObject(node *corev1.Node, labels Labels, featureAn
1110
1113
1111
1114
// patch node status with extended resource changes
1112
1115
statusPatches := m .createExtendedResourcePatches (node , extendedResources )
1113
- err := m . patchNodeStatus (node .Name , statusPatches )
1116
+ err := patchNodeStatus (cli , node .Name , statusPatches )
1114
1117
if err != nil {
1115
1118
return fmt .Errorf ("error while patching extended resources: %w" , err )
1116
1119
}
1117
1120
1118
1121
// Patch the node object in the apiserver
1119
- err = m . patchNode (node .Name , patches )
1122
+ err = patchNode (cli , node .Name , patches )
1120
1123
if err != nil {
1121
1124
return fmt .Errorf ("error while patching node object: %w" , err )
1122
1125
}
@@ -1129,7 +1132,7 @@ func (m *nfdMaster) updateNodeObject(node *corev1.Node, labels Labels, featureAn
1129
1132
}
1130
1133
1131
1134
// Set taints
1132
- err = m . setTaints (taints , node )
1135
+ err = setTaints (cli , taints , node )
1133
1136
if err != nil {
1134
1137
return err
1135
1138
}
@@ -1420,25 +1423,25 @@ func (m *nfdMaster) filterFeatureAnnotations(annotations map[string]string) map[
1420
1423
return outAnnotations
1421
1424
}
1422
1425
1423
- func ( m * nfdMaster ) getNode ( nodeName string ) (* corev1.Node , error ) {
1424
- return m . k8sClient .CoreV1 ().Nodes ().Get (context .TODO (), nodeName , metav1.GetOptions {})
1426
+ func getNode ( cli k8sclient. Interface , nodeName string ) (* corev1.Node , error ) {
1427
+ return cli .CoreV1 ().Nodes ().Get (context .TODO (), nodeName , metav1.GetOptions {})
1425
1428
}
1426
1429
1427
- func ( m * nfdMaster ) getNodes () (* corev1.NodeList , error ) {
1428
- return m . k8sClient .CoreV1 ().Nodes ().List (context .TODO (), metav1.ListOptions {})
1430
+ func getNodes (cli k8sclient. Interface ) (* corev1.NodeList , error ) {
1431
+ return cli .CoreV1 ().Nodes ().List (context .TODO (), metav1.ListOptions {})
1429
1432
}
1430
1433
1431
- func ( m * nfdMaster ) patchNode ( nodeName string , patches []utils.JsonPatch , subresources ... string ) error {
1434
+ func patchNode ( cli k8sclient. Interface , nodeName string , patches []utils.JsonPatch , subresources ... string ) error {
1432
1435
if len (patches ) == 0 {
1433
1436
return nil
1434
1437
}
1435
1438
data , err := json .Marshal (patches )
1436
1439
if err == nil {
1437
- _ , err = m . k8sClient .CoreV1 ().Nodes ().Patch (context .TODO (), nodeName , types .JSONPatchType , data , metav1.PatchOptions {}, subresources ... )
1440
+ _ , err = cli .CoreV1 ().Nodes ().Patch (context .TODO (), nodeName , types .JSONPatchType , data , metav1.PatchOptions {}, subresources ... )
1438
1441
}
1439
1442
return err
1440
1443
}
1441
1444
1442
- func ( m * nfdMaster ) patchNodeStatus ( nodeName string , patches []utils.JsonPatch ) error {
1443
- return m . patchNode (nodeName , patches , "status" )
1445
+ func patchNodeStatus ( cli k8sclient. Interface , nodeName string , patches []utils.JsonPatch ) error {
1446
+ return patchNode (cli , nodeName , patches , "status" )
1444
1447
}
0 commit comments