@@ -36,6 +36,7 @@ import (
3636 "k8s.io/apimachinery/pkg/api/errors"
3737 "k8s.io/apimachinery/pkg/types"
3838 "k8s.io/apimachinery/pkg/util/validation"
39+ "k8s.io/client-go/kubernetes"
3940 "k8s.io/klog/v2"
4041 klogutils "sigs.k8s.io/node-feature-discovery/pkg/utils/klog"
4142 "sigs.k8s.io/yaml"
@@ -129,6 +130,7 @@ type nfdWorker struct {
129130 stop chan struct {} // channel for signaling stop
130131 featureSources []source.FeatureSource
131132 labelSources []source.LabelSource
133+ ownerReference []metav1.OwnerReference
132134}
133135
134136// This ticker can represent infinite and normal intervals.
@@ -243,6 +245,36 @@ func (w *nfdWorker) Run() error {
243245 labelTrigger .Reset (w .config .Core .SleepInterval .Duration )
244246 defer labelTrigger .Stop ()
245247
248+ // Get pod owner reference
249+ podName := os .Getenv ("POD_NAME" )
250+ client , err := w .getKubeClient ()
251+ if err != nil {
252+ return fmt .Errorf ("failed to get kube client: %w" , err )
253+ }
254+
255+ selfPod , err := client .CoreV1 ().Pods (w .kubernetesNamespace ).Get (context .TODO (), podName , metav1.GetOptions {})
256+ if err != nil {
257+ return fmt .Errorf ("failed to get pod %q: %w" , podName , err )
258+ }
259+
260+ // Create owner ref
261+ ownerReference := selfPod .OwnerReferences
262+
263+ // Add pod owner reference if it exists
264+ podUID := os .Getenv ("POD_UID" )
265+ if podName != "" && podUID != "" {
266+ isTrue := true
267+ ownerReference = append (ownerReference , metav1.OwnerReference {
268+ APIVersion : "v1" ,
269+ Kind : "Pod" ,
270+ Name : podName ,
271+ UID : types .UID (podUID ),
272+ Controller : & isTrue ,
273+ })
274+ }
275+
276+ w .ownerReference = ownerReference
277+
246278 // Register to metrics server
247279 if w .args .MetricsPort > 0 {
248280 m := utils .CreateMetricsServer (w .args .MetricsPort ,
@@ -673,25 +705,6 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
673705
674706 features := source .GetAllFeatures ()
675707
676- // Create owner ref
677- ownerRefs := []metav1.OwnerReference {}
678- podName := os .Getenv ("POD_NAME" )
679- podUID := os .Getenv ("POD_UID" )
680- if podName != "" && podUID != "" {
681- isTrue := true
682- ownerRefs = []metav1.OwnerReference {
683- {
684- APIVersion : "v1" ,
685- Kind : "Pod" ,
686- Name : podName ,
687- UID : types .UID (podUID ),
688- Controller : & isTrue ,
689- },
690- }
691- } else {
692- klog .InfoS ("Cannot set NodeFeature owner reference, POD_NAME and/or POD_UID not specified" )
693- }
694-
695708 // TODO: we could implement some simple caching of the object, only get it
696709 // every 10 minutes or so because nobody else should really be modifying it
697710 if nfr , err := cli .NfdV1alpha1 ().NodeFeatures (namespace ).Get (context .TODO (), nodename , metav1.GetOptions {}); errors .IsNotFound (err ) {
@@ -701,7 +714,7 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
701714 Name : nodename ,
702715 Annotations : map [string ]string {nfdv1alpha1 .WorkerVersionAnnotation : version .Get ()},
703716 Labels : map [string ]string {nfdv1alpha1 .NodeFeatureObjNodeNameLabel : nodename },
704- OwnerReferences : ownerRefs ,
717+ OwnerReferences : m . ownerReference ,
705718 },
706719 Spec : nfdv1alpha1.NodeFeatureSpec {
707720 Features : * features ,
@@ -721,7 +734,7 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
721734 nfrUpdated := nfr .DeepCopy ()
722735 nfrUpdated .Annotations = map [string ]string {nfdv1alpha1 .WorkerVersionAnnotation : version .Get ()}
723736 nfrUpdated .Labels = map [string ]string {nfdv1alpha1 .NodeFeatureObjNodeNameLabel : nodename }
724- nfrUpdated .OwnerReferences = ownerRefs
737+ nfrUpdated .OwnerReferences = m . ownerReference
725738 nfrUpdated .Spec = nfdv1alpha1.NodeFeatureSpec {
726739 Features : * features ,
727740 Labels : labels ,
@@ -761,6 +774,22 @@ func (m *nfdWorker) getNfdClient() (*nfdclient.Clientset, error) {
761774 return c , nil
762775}
763776
777+ func (m * nfdWorker ) getKubeClient () (* kubernetes.Clientset , error ) {
778+ // creates the in-cluster config
779+ kubeconfig , err := utils .GetKubeconfig (m .args .Kubeconfig )
780+ if err != nil {
781+ return nil , err
782+ }
783+
784+ // creates the clientset
785+ clientset , err := kubernetes .NewForConfig (kubeconfig )
786+ if err != nil {
787+ return nil , err
788+ }
789+
790+ return clientset , nil
791+ }
792+
764793// UnmarshalJSON implements the Unmarshaler interface from "encoding/json"
765794func (c * sourcesConfig ) UnmarshalJSON (data []byte ) error {
766795 // First do a raw parse to get the per-source data
0 commit comments