@@ -39,6 +39,7 @@ import (
3939 "k8s.io/apimachinery/pkg/api/errors"
4040 "k8s.io/apimachinery/pkg/types"
4141 "k8s.io/apimachinery/pkg/util/validation"
42+ "k8s.io/client-go/kubernetes"
4243 "k8s.io/klog/v2"
4344 klogutils "sigs.k8s.io/node-feature-discovery/pkg/utils/klog"
4445 "sigs.k8s.io/yaml"
@@ -134,6 +135,7 @@ type nfdWorker struct {
134135 stop chan struct {} // channel for signaling stop
135136 featureSources []source.FeatureSource
136137 labelSources []source.LabelSource
138+ ownerReference []metav1.OwnerReference
137139}
138140
139141// This ticker can represent infinite and normal intervals.
@@ -271,6 +273,36 @@ func (w *nfdWorker) Run() error {
271273 labelTrigger .Reset (w .config .Core .SleepInterval .Duration )
272274 defer labelTrigger .Stop ()
273275
276+ // Get pod owner reference
277+ podName := os .Getenv ("POD_NAME" )
278+ client , err := w .getKubeClient ()
279+ if err != nil {
280+ return fmt .Errorf ("failed to get kube client: %w" , err )
281+ }
282+
283+ selfPod , err := client .CoreV1 ().Pods (w .kubernetesNamespace ).Get (context .TODO (), podName , metav1.GetOptions {})
284+ if err != nil {
285+ return fmt .Errorf ("failed to get pod %q: %w" , podName , err )
286+ }
287+
288+ // Create owner ref
289+ ownerReference := selfPod .OwnerReferences
290+
291+ // Add pod owner reference if it exists
292+ podUID := os .Getenv ("POD_UID" )
293+ if podName != "" && podUID != "" {
294+ isTrue := true
295+ ownerReference = append (ownerReference , metav1.OwnerReference {
296+ APIVersion : "v1" ,
297+ Kind : "Pod" ,
298+ Name : podName ,
299+ UID : types .UID (podUID ),
300+ Controller : & isTrue ,
301+ })
302+ }
303+
304+ w .ownerReference = ownerReference
305+
274306 // Register to metrics server
275307 if w .args .MetricsPort > 0 {
276308 m := utils .CreateMetricsServer (w .args .MetricsPort ,
@@ -713,25 +745,6 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
713745
714746 features := source .GetAllFeatures ()
715747
716- // Create owner ref
717- ownerRefs := []metav1.OwnerReference {}
718- podName := os .Getenv ("POD_NAME" )
719- podUID := os .Getenv ("POD_UID" )
720- if podName != "" && podUID != "" {
721- isTrue := true
722- ownerRefs = []metav1.OwnerReference {
723- {
724- APIVersion : "v1" ,
725- Kind : "Pod" ,
726- Name : podName ,
727- UID : types .UID (podUID ),
728- Controller : & isTrue ,
729- },
730- }
731- } else {
732- klog .InfoS ("Cannot set NodeFeature owner reference, POD_NAME and/or POD_UID not specified" )
733- }
734-
735748 // TODO: we could implement some simple caching of the object, only get it
736749 // every 10 minutes or so because nobody else should really be modifying it
737750 if nfr , err := cli .NfdV1alpha1 ().NodeFeatures (namespace ).Get (context .TODO (), nodename , metav1.GetOptions {}); errors .IsNotFound (err ) {
@@ -740,7 +753,7 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
740753 Name : nodename ,
741754 Annotations : map [string ]string {nfdv1alpha1 .WorkerVersionAnnotation : version .Get ()},
742755 Labels : map [string ]string {nfdv1alpha1 .NodeFeatureObjNodeNameLabel : nodename },
743- OwnerReferences : ownerRefs ,
756+ OwnerReferences : m . ownerReference ,
744757 },
745758 Spec : nfdv1alpha1.NodeFeatureSpec {
746759 Features : * features ,
@@ -761,7 +774,7 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
761774 nfrUpdated := nfr .DeepCopy ()
762775 nfrUpdated .Annotations = map [string ]string {nfdv1alpha1 .WorkerVersionAnnotation : version .Get ()}
763776 nfrUpdated .Labels = map [string ]string {nfdv1alpha1 .NodeFeatureObjNodeNameLabel : nodename }
764- nfrUpdated .OwnerReferences = ownerRefs
777+ nfrUpdated .OwnerReferences = m . ownerReference
765778 nfrUpdated .Spec = nfdv1alpha1.NodeFeatureSpec {
766779 Features : * features ,
767780 Labels : labels ,
@@ -801,6 +814,22 @@ func (m *nfdWorker) getNfdClient() (*nfdclient.Clientset, error) {
801814 return c , nil
802815}
803816
817+ func (m * nfdWorker ) getKubeClient () (* kubernetes.Clientset , error ) {
818+ // creates the in-cluster config
819+ kubeconfig , err := utils .GetKubeconfig (m .args .Kubeconfig )
820+ if err != nil {
821+ return nil , err
822+ }
823+
824+ // creates the clientset
825+ clientset , err := kubernetes .NewForConfig (kubeconfig )
826+ if err != nil {
827+ return nil , err
828+ }
829+
830+ return clientset , nil
831+ }
832+
804833// UnmarshalJSON implements the Unmarshaler interface from "encoding/json"
805834func (c * sourcesConfig ) UnmarshalJSON (data []byte ) error {
806835 // First do a raw parse to get the per-source data
0 commit comments