Skip to content

Commit 20ef877

Browse files
committed
nfd-worker: Add an option to disable setting the owner references
In some cases it's desirable to control automatic garbage collection of NodeFeature object. Add an option to disable setting the owner references to Pod for NodeFeature object. Closes: 1817 Signed-off-by: Oleg Zhurakivskyy <[email protected]>
1 parent a1f6f8a commit 20ef877

File tree

7 files changed

+93
-34
lines changed

7 files changed

+93
-34
lines changed

cmd/nfd-worker/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ func parseArgs(flags *flag.FlagSet, osArgs ...string) *worker.Args {
9494
args.Overrides.FeatureSources = overrides.FeatureSources
9595
case "label-sources":
9696
args.Overrides.LabelSources = overrides.LabelSources
97+
case "no-owner-refs":
98+
args.Overrides.NoOwnerRefs = overrides.NoOwnerRefs
9799
}
98100
})
99101

@@ -126,6 +128,8 @@ func initFlags(flagset *flag.FlagSet) (*worker.Args, *worker.ConfigOverrideArgs)
126128
}
127129
overrides.NoPublish = flagset.Bool("no-publish", false,
128130
"Do not publish discovered features, disable connection to nfd-master and don't create NodeFeature object.")
131+
overrides.NoOwnerRefs = flagset.Bool("no-owner-refs", false,
132+
"Do not set owner references for NodeFeature object.")
129133
flagset.Var(overrides.FeatureSources, "feature-sources",
130134
"Comma separated list of feature sources. Special value 'all' enables all sources. "+
131135
"Prefix the source name with '-' to disable it.")

cmd/nfd-worker/main_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ func TestParseArgs(t *testing.T) {
4343
Convey("When all override args are specified", func() {
4444
args := parseArgs(flags,
4545
"-no-publish",
46+
"-no-owner-refs",
4647
"-feature-sources=cpu",
4748
"-label-sources=fake1,fake2,fake3")
4849

4950
Convey("args.sources is set to appropriate values", func() {
5051
So(args.Oneshot, ShouldBeFalse)
5152
So(*args.Overrides.NoPublish, ShouldBeTrue)
53+
So(*args.Overrides.NoOwnerRefs, ShouldBeTrue)
5254
So(*args.Overrides.FeatureSources, ShouldResemble, utils.StringSliceVal{"cpu"})
5355
So(*args.Overrides.LabelSources, ShouldResemble, utils.StringSliceVal{"fake1", "fake2", "fake3"})
5456
})

deployment/components/worker-config/nfd-worker.conf.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#core:
22
# labelWhiteList:
33
# noPublish: false
4+
# noOwnerRefs: false
45
# sleepInterval: 60s
56
# featureSources: [all]
67
# labelSources: [all]

deployment/helm/node-feature-discovery/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ worker:
177177
#core:
178178
# labelWhiteList:
179179
# noPublish: false
180+
# noOwnerRefs: false
180181
# sleepInterval: 60s
181182
# featureSources: [all]
182183
# labelSources: [all]

docs/reference/worker-commandline-reference.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,23 @@ Example:
162162
nfd-worker -no-publish
163163
```
164164

165+
### -no-owner-refs
166+
167+
The `-no-owner-refs` flag disables setting the owner references to Pod
168+
of the NodeFeature object.
169+
170+
> **NOTE:** This flag takes precedence over the
171+
> [`core.noOwnerRefs`](worker-configuration-reference.md#corenoownerrefs)
172+
> configuration file option.
173+
174+
Default: *false*
175+
176+
Example:
177+
178+
```bash
179+
nfd-worker -no-owner-refs
180+
```
181+
165182
### -oneshot
166183

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

docs/reference/worker-configuration-reference.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,24 @@ core:
149149
noPublish: true
150150
```
151151

152+
### core.noOwnerRefs
153+
154+
Setting `core.noOwnerRefs` to `true` disables setting the owner references
155+
of the NodeFeature object created by the nfd-worker.
156+
157+
> **NOTE:** Overridden by the
158+
> [`-no-owner-refs`](worker-commandline-reference.md#-no-owner-refs)
159+
> command line flag (if specified).
160+
161+
Default: `false`
162+
163+
Example:
164+
165+
```yaml
166+
core:
167+
noOwnerRefs: true
168+
```
169+
152170
### core.klog
153171

154172
The following options specify the logger configuration.

pkg/nfd-worker/nfd-worker.go

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ type coreConfig struct {
7878
Klog klogutils.KlogConfigOpts
7979
LabelWhiteList utils.RegexpVal
8080
NoPublish bool
81+
NoOwnerRefs bool
8182
FeatureSources []string
8283
Sources *[]string
8384
LabelSources []string
@@ -98,14 +99,15 @@ type Args struct {
9899
Options string
99100
MetricsPort int
100101
GrpcHealthPort int
102+
NoOwnerRefs bool
101103

102104
Overrides ConfigOverrideArgs
103105
}
104106

105107
// ConfigOverrideArgs are args that override config file options
106108
type ConfigOverrideArgs struct {
107-
NoPublish *bool
108-
109+
NoPublish *bool
110+
NoOwnerRefs *bool
109111
FeatureSources *utils.StringSliceVal
110112
LabelSources *utils.StringSliceVal
111113
}
@@ -265,7 +267,44 @@ func (w *nfdWorker) runFeatureDiscovery() error {
265267
return nil
266268
}
267269

268-
// Run NfdWorker client. Returns if a fatal error is encountered, or, after
270+
// Set owner ref
271+
func (w *nfdWorker) setOwnerReference() error {
272+
ownerReference := []metav1.OwnerReference{}
273+
274+
if !w.config.Core.NoOwnerRefs {
275+
// Get pod owner reference
276+
podName := os.Getenv("POD_NAME")
277+
// Add pod owner reference if it exists
278+
if podName != "" {
279+
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
280+
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
281+
return err
282+
} else {
283+
ownerReference = append(ownerReference, selfPod.OwnerReferences...)
284+
}
285+
286+
podUID := os.Getenv("POD_UID")
287+
if podUID != "" {
288+
ownerReference = append(ownerReference, metav1.OwnerReference{
289+
APIVersion: "v1",
290+
Kind: "Pod",
291+
Name: podName,
292+
UID: types.UID(podUID),
293+
})
294+
} else {
295+
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
296+
}
297+
} else {
298+
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
299+
}
300+
}
301+
302+
w.ownerReference = ownerReference
303+
304+
return nil
305+
}
306+
307+
// Run NfdWorker client. Returns an error if a fatal error is encountered, or, after
269308
// one request if OneShot is set to 'true' in the worker args.
270309
func (w *nfdWorker) Run() error {
271310
klog.InfoS("Node Feature Discovery Worker", "version", version.Get(), "nodeName", utils.NodeName(), "namespace", w.kubernetesNamespace)
@@ -281,37 +320,6 @@ func (w *nfdWorker) Run() error {
281320
labelTrigger.Reset(w.config.Core.SleepInterval.Duration)
282321
defer labelTrigger.Stop()
283322

284-
// Create owner ref
285-
ownerReference := []metav1.OwnerReference{}
286-
// Get pod owner reference
287-
podName := os.Getenv("POD_NAME")
288-
289-
// Add pod owner reference if it exists
290-
if podName != "" {
291-
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
292-
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
293-
return err
294-
} else {
295-
ownerReference = append(ownerReference, selfPod.OwnerReferences...)
296-
}
297-
298-
podUID := os.Getenv("POD_UID")
299-
if podUID != "" {
300-
ownerReference = append(ownerReference, metav1.OwnerReference{
301-
APIVersion: "v1",
302-
Kind: "Pod",
303-
Name: podName,
304-
UID: types.UID(podUID),
305-
})
306-
} else {
307-
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
308-
}
309-
} else {
310-
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
311-
}
312-
313-
w.ownerReference = ownerReference
314-
315323
// Register to metrics server
316324
if w.args.MetricsPort > 0 {
317325
m := utils.CreateMetricsServer(w.args.MetricsPort,
@@ -466,6 +474,11 @@ func (w *nfdWorker) configureCore(c coreConfig) error {
466474
klogV.InfoS("enabled label sources", "labelSources", n)
467475
}
468476

477+
err = w.setOwnerReference()
478+
if err != nil {
479+
return err
480+
}
481+
469482
return nil
470483
}
471484

@@ -511,6 +524,9 @@ func (w *nfdWorker) configure(filepath string, overrides string) error {
511524
if w.args.Overrides.NoPublish != nil {
512525
c.Core.NoPublish = *w.args.Overrides.NoPublish
513526
}
527+
if w.args.Overrides.NoOwnerRefs != nil {
528+
c.Core.NoOwnerRefs = *w.args.Overrides.NoOwnerRefs
529+
}
514530
if w.args.Overrides.FeatureSources != nil {
515531
c.Core.FeatureSources = *w.args.Overrides.FeatureSources
516532
}

0 commit comments

Comments
 (0)