From b6ffc5c021d135dc9bbdf01b093d3a3217fe52fe Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Wed, 27 Nov 2024 11:39:13 +0100 Subject: [PATCH] set pod as the ownerRef for the csiaddons The pod might move to new nodes and this might create the stale CSIAddonsNode object. so, we need to set the pod as the owner for the deployment as we dont store any details that are required later on for any other operations like Fencing etc. Signed-off-by: Madhu Rajanna --- .../internal/csiaddonsnode/csiaddonsnode.go | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/sidecar/internal/csiaddonsnode/csiaddonsnode.go b/sidecar/internal/csiaddonsnode/csiaddonsnode.go index 402cf7886..a3ef7b29e 100644 --- a/sidecar/internal/csiaddonsnode/csiaddonsnode.go +++ b/sidecar/internal/csiaddonsnode/csiaddonsnode.go @@ -30,6 +30,7 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -138,6 +139,8 @@ func (mgr *Manager) newCSIAddonsNode(node *csiaddonsv1alpha1.CSIAddonsNode) erro csiaddonNode.ResourceVersion = resourceVersion } node.Spec.DeepCopyInto(&csiaddonNode.Spec) + // set the ownerReferences + csiaddonNode.ObjectMeta.OwnerReferences = node.ObjectMeta.OwnerReferences return nil }) @@ -188,7 +191,10 @@ func (mgr *Manager) getCSIAddonsNode() (*csiaddonsv1alpha1.CSIAddonsNode, error) return nil, fmt.Errorf("%w: pod has no owner", errInvalidConfig) } - ownerReferences := []v1.OwnerReference{} + ownerKindForCSIAddonsName := "" + ownerNameForCSIAddonsName := "" + + ownerReferences := make([]v1.OwnerReference, 1) if pod.OwnerReferences[0].Kind == "ReplicaSet" { // If the pod is owned by a ReplicaSet, we need to get the owner of the ReplicaSet i.e. Deployment rs, err := mgr.KubeClient.AppsV1().ReplicaSets(mgr.PodNamespace).Get(context.TODO(), pod.OwnerReferences[0].Name, v1.GetOptions{}) @@ -198,14 +204,28 @@ func (mgr *Manager) getCSIAddonsNode() (*csiaddonsv1alpha1.CSIAddonsNode, error) if len(rs.OwnerReferences) == 0 { return nil, fmt.Errorf("%w: replicaset has no owner", errInvalidConfig) } - ownerReferences = append(ownerReferences, rs.OwnerReferences[0]) + ownerKindForCSIAddonsName = rs.OwnerReferences[0].Kind + ownerNameForCSIAddonsName = rs.OwnerReferences[0].Name + + // The pod might move to new nodes and this might create the stale CSIAddonsNode object. + // So, we need to set the pod as the owner for the deployment as we dont store any details + // that are required later on for any other operations like Fencing etc. + ownerReferences[0] = v1.OwnerReference{ + APIVersion: "v1", + Kind: "Pod", + Name: pod.Name, + UID: types.UID(mgr.PodUID), + } } else { + ownerKindForCSIAddonsName = pod.OwnerReferences[0].Kind + ownerNameForCSIAddonsName = pod.OwnerReferences[0].Name // If the pod is owned by DeamonSet or StatefulSet get the owner of the pod. - ownerReferences = append(ownerReferences, pod.OwnerReferences[0]) + ownerReferences[0] = pod.OwnerReferences[0] } + // we need to have the constant name for the CSIAddonsNode object. // We will use the nodeID and the ownerName for the CSIAddonsNode object name. - name, err := generateName(mgr.Node, mgr.PodNamespace, ownerReferences[0].Kind, ownerReferences[0].Name) + name, err := generateName(mgr.Node, mgr.PodNamespace, ownerKindForCSIAddonsName, ownerNameForCSIAddonsName) if err != nil { return nil, fmt.Errorf("failed to generate name: %w", err) }