Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix key and ownerRef bug #718

Merged
merged 2 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion internal/controller/csiaddons/csiaddonsnode_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,9 @@ func (r *CSIAddonsNodeReconciler) Reconcile(ctx context.Context, req ctrl.Reques

// namespace + "/" + leader identity(pod name) is the key for the connection.
// this key is used by GetLeaderByDriver to get the connection
key := csiAddonsNode.Namespace + "/" + podName
// util.NormalizeLeaseName() is used to sanitize the leader identity used for the leases
// csiaddonsnode need to store the key with same format so that it can be used to get the connection.
key := csiAddonsNode.Namespace + "/" + util.NormalizeLeaseName(podName)

logger = logger.WithValues("EndPoint", endPoint)

Expand Down
29 changes: 25 additions & 4 deletions sidecar/internal/csiaddonsnode/csiaddonsnode.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
})

Expand Down Expand Up @@ -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{})
Expand All @@ -198,14 +204,29 @@ 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 (created using deployment) 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 CSIAddonsNode 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)
}
Expand Down
Loading