@@ -21,23 +21,28 @@ import (
21
21
"fmt"
22
22
"time"
23
23
24
- topologyclientset "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/generated/clientset/versioned "
24
+ topologyv1alpha2 "github.com/k8stopologyawareschedwg/noderesourcetopology-api/pkg/apis/topology/v1alpha2 "
25
25
corev1 "k8s.io/api/core/v1"
26
26
"k8s.io/apimachinery/pkg/api/errors"
27
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
28
"k8s.io/apimachinery/pkg/labels"
29
29
"k8s.io/apimachinery/pkg/util/sets"
30
- "k8s.io/client-go/informers "
31
- "k8s.io/client-go/kubernetes "
30
+ metadataclient "k8s.io/client-go/metadata "
31
+ "k8s.io/client-go/metadata/metadatainformer "
32
32
"k8s.io/client-go/tools/cache"
33
33
"k8s.io/klog/v2"
34
34
35
- nfdclientset "sigs.k8s.io/node-feature-discovery/api/generated/clientset/versioned"
36
35
nfdv1alpha1 "sigs.k8s.io/node-feature-discovery/api/nfd/v1alpha1"
37
36
"sigs.k8s.io/node-feature-discovery/pkg/utils"
38
37
"sigs.k8s.io/node-feature-discovery/pkg/version"
39
38
)
40
39
40
+ var (
41
+ gvrNF = nfdv1alpha1 .SchemeGroupVersion .WithResource ("nodefeatures" )
42
+ gvrNRT = topologyv1alpha2 .SchemeGroupVersion .WithResource ("noderesourcetopologies" )
43
+ gvrNode = corev1 .SchemeGroupVersion .WithResource ("nodes" )
44
+ )
45
+
41
46
// Args are the command line arguments
42
47
type Args struct {
43
48
GCPeriod time.Duration
@@ -51,11 +56,10 @@ type NfdGarbageCollector interface {
51
56
}
52
57
53
58
type nfdGarbageCollector struct {
54
- args * Args
55
- stopChan chan struct {}
56
- nfdClient nfdclientset.Interface
57
- topoClient topologyclientset.Interface
58
- factory informers.SharedInformerFactory
59
+ args * Args
60
+ stopChan chan struct {}
61
+ client metadataclient.Interface
62
+ factory metadatainformer.SharedInformerFactory
59
63
}
60
64
61
65
func New (args * Args ) (NfdGarbageCollector , error ) {
@@ -64,20 +68,19 @@ func New(args *Args) (NfdGarbageCollector, error) {
64
68
return nil , err
65
69
}
66
70
67
- clientset := kubernetes .NewForConfigOrDie (kubeconfig )
71
+ cli := metadataclient .NewForConfigOrDie (kubeconfig )
68
72
69
73
return & nfdGarbageCollector {
70
- args : args ,
71
- stopChan : make (chan struct {}),
72
- topoClient : topologyclientset .NewForConfigOrDie (kubeconfig ),
73
- nfdClient : nfdclientset .NewForConfigOrDie (kubeconfig ),
74
- factory : informers .NewSharedInformerFactory (clientset , 5 * time .Minute ),
74
+ args : args ,
75
+ stopChan : make (chan struct {}),
76
+ client : cli ,
77
+ factory : metadatainformer .NewSharedInformerFactory (cli , 0 ),
75
78
}, nil
76
79
}
77
80
78
81
func (n * nfdGarbageCollector ) deleteNodeFeature (namespace , name string ) {
79
82
kind := "NodeFeature"
80
- if err := n .nfdClient . NfdV1alpha1 (). NodeFeatures (namespace ).Delete (context .TODO (), name , metav1.DeleteOptions {}); err != nil {
83
+ if err := n .client . Resource ( gvrNF ). Namespace (namespace ).Delete (context .TODO (), name , metav1.DeleteOptions {}); err != nil {
81
84
if errors .IsNotFound (err ) {
82
85
klog .V (2 ).InfoS ("NodeFeature not found, omitting deletion" , "nodefeature" , klog .KRef (namespace , name ))
83
86
return
@@ -93,7 +96,7 @@ func (n *nfdGarbageCollector) deleteNodeFeature(namespace, name string) {
93
96
94
97
func (n * nfdGarbageCollector ) deleteNRT (nodeName string ) {
95
98
kind := "NodeResourceTopology"
96
- if err := n .topoClient . TopologyV1alpha2 (). NodeResourceTopologies ( ).Delete (context .TODO (), nodeName , metav1.DeleteOptions {}); err != nil {
99
+ if err := n .client . Resource ( gvrNRT ).Delete (context .TODO (), nodeName , metav1.DeleteOptions {}); err != nil {
97
100
if errors .IsNotFound (err ) {
98
101
klog .V (2 ).InfoS ("NodeResourceTopology not found, omitting deletion" , "nodeName" , nodeName )
99
102
return
@@ -115,17 +118,18 @@ func (n *nfdGarbageCollector) deleteNodeHandler(object interface{}) {
115
118
obj = deletedFinalStateUnknown .Obj
116
119
}
117
120
118
- node , ok := obj .(* corev1. Node )
121
+ meta , ok := obj .(* metav1. PartialObjectMetadata )
119
122
if ! ok {
120
- klog .InfoS ("cannot convert object to v1.Node " , "object" , object )
123
+ klog .InfoS ("cannot convert object to metav1.ObjectMeta " , "object" , object )
121
124
return
122
125
}
126
+ nodeName := meta .ObjectMeta .GetName ()
123
127
124
- n .deleteNRT (node . GetName () )
128
+ n .deleteNRT (nodeName )
125
129
126
130
// Delete all NodeFeature objects (from all namespaces) targeting the deleted node
127
- nfListOptions := metav1.ListOptions {LabelSelector : nfdv1alpha1 .NodeFeatureObjNodeNameLabel + "=" + node . GetName () }
128
- if nfs , err := n .nfdClient . NfdV1alpha1 (). NodeFeatures ( "" ).List (context .TODO (), nfListOptions ); err != nil {
131
+ nfListOptions := metav1.ListOptions {LabelSelector : nfdv1alpha1 .NodeFeatureObjNodeNameLabel + "=" + nodeName }
132
+ if nfs , err := n .client . Resource ( gvrNF ).List (context .TODO (), nfListOptions ); err != nil {
129
133
klog .ErrorS (err , "failed to list NodeFeature objects" )
130
134
} else {
131
135
for _ , nf := range nfs .Items {
@@ -137,24 +141,25 @@ func (n *nfdGarbageCollector) deleteNodeHandler(object interface{}) {
137
141
// garbageCollect removes all stale API objects
138
142
func (n * nfdGarbageCollector ) garbageCollect () {
139
143
klog .InfoS ("performing garbage collection" )
140
- nodes , err := n .factory .Core (). V1 (). Nodes ( ).Lister ().List (labels .Everything ())
144
+ objs , err := n .factory .ForResource ( gvrNode ).Lister ().List (labels .Everything ())
141
145
if err != nil {
142
146
klog .ErrorS (err , "failed to list Node objects" )
143
147
return
144
148
}
145
149
nodeNames := sets .NewString ()
146
- for _ , node := range nodes {
147
- nodeNames .Insert (node .Name )
150
+ for _ , obj := range objs {
151
+ meta := obj .(* metav1.PartialObjectMetadata ).ObjectMeta
152
+ nodeNames .Insert (meta .Name )
148
153
}
149
154
150
155
// Handle NodeFeature objects
151
- nfs , err := n .nfdClient . NfdV1alpha1 (). NodeFeatures ( "" ).List (context .TODO (), metav1.ListOptions {})
156
+ objMetas , err := n .client . Resource ( gvrNF ).List (context .TODO (), metav1.ListOptions {})
152
157
if errors .IsNotFound (err ) {
153
158
klog .V (2 ).InfoS ("NodeFeature CRD does not exist" )
154
159
} else if err != nil {
155
160
klog .ErrorS (err , "failed to list NodeFeature objects" )
156
161
} else {
157
- for _ , nf := range nfs .Items {
162
+ for _ , nf := range objMetas .Items {
158
163
nodeName , ok := nf .GetLabels ()[nfdv1alpha1 .NodeFeatureObjNodeNameLabel ]
159
164
if ! ok {
160
165
klog .InfoS ("node name label missing from NodeFeature object" , "nodefeature" , klog .KObj (& nf ))
@@ -166,13 +171,13 @@ func (n *nfdGarbageCollector) garbageCollect() {
166
171
}
167
172
168
173
// Handle NodeResourceTopology objects
169
- nrts , err : = n .topoClient . TopologyV1alpha2 (). NodeResourceTopologies ( ).List (context .TODO (), metav1.ListOptions {})
174
+ objMetas , err = n .client . Resource ( gvrNRT ).List (context .TODO (), metav1.ListOptions {})
170
175
if errors .IsNotFound (err ) {
171
176
klog .V (2 ).InfoS ("NodeResourceTopology CRD does not exist" )
172
177
} else if err != nil {
173
178
klog .ErrorS (err , "failed to list NodeResourceTopology objects" )
174
179
} else {
175
- for _ , nrt := range nrts .Items {
180
+ for _ , nrt := range objMetas .Items {
176
181
if ! nodeNames .Has (nrt .Name ) {
177
182
n .deleteNRT (nrt .Name )
178
183
}
@@ -199,7 +204,7 @@ func (n *nfdGarbageCollector) periodicGC(gcPeriod time.Duration) {
199
204
}
200
205
201
206
func (n * nfdGarbageCollector ) startNodeInformer () error {
202
- nodeInformer := n .factory .Core (). V1 (). Nodes ( ).Informer ()
207
+ nodeInformer := n .factory .ForResource ( gvrNode ).Informer ()
203
208
204
209
if _ , err := nodeInformer .AddEventHandler (cache.ResourceEventHandlerFuncs {
205
210
DeleteFunc : n .deleteNodeHandler ,
0 commit comments