Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nfd-worker: Add support to configure the ownerReference to Node #2041

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cmd/nfd-worker/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ func parseArgs(flags *flag.FlagSet, osArgs ...string) *worker.Args {
args.Overrides.LabelSources = overrides.LabelSources
case "no-owner-refs":
args.Overrides.NoOwnerRefs = overrides.NoOwnerRefs
case "owner-ref-node":
args.Overrides.OwnerRefNode = overrides.OwnerRefNode
}
})

Expand Down Expand Up @@ -125,6 +127,8 @@ func initFlags(flagset *flag.FlagSet) (*worker.Args, *worker.ConfigOverrideArgs)
"Do not publish discovered features, disable connection to nfd-master and don't create NodeFeature object.")
overrides.NoOwnerRefs = flagset.Bool("no-owner-refs", false,
"Do not set owner references for NodeFeature object.")
overrides.OwnerRefNode = flagset.Bool("owner-ref-node", false,
"Set the owner reference for NodeFeature object to Node.")
flagset.Var(overrides.FeatureSources, "feature-sources",
"Comma separated list of feature sources. Special value 'all' enables all sources. "+
"Prefix the source name with '-' to disable it.")
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 @@ -179,6 +179,23 @@ Example:
nfd-worker -no-owner-refs
```

### -owner-ref-node

The `-owner-ref-node` flag sets the owner references
of the NodeFeature object to Node.

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

Default: *false*

Example:

```bash
nfd-worker -owner-ref-node
```

### -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 @@ -167,6 +167,24 @@ core:
noOwnerRefs: true
```

### core.ownerRefNode

Setting `core.ownerRefNode` to `true` sets the owner reference
of the NodeFeature object to Node for nfd-worker.

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

Default: `false`

Example:

```yaml
core:
ownerRefNode: true
```

### core.klog

The following options specify the logger configuration.
Expand Down
85 changes: 56 additions & 29 deletions pkg/nfd-worker/nfd-worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ type coreConfig struct {
LabelWhiteList utils.RegexpVal
NoPublish bool
NoOwnerRefs bool
OwnerRefNode bool
FeatureSources []string
Sources *[]string
LabelSources []string
Expand All @@ -92,13 +93,14 @@ type Labels map[string]string

// Args are the command line arguments of NfdWorker.
type Args struct {
ConfigFile string
Klog map[string]*utils.KlogFlagVal
Kubeconfig string
Oneshot bool
Options string
Port int
NoOwnerRefs bool
ConfigFile string
Klog map[string]*utils.KlogFlagVal
Kubeconfig string
Oneshot bool
Options string
Port int
NoOwnerRefs bool
OwnerRefNode bool

Overrides ConfigOverrideArgs
}
Expand All @@ -107,6 +109,7 @@ type Args struct {
type ConfigOverrideArgs struct {
NoPublish *bool
NoOwnerRefs *bool
OwnerRefNode *bool
FeatureSources *utils.StringSliceVal
LabelSources *utils.StringSliceVal
}
Expand Down Expand Up @@ -251,33 +254,54 @@ func (w *nfdWorker) setOwnerReference() error {
ownerReference := []metav1.OwnerReference{}

if !w.config.Core.NoOwnerRefs {
// 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 {
for _, owner := range selfPod.OwnerReferences {
owner.BlockOwnerDeletion = ptr.To(false)
ownerReference = append(ownerReference, owner)
if w.config.Core.OwnerRefNode {
// Get node owner reference
nodeName := os.Getenv("NODE_NAME")
if nodeName != "" {
if selfNode, err := w.k8sClient.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}); err != nil {
klog.ErrorS(err, "failed to get self node, cannot inherit ownerReference for NodeFeature")
return err
} else {
ownerReference = append(ownerReference, metav1.OwnerReference{
APIVersion: "v1",
Kind: "Node",
Name: nodeName,
UID: selfNode.UID,
})
}
} else {
klog.InfoS("Cannot set NodeFeature owner reference to Node, NODE_NAME not specified")
}

podUID := os.Getenv("POD_UID")
if podUID != "" {
ownerReference = append(ownerReference, metav1.OwnerReference{
APIVersion: "v1",
Kind: "Pod",
Name: podName,
UID: types.UID(podUID),
})
} else {
// 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 {
for _, owner := range selfPod.OwnerReferences {
owner.BlockOwnerDeletion = ptr.To(false)
ownerReference = append(ownerReference, owner)
}
}

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 append POD ownerReference to NodeFeature, POD_UID not specified")
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
}
} else {
klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified")
}
}

Expand Down Expand Up @@ -503,6 +527,9 @@ func (w *nfdWorker) configure(filepath string, overrides string) error {
if w.args.Overrides.NoOwnerRefs != nil {
c.Core.NoOwnerRefs = *w.args.Overrides.NoOwnerRefs
}
if w.args.Overrides.OwnerRefNode != nil {
c.Core.OwnerRefNode = *w.args.Overrides.OwnerRefNode
}
if w.args.Overrides.FeatureSources != nil {
c.Core.FeatureSources = *w.args.Overrides.FeatureSources
}
Expand Down