From ff77e76287c9de17dd08412f278ab2eb19563798 Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 17:03:58 +0300 Subject: [PATCH 1/6] Fix getPodWorkloadObject to work with more workloads names which contains hyphens --- .github/workflows/build.yaml | 6 +- odiglet/Makefile | 5 +- odiglet/pkg/kube/instrumentation_ebpf/pods.go | 2 +- .../kube/instrumentation_ebpf/pods_test.go | 114 ++++++++++++++++++ 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 odiglet/pkg/kube/instrumentation_ebpf/pods_test.go diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ac39ba033..c7609a1cc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -50,7 +50,7 @@ jobs: run: | make test - build-odiglet: + build-and-test-odiglet: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -63,6 +63,10 @@ jobs: context: . push: false tags: odiglet:pr-${{ github.event.number }} + - name: run tests + working-directory: ./odiglet + run: | + make test build-frontend: runs-on: ubuntu-latest steps: diff --git a/odiglet/Makefile b/odiglet/Makefile index f94f921a8..b3d093abe 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -10,4 +10,7 @@ generate: go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ cd $$GO_AUTO_PATH && \ - make generate \ No newline at end of file + make generate + +test: + go test -v ./... \ No newline at end of file diff --git a/odiglet/pkg/kube/instrumentation_ebpf/pods.go b/odiglet/pkg/kube/instrumentation_ebpf/pods.go index 321cd27ee..4882f62f5 100644 --- a/odiglet/pkg/kube/instrumentation_ebpf/pods.go +++ b/odiglet/pkg/kube/instrumentation_ebpf/pods.go @@ -95,7 +95,7 @@ func (p *PodsReconciler) getPodWorkloadObject(ctx context.Context, pod *corev1.P for _, owner := range pod.OwnerReferences { if owner.Kind == "ReplicaSet" { // ReplicaSet name is in the format - - hyphenIndex := strings.Index(owner.Name, "-") + hyphenIndex := strings.LastIndex(owner.Name, "-") if hyphenIndex == -1 { // It is possible for a user to define a bare ReplicaSet without a deployment, currently not supporting this return nil, errors.New("replicaset name does not contain a hyphen") diff --git a/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go b/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go new file mode 100644 index 000000000..9caa3690c --- /dev/null +++ b/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go @@ -0,0 +1,114 @@ +package instrumentation_ebpf + +import ( + "context" + "testing" + + "github.com/odigos-io/odigos/common" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestGetPodWorkloadObject(t *testing.T) { + pr := &PodsReconciler{} + cases := []struct{ + name string + pod *corev1.Pod + expectedWorkload common.PodWorkload + }{ + { + name: "pod in deployment", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta { + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "ReplicaSet", + Name: "deployment-1234", + }, + }, + Namespace: "default", + }, + }, + expectedWorkload: common.PodWorkload{ + Kind: "Deployment", + Name: "deployment", + Namespace: "default", + }, + }, + { + name: "pod with hyphen in name of deployment", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta { + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "ReplicaSet", + Name: "deployment-foo-5678", + }, + }, + Namespace: "default", + }, + }, + expectedWorkload: common.PodWorkload{ + Kind: "Deployment", + Name: "deployment-foo", + Namespace: "default", + }, + }, + { + name: "pod in DaemonSet", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta { + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "DaemonSet", + Name: "someDaemonSet-1234", + }, + }, + Namespace: "default", + }, + }, + expectedWorkload: common.PodWorkload{ + Kind: "DaemonSet", + Name: "someDaemonSet", + Namespace: "default", + }, + }, + { + name: "pod in StatefulSet", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta { + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "StatefulSet", + Name: "someStatefulSet-1234", + }, + }, + Namespace: "default", + }, + }, + expectedWorkload: common.PodWorkload{ + Kind: "StatefulSet", + Name: "someStatefulSet", + Namespace: "default", + }, + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + workload, err := pr.getPodWorkloadObject(context.Background(), c.pod) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if workload.Kind != c.expectedWorkload.Kind { + t.Errorf("expected kind %s, got %s", c.expectedWorkload.Kind, workload.Kind) + } + if workload.Name != c.expectedWorkload.Name { + t.Errorf("expected name %s, got %s", c.expectedWorkload.Name, workload.Name) + } + if workload.Namespace != c.expectedWorkload.Namespace { + t.Errorf("expected namespace %s, got %s", c.expectedWorkload.Namespace, workload.Namespace) + } + }) + } +} \ No newline at end of file From 725025eb5dc3b5b0e89fd09e55ba9332dbd8bf98 Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 17:49:11 +0300 Subject: [PATCH 2/6] add odiglet tests to CI --- .github/workflows/build.yaml | 3 +++ odiglet/Makefile | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c7609a1cc..728ce0f30 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -63,6 +63,9 @@ jobs: context: . push: false tags: odiglet:pr-${{ github.event.number }} + - name: Install build dependencies + run: | + sudo apt-get update && sudo apt-get install -y clang llvm libbpf-dev - name: run tests working-directory: ./odiglet run: | diff --git a/odiglet/Makefile b/odiglet/Makefile index b3d093abe..a27c754b9 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -6,11 +6,11 @@ build-odiglet: generate debug-build-odiglet: generate go build -o odiglet -gcflags "all=-N -l" cmd/main.go +test: generate + go test -v ./... + generate: go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ cd $$GO_AUTO_PATH && \ - make generate - -test: - go test -v ./... \ No newline at end of file + make generate \ No newline at end of file From 9a8a0bc9176c1e533d28f02d2ae750806a767126 Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 18:25:49 +0300 Subject: [PATCH 3/6] try to run odiglet tests in CI --- odiglet/Makefile | 12 ++++++++---- .../pkg/kube/instrumentation_ebpf/pods_test.go | 4 ++-- odiglet/pkg/process/process_other.go | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 odiglet/pkg/process/process_other.go diff --git a/odiglet/Makefile b/odiglet/Makefile index a27c754b9..3c737c293 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -6,11 +6,15 @@ build-odiglet: generate debug-build-odiglet: generate go build -o odiglet -gcflags "all=-N -l" cmd/main.go -test: generate - go test -v ./... - generate: go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ cd $$GO_AUTO_PATH && \ - make generate \ No newline at end of file + make generate + +test: + GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ + sudo chmod -R +w $$GO_AUTO_PATH + cd $$GO_AUTO_PATH && \ + make generate + go test -v ./... \ No newline at end of file diff --git a/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go b/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go index 9caa3690c..60a30c6d3 100644 --- a/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go +++ b/odiglet/pkg/kube/instrumentation_ebpf/pods_test.go @@ -61,7 +61,7 @@ func TestGetPodWorkloadObject(t *testing.T) { OwnerReferences: []metav1.OwnerReference{ { Kind: "DaemonSet", - Name: "someDaemonSet-1234", + Name: "someDaemonSet", }, }, Namespace: "default", @@ -80,7 +80,7 @@ func TestGetPodWorkloadObject(t *testing.T) { OwnerReferences: []metav1.OwnerReference{ { Kind: "StatefulSet", - Name: "someStatefulSet-1234", + Name: "someStatefulSet", }, }, Namespace: "default", diff --git a/odiglet/pkg/process/process_other.go b/odiglet/pkg/process/process_other.go new file mode 100644 index 000000000..30bc2b049 --- /dev/null +++ b/odiglet/pkg/process/process_other.go @@ -0,0 +1,17 @@ +//go:build !linux + +package process + +import procdiscovery "github.com/odigos-io/odigos/procdiscovery/pkg/process" + +// These functions are stubs for non-linux platforms to allow running tests on them. + +func isPodContainerPredicate(_ string, _ string) func(string) bool { + return func(procDirName string) bool { + return false + } +} + +func FindAllInContainer(podUID string, containerName string) ([]procdiscovery.Details, error) { + return nil, nil +} \ No newline at end of file From 2789abd60770d25f47e02de91d5644817f48508a Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 18:29:46 +0300 Subject: [PATCH 4/6] add go mod download to make test target --- odiglet/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/odiglet/Makefile b/odiglet/Makefile index 3c737c293..89d45b600 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -13,6 +13,7 @@ generate: make generate test: + go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ sudo chmod -R +w $$GO_AUTO_PATH cd $$GO_AUTO_PATH && \ From 121c5ab25a215602a8925ab2515daf75724da63c Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 18:33:50 +0300 Subject: [PATCH 5/6] fix makefile --- odiglet/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odiglet/Makefile b/odiglet/Makefile index 89d45b600..d26567cde 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -15,7 +15,7 @@ generate: test: go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ - sudo chmod -R +w $$GO_AUTO_PATH + sudo chmod -R +w $$GO_AUTO_PATH && \ cd $$GO_AUTO_PATH && \ make generate go test -v ./... \ No newline at end of file From bf3a8f85e401c0324e1f8a3d983a434bcba9316e Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Mon, 1 Jul 2024 18:37:45 +0300 Subject: [PATCH 6/6] fix makefile - use tabs --- odiglet/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odiglet/Makefile b/odiglet/Makefile index d26567cde..a899b07b2 100644 --- a/odiglet/Makefile +++ b/odiglet/Makefile @@ -13,7 +13,7 @@ generate: make generate test: - go mod download + go mod download GO_AUTO_PATH=$$(go list -m -f '{{.Dir}}' "go.opentelemetry.io/auto") && \ sudo chmod -R +w $$GO_AUTO_PATH && \ cd $$GO_AUTO_PATH && \