Skip to content

Commit c4a869b

Browse files
Use worker DS OwnerReference for NF's
Signed-off-by: Carlos Eduardo Arango Gutierrez <[email protected]>
1 parent 46d5026 commit c4a869b

File tree

3 files changed

+62
-22
lines changed

3 files changed

+62
-22
lines changed

deployment/base/rbac/worker-role.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ rules:
1111
- create
1212
- get
1313
- update
14+
- apiGroups:
15+
- ""
16+
resources:
17+
- pods
18+
verbs:
19+
- get

deployment/helm/node-feature-discovery/templates/role.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,10 @@ rules:
1515
- create
1616
- get
1717
- update
18+
- apiGroups:
19+
- ""
20+
resources:
21+
- pods
22+
verbs:
23+
- get
1824
{{- end }}
19-

pkg/nfd-worker/nfd-worker.go

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
765794
func (c *sourcesConfig) UnmarshalJSON(data []byte) error {
766795
// First do a raw parse to get the per-source data

0 commit comments

Comments
 (0)