Skip to content

Commit 283caf2

Browse files
ArangoGutierrezk8s-infra-cherrypick-robot
authored andcommitted
Use worker DS OwnerReference for NF's
Signed-off-by: Carlos Eduardo Arango Gutierrez <[email protected]>
1 parent 8988415 commit 283caf2

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
@@ -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"
805834
func (c *sourcesConfig) UnmarshalJSON(data []byte) error {
806835
// First do a raw parse to get the per-source data

0 commit comments

Comments
 (0)