From 4341f8dbd0f01b809df9e194f93592e3f032bc68 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakivskyy Date: Wed, 5 Feb 2025 19:17:47 +0200 Subject: [PATCH] nfd-worker: Add support to configure the ownerReference to Node Signed-off-by: Oleg Zhurakivskyy --- cmd/nfd-worker/main.go | 4 + .../reference/worker-commandline-reference.md | 17 ++++ .../worker-configuration-reference.md | 18 ++++ pkg/nfd-worker/nfd-worker.go | 87 ++++++++++++------- 4 files changed, 96 insertions(+), 30 deletions(-) diff --git a/cmd/nfd-worker/main.go b/cmd/nfd-worker/main.go index 120db537a..68cfbb801 100644 --- a/cmd/nfd-worker/main.go +++ b/cmd/nfd-worker/main.go @@ -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 } }) @@ -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.") diff --git a/docs/reference/worker-commandline-reference.md b/docs/reference/worker-commandline-reference.md index 6d281e154..3bee73dae 100644 --- a/docs/reference/worker-commandline-reference.md +++ b/docs/reference/worker-commandline-reference.md @@ -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 diff --git a/docs/reference/worker-configuration-reference.md b/docs/reference/worker-configuration-reference.md index e51353ee0..9c5db0f10 100644 --- a/docs/reference/worker-configuration-reference.md +++ b/docs/reference/worker-configuration-reference.md @@ -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. diff --git a/pkg/nfd-worker/nfd-worker.go b/pkg/nfd-worker/nfd-worker.go index 8021cc46e..5644ebf05 100644 --- a/pkg/nfd-worker/nfd-worker.go +++ b/pkg/nfd-worker/nfd-worker.go @@ -79,6 +79,7 @@ type coreConfig struct { LabelWhiteList utils.RegexpVal NoPublish bool NoOwnerRefs bool + OwnerRefNode bool FeatureSources []string Sources *[]string LabelSources []string @@ -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 } @@ -107,6 +109,7 @@ type Args struct { type ConfigOverrideArgs struct { NoPublish *bool NoOwnerRefs *bool + OwnerRefNode *bool FeatureSources *utils.StringSliceVal LabelSources *utils.StringSliceVal } @@ -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 { - klog.InfoS("Cannot append POD ownerReference to NodeFeature, POD_UID not specified") - } } else { - klog.InfoS("Cannot set NodeFeature owner references, POD_NAME not specified") + // 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 set NodeFeature owner references, POD_NAME not specified") + } } } @@ -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 }