Skip to content

Commit

Permalink
nfd-worker: Add an option to disable setting the owner references
Browse files Browse the repository at this point in the history
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 <oleg.zhurakivskyy@intel.com>
  • Loading branch information
ozhuraki committed Aug 30, 2024
1 parent 1fa31a5 commit f825f86
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 27 deletions.
2 changes: 2 additions & 0 deletions cmd/nfd-worker/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ func initFlags(flagset *flag.FlagSet) (*worker.Args, *worker.ConfigOverrideArgs)
" DEPRECATED: will be removed in a future release along with the deprecated gRPC API.")
flagset.StringVar(&args.Kubeconfig, "kubeconfig", "",
"Kubeconfig to use")
flagset.BoolVar(&args.NoOwnerRefs, "no-owner-refs", false,
"Do not set owner references for NodeFeature object")
flagset.BoolVar(&args.Oneshot, "oneshot", false,
"Do not publish feature labels")
flagset.IntVar(&args.MetricsPort, "metrics", 8081,
Expand Down
17 changes: 17 additions & 0 deletions docs/reference/worker-commandline-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,23 @@ Example:
nfd-worker -no-publish
```

### -no-owner-refs

The `-no-owner-refs` flag disables setting the owner references to Pod
for NodeFeature object.

> **NOTE:** This flag takes precedence over the
> [`core.noOwnerRefs`](worker-configuration-reference.md#corenoownerrefs)
> configuration file option.
Default: *false*

Example:

```bash
nfd-worker -no-owner-refs
```

### -oneshot

The `-oneshot` flag causes nfd-worker to exit after one pass of feature
Expand Down
18 changes: 18 additions & 0 deletions docs/reference/worker-configuration-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,24 @@ core:
noPublish: true
```

### core.noOwnerRefs

Setting `core.noOwnerRefs` to `true` disables setting the owner references
to Pod for NodeFeature object.

> **NOTE:** Overridden by the
> [`-no-owner-refs`](worker-commandline-reference.md#-no-owner-refs)
> command line flag (if specified).

Default: `false`

Example:

```yaml
core:
noOwnerRefs: true
```

### core.klog

The following options specify the logger configuration. Most of which can be
Expand Down
67 changes: 40 additions & 27 deletions pkg/nfd-worker/nfd-worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ type coreConfig struct {
Klog klogutils.KlogConfigOpts
LabelWhiteList utils.RegexpVal
NoPublish bool
NoOwnerRefs bool
FeatureSources []string
Sources *[]string
LabelSources []string
Expand All @@ -103,6 +104,7 @@ type Args struct {
KeyFile string
Klog map[string]*utils.KlogFlagVal
Kubeconfig string
NoOwnerRefs bool
Oneshot bool
Options string
Server string
Expand Down Expand Up @@ -292,6 +294,41 @@ func (w *nfdWorker) runFeatureDiscovery() error {
return nil
}

func (w *nfdWorker) addOwnerReference() error {
ownerReference := []metav1.OwnerReference{}

// Get pod owner reference
podName := os.Getenv("POD_NAME")

// Add pod owner reference if it exists
if podName != "" {
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
return err
} else {
ownerReference = append(ownerReference, selfPod.OwnerReferences...)
}

podUID := os.Getenv("POD_UID")
if podUID != "" {
ownerReference = append(ownerReference, metav1.OwnerReference{
APIVersion: "v1",
Kind: "Pod",
Name: podName,
UID: types.UID(podUID),
})
} else {
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
}
} else {
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
}

w.ownerReference = ownerReference

return nil
}

// Run NfdWorker client. Returns if a fatal error is encountered, or, after
// one request if OneShot is set to 'true' in the worker args.
func (w *nfdWorker) Run() error {
Expand Down Expand Up @@ -319,37 +356,13 @@ func (w *nfdWorker) Run() error {
labelTrigger.Reset(w.config.Core.SleepInterval.Duration)
defer labelTrigger.Stop()

// Create owner ref
ownerReference := []metav1.OwnerReference{}
// Get pod owner reference
podName := os.Getenv("POD_NAME")

// Add pod owner reference if it exists
if podName != "" {
if selfPod, err := w.k8sClient.CoreV1().Pods(w.kubernetesNamespace).Get(context.TODO(), podName, metav1.GetOptions{}); err != nil {
klog.ErrorS(err, "failed to get self pod, cannot inherit ownerReference for NodeFeature")
if !w.config.Core.NoOwnerRefs {
err := w.addOwnerReference()
if err != nil {
return err
} else {
ownerReference = append(ownerReference, selfPod.OwnerReferences...)
}

podUID := os.Getenv("POD_UID")
if podUID != "" {
ownerReference = append(ownerReference, metav1.OwnerReference{
APIVersion: "v1",
Kind: "Pod",
Name: podName,
UID: types.UID(podUID),
})
} else {
klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified")
}
} else {
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
}

w.ownerReference = ownerReference

// Register to metrics server
if w.args.MetricsPort > 0 {
m := utils.CreateMetricsServer(w.args.MetricsPort,
Expand Down

0 comments on commit f825f86

Please sign in to comment.