Skip to content

Commit 6335e04

Browse files
committed
nfd-worker: Add support to configure the ownerReference to Node
Signed-off-by: Oleg Zhurakivskyy <[email protected]>
1 parent 242a4f4 commit 6335e04

File tree

6 files changed

+155
-22
lines changed

6 files changed

+155
-22
lines changed

cmd/nfd-worker/main.go

+4
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ func parseArgs(flags *flag.FlagSet, osArgs ...string) *worker.Args {
9393
args.Overrides.LabelSources = overrides.LabelSources
9494
case "no-owner-refs":
9595
args.Overrides.NoOwnerRefs = overrides.NoOwnerRefs
96+
case "owner-ref-pod":
97+
args.Overrides.OwnerRefPod = overrides.OwnerRefPod
9698
}
9799
})
98100

@@ -125,6 +127,8 @@ func initFlags(flagset *flag.FlagSet) (*worker.Args, *worker.ConfigOverrideArgs)
125127
"Do not publish discovered features, disable connection to nfd-master and don't create NodeFeature object.")
126128
overrides.NoOwnerRefs = flagset.Bool("no-owner-refs", false,
127129
"Do not set owner references for NodeFeature object.")
130+
overrides.OwnerRefPod = flagset.Bool("owner-ref-pod", false,
131+
"Set the owner reference for NodeFeature object to Pod.")
128132
flagset.Var(overrides.FeatureSources, "feature-sources",
129133
"Comma separated list of feature sources. Special value 'all' enables all sources. "+
130134
"Prefix the source name with '-' to disable it.")

docs/deployment/uninstallation.md

+9
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,12 @@ kubectl -n node-feature-discovery wait job.batch/nfd-master --for=condition=comp
3131

3232
> **NOTE:** You must run prune before removing the RBAC rules (serviceaccount,
3333
> clusterrole and clusterrolebinding).
34+
35+
## Removing stale NodeFeature objects
36+
37+
In case NFD-Worker is configured to set the owner reference to Node or Pod, manually delete stale NodeFeature objects.
38+
39+
```bash
40+
kubectl delete -n node-feature-discovery NodeFeature $(kubectl get -o json -n node-feature-discovery NodeFeature | jq ".items[].metadata.name")
41+
```
42+

docs/reference/worker-commandline-reference.md

+17
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,23 @@ Example:
179179
nfd-worker -no-owner-refs
180180
```
181181

182+
### -owner-ref-pod
183+
184+
The `-owner-ref-pod` flag sets the owner references
185+
of the NodeFeature object to Pod.
186+
187+
> **NOTE:** This flag takes precedence over the
188+
> [`core.OwnerRefNode`](worker-configuration-reference.md#coreownerrefpod)
189+
> configuration file option.
190+
191+
Default: *false*
192+
193+
Example:
194+
195+
```bash
196+
nfd-worker -owner-ref-pod
197+
```
198+
182199
### -oneshot
183200

184201
The `-oneshot` flag causes nfd-worker to exit after one pass of feature

docs/reference/worker-configuration-reference.md

+18
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,24 @@ core:
167167
noOwnerRefs: true
168168
```
169169

170+
### core.ownerRefPod
171+
172+
Setting `core.ownerRefPod` to `true` sets the owner reference
173+
of the NodeFeature object to Pod for nfd-worker.
174+
175+
> **NOTE:** Overridden by the
176+
> [`-owner-ref-pod`](worker-commandline-reference.md#-owner-ref-pod)
177+
> command line flag (if specified).
178+
179+
Default: `false`
180+
181+
Example:
182+
183+
```yaml
184+
core:
185+
ownerRefPod: true
186+
```
187+
170188
### core.klog
171189

172190
The following options specify the logger configuration.

pkg/nfd-worker/nfd-worker.go

+48-22
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ type coreConfig struct {
8181
LabelWhiteList utils.RegexpVal
8282
NoPublish bool
8383
NoOwnerRefs bool
84+
OwnerRefPod bool
8485
FeatureSources []string
8586
Sources *[]string
8687
LabelSources []string
@@ -101,6 +102,7 @@ type Args struct {
101102
Options string
102103
Port int
103104
NoOwnerRefs bool
105+
OwnerRefPod bool
104106

105107
Overrides ConfigOverrideArgs
106108
}
@@ -109,6 +111,7 @@ type Args struct {
109111
type ConfigOverrideArgs struct {
110112
NoPublish *bool
111113
NoOwnerRefs *bool
114+
OwnerRefPod *bool
112115
FeatureSources *utils.StringSliceVal
113116
LabelSources *utils.StringSliceVal
114117
}
@@ -253,33 +256,53 @@ func (w *nfdWorker) setOwnerReference() error {
253256
ownerReference := []metav1.OwnerReference{}
254257

255258
if !w.config.Core.NoOwnerRefs {
256-
// Get pod owner reference
257-
podName := os.Getenv("POD_NAME")
258-
// Add pod owner reference if it exists
259-
if podName != "" {
260-
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
261-
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
262-
return err
263-
} else {
264-
for _, owner := range selfPod.OwnerReferences {
265-
owner.BlockOwnerDeletion = ptr.To(false)
266-
ownerReference = append(ownerReference, owner)
259+
if w.config.Core.OwnerRefPod {
260+
// Get pod owner reference
261+
podName := os.Getenv("POD_NAME")
262+
// Add pod owner reference if it exists
263+
if podName != "" {
264+
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
265+
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
266+
return err
267+
} else {
268+
for _, owner := range selfPod.OwnerReferences {
269+
owner.BlockOwnerDeletion = ptr.To(false)
270+
ownerReference = append(ownerReference, owner)
271+
}
267272
}
268-
}
269273

270-
podUID := os.Getenv("POD_UID")
271-
if podUID != "" {
272-
ownerReference = append(ownerReference, metav1.OwnerReference{
273-
APIVersion: "v1",
274-
Kind: "Pod",
275-
Name: podName,
276-
UID: types.UID(podUID),
277-
})
274+
podUID := os.Getenv("POD_UID")
275+
if podUID != "" {
276+
ownerReference = append(ownerReference, metav1.OwnerReference{
277+
APIVersion: "v1",
278+
Kind: "Pod",
279+
Name: podName,
280+
UID: types.UID(podUID),
281+
})
282+
} else {
283+
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
284+
}
278285
} else {
279-
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
286+
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
280287
}
281288
} else {
282-
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
289+
// Get node owner reference
290+
nodeName := os.Getenv("NODE_NAME")
291+
if nodeName != "" {
292+
if selfNode, err := w.k8sClient.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}); err != nil {
293+
klog.ErrorS(err, "failed to get self node, cannot inherit ownerReference for NodeFeature")
294+
return err
295+
} else {
296+
ownerReference = append(ownerReference, metav1.OwnerReference{
297+
APIVersion: "v1",
298+
Kind: "Node",
299+
Name: nodeName,
300+
UID: selfNode.UID,
301+
})
302+
}
303+
} else {
304+
klog.InfoS("Cannot set NodeFeature owner reference to Node, NODE_NAME not specified")
305+
}
283306
}
284307
}
285308

@@ -505,6 +528,9 @@ func (w *nfdWorker) configure(filepath string, overrides string) error {
505528
if w.args.Overrides.NoOwnerRefs != nil {
506529
c.Core.NoOwnerRefs = *w.args.Overrides.NoOwnerRefs
507530
}
531+
if w.args.Overrides.OwnerRefPod != nil {
532+
c.Core.OwnerRefPod = *w.args.Overrides.OwnerRefPod
533+
}
508534
if w.args.Overrides.FeatureSources != nil {
509535
c.Core.FeatureSources = *w.args.Overrides.FeatureSources
510536
}

test/e2e/utils/rbac.go

+59
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ func ConfigureRBAC(ctx context.Context, cs clientset.Interface, ns string) error
6363
return err
6464
}
6565

66+
_, err = createClusterRoleWorker(ctx, cs)
67+
if err != nil {
68+
return err
69+
}
70+
6671
_, err = createClusterRoleGC(ctx, cs)
6772
if err != nil {
6873
return err
@@ -83,6 +88,11 @@ func ConfigureRBAC(ctx context.Context, cs clientset.Interface, ns string) error
8388
return err
8489
}
8590

91+
_, err = createClusterRoleBindingWorker(ctx, cs, ns)
92+
if err != nil {
93+
return err
94+
}
95+
8696
_, err = createClusterRoleBindingGC(ctx, cs, ns)
8797
if err != nil {
8898
return err
@@ -106,6 +116,10 @@ func DeconfigureRBAC(ctx context.Context, cs clientset.Interface, ns string) err
106116
if err != nil {
107117
return err
108118
}
119+
err = cs.RbacV1().ClusterRoleBindings().Delete(ctx, "nfd-worker-e2e", metav1.DeleteOptions{})
120+
if err != nil {
121+
return err
122+
}
109123
err = cs.RbacV1().ClusterRoleBindings().Delete(ctx, "nfd-gc-e2e", metav1.DeleteOptions{})
110124
if err != nil {
111125
return err
@@ -118,6 +132,10 @@ func DeconfigureRBAC(ctx context.Context, cs clientset.Interface, ns string) err
118132
if err != nil {
119133
return err
120134
}
135+
err = cs.RbacV1().ClusterRoles().Delete(ctx, "nfd-worker-e2e", metav1.DeleteOptions{})
136+
if err != nil {
137+
return err
138+
}
121139
err = cs.RbacV1().ClusterRoles().Delete(ctx, "nfd-gc-e2e", metav1.DeleteOptions{})
122140
if err != nil {
123141
return err
@@ -239,6 +257,24 @@ func createRoleWorker(ctx context.Context, cs clientset.Interface, ns string) (*
239257
return cs.RbacV1().Roles(ns).Update(ctx, cr, metav1.UpdateOptions{})
240258
}
241259

260+
// Configure cluster role required by NFD Worker
261+
func createClusterRoleWorker(ctx context.Context, cs clientset.Interface) (*rbacv1.ClusterRole, error) {
262+
cr := &rbacv1.ClusterRole{
263+
ObjectMeta: metav1.ObjectMeta{
264+
Name: "nfd-worker-e2e",
265+
},
266+
Rules: []rbacv1.PolicyRule{
267+
{
268+
APIGroups: []string{""},
269+
Resources: []string{"nodes"},
270+
Verbs: []string{"get", "list"},
271+
},
272+
},
273+
}
274+
275+
return cs.RbacV1().ClusterRoles().Update(ctx, cr, metav1.UpdateOptions{})
276+
}
277+
242278
// Configure cluster role required by NFD GC
243279
func createClusterRoleGC(ctx context.Context, cs clientset.Interface) (*rbacv1.ClusterRole, error) {
244280
cr := &rbacv1.ClusterRole{
@@ -356,6 +392,29 @@ func createRoleBindingWorker(ctx context.Context, cs clientset.Interface, ns str
356392
return cs.RbacV1().RoleBindings(ns).Update(ctx, crb, metav1.UpdateOptions{})
357393
}
358394

395+
// Configure cluster role binding required by NFD Worker
396+
func createClusterRoleBindingWorker(ctx context.Context, cs clientset.Interface, ns string) (*rbacv1.ClusterRoleBinding, error) {
397+
crb := &rbacv1.ClusterRoleBinding{
398+
ObjectMeta: metav1.ObjectMeta{
399+
Name: "nfd-worker-e2e",
400+
},
401+
Subjects: []rbacv1.Subject{
402+
{
403+
Kind: rbacv1.ServiceAccountKind,
404+
Name: "nfd-worker-e2e",
405+
Namespace: ns,
406+
},
407+
},
408+
RoleRef: rbacv1.RoleRef{
409+
APIGroup: rbacv1.GroupName,
410+
Kind: "ClusterRole",
411+
Name: "nfd-worker-e2e",
412+
},
413+
}
414+
415+
return cs.RbacV1().ClusterRoleBindings().Update(ctx, crb, metav1.UpdateOptions{})
416+
}
417+
359418
// Configure cluster role binding required by NFD GC
360419
func createClusterRoleBindingGC(ctx context.Context, cs clientset.Interface, ns string) (*rbacv1.ClusterRoleBinding, error) {
361420
crb := &rbacv1.ClusterRoleBinding{

0 commit comments

Comments
 (0)