Skip to content

Commit

Permalink
Fix the pod name for comDetails
Browse files Browse the repository at this point in the history
Modifies the function for creating comDetails,
so the pod name will be more accurate.

We fetch the name from the OwnerReference, and modify the
name if needed.

Added unit tests for the function.

Signed-off-by: Lior Noy <[email protected]>
  • Loading branch information
liornoy committed Jun 26, 2024
1 parent d97ed0f commit 7b29f60
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 1 deletion.
37 changes: 36 additions & 1 deletion endpointslices/endpointslices.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package endpointslices
import (
"context"
"fmt"
"strings"

log "github.com/sirupsen/logrus"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -200,6 +201,37 @@ func getContainerName(portNum int, pods []corev1.Pod) (string, error) {
return res, nil
}

func getPodName(pod *corev1.Pod) (string, error) {
var (
res string
found bool
)

if len(pod.OwnerReferences) == 0 {
res, found = strings.CutSuffix(pod.Name, fmt.Sprintf("-%s", pod.Spec.NodeName))
if !found {
return "", fmt.Errorf("pod name %s is not ending with node name %s", pod.Name, pod.Spec.NodeName)
}

return res, nil
}

name := pod.OwnerReferences[0].Name
switch pod.OwnerReferences[0].Kind {
case "Node":
res, found = strings.CutSuffix(pod.Name, fmt.Sprintf("-%s", pod.Spec.NodeName))
if !found {
return "", fmt.Errorf("pod name %s is not ending with node name %s", pod.Name, pod.Spec.NodeName)
}
case "ReplicaSet":
res = name[:strings.LastIndex(name, "-")]
default:
res = name
}

return res, nil
}

func (epSliceinfo *EndpointSlicesInfo) toComDetails(nodes []corev1.Node) ([]types.ComDetails, error) {
if len(epSliceinfo.EndpointSlice.OwnerReferences) == 0 {
return nil, fmt.Errorf("empty OwnerReferences in EndpointSlice %s/%s. skipping", epSliceinfo.EndpointSlice.Namespace, epSliceinfo.EndpointSlice.Name)
Expand All @@ -209,7 +241,10 @@ func (epSliceinfo *EndpointSlicesInfo) toComDetails(nodes []corev1.Node) ([]type

// Get the Namespace and Pod's name from the service.
namespace := epSliceinfo.Service.Namespace
name := epSliceinfo.EndpointSlice.OwnerReferences[0].Name
name, err := getPodName(&epSliceinfo.Pods[0])
if err != nil {
return nil, fmt.Errorf("failed to get pod name for endpointslice %s: %w", epSliceinfo.EndpointSlice.Name, err)
}

// Get the node roles of this endpointslice. (master or worker or both).
roles := getEndpointSliceNodeRoles(epSliceinfo, nodes)
Expand Down
85 changes: 85 additions & 0 deletions endpointslices/endpointslices_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package endpointslices

import (
"testing"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type TestCase struct {
desc string
podName string
nodeName string
ownerRefs []metav1.OwnerReference
expected string
}

func TestGetPodName(t *testing.T) {
tests := []TestCase{
{
desc: "with-no-owner-reference",
nodeName: "worker-node",
podName: "kube-rbac-proxy-worker-node",
expected: "kube-rbac-proxy",
},
{
desc: "with-owner-reference-kind-node",
nodeName: "worker-node",
podName: "kube-rbac-proxy-worker-node",
ownerRefs: []metav1.OwnerReference{
{
Kind: "Node",
},
},
expected: "kube-rbac-proxy",
},
{
desc: "with-owner-reference-kind-ReplicaSet",
ownerRefs: []metav1.OwnerReference{
{
Kind: "ReplicaSet",
Name: "kube-rbac-proxy-7b7df454c7",
},
},
expected: "kube-rbac-proxy",
},
{
desc: "with-owner-reference-kind-DaemonSet",
ownerRefs: []metav1.OwnerReference{
{
Kind: "DaemonSet",
Name: "kube-rbac-proxy",
},
},
expected: "kube-rbac-proxy",
},
{
desc: "with-owner-reference-kind-StatefulSet",
ownerRefs: []metav1.OwnerReference{
{
Kind: "StatefulSet",
Name: "kube-rbac-proxy",
},
},
expected: "kube-rbac-proxy",
},
}
for _, test := range tests {
p := defineTestPod(&test)
res, err := getPodName(p)
if err != nil {
t.Fatalf("test %s failed. got error: %s", test.desc, err)
}
if res != test.expected {
t.Fatalf("test %s failed. expected %v got %v", test.desc, test.expected, res)
}
}
}

func defineTestPod(t *TestCase) *corev1.Pod {
return &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: t.podName, OwnerReferences: t.ownerRefs},
Spec: corev1.PodSpec{NodeName: t.nodeName},
}
}

0 comments on commit 7b29f60

Please sign in to comment.