From 8059daf24f303bb141b45157e37e485e9d897cdb Mon Sep 17 00:00:00 2001 From: lisguo Date: Fri, 14 Jun 2024 11:33:41 -0400 Subject: [PATCH 1/5] Use windows cmd --- pkg/instrumentation/javaagent.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/instrumentation/javaagent.go b/pkg/instrumentation/javaagent.go index f68f5213a..0791bd56a 100644 --- a/pkg/instrumentation/javaagent.go +++ b/pkg/instrumentation/javaagent.go @@ -17,6 +17,11 @@ const ( javaInstrMountPath = "/otel-auto-instrumentation-java" ) +var ( + commandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} + commandWindows = []string{"copy", "javaagent.jar", javaInstrMountPath} +) + func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { // caller checks if there is at least one container. container := &pod.Spec.Containers[index] @@ -59,10 +64,15 @@ func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1. }, }}) + command := commandLinux + if pod.Spec.NodeSelector["kubernetes.io/os"] == "windows" { + command = commandWindows + } + pod.Spec.InitContainers = append(pod.Spec.InitContainers, corev1.Container{ Name: javaInitContainerName, Image: javaSpec.Image, - Command: []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"}, + Command: command, Resources: javaSpec.Resources, VolumeMounts: []corev1.VolumeMount{{ Name: javaVolumeName, From ab9b0f6e5c7de0c93b6bbb3275084562c4bcbd36 Mon Sep 17 00:00:00 2001 From: lisguo Date: Fri, 14 Jun 2024 12:21:06 -0400 Subject: [PATCH 2/5] modify command --- pkg/instrumentation/javaagent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/instrumentation/javaagent.go b/pkg/instrumentation/javaagent.go index 0791bd56a..3692ffe43 100644 --- a/pkg/instrumentation/javaagent.go +++ b/pkg/instrumentation/javaagent.go @@ -19,7 +19,7 @@ const ( var ( commandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} - commandWindows = []string{"copy", "javaagent.jar", javaInstrMountPath} + commandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPath} ) func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { From bf2515ab0e425bf5b350f2cbf7f7007e3f7c29d4 Mon Sep 17 00:00:00 2001 From: lisguo Date: Fri, 14 Jun 2024 15:54:20 -0400 Subject: [PATCH 3/5] command --- pkg/instrumentation/javaagent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/instrumentation/javaagent.go b/pkg/instrumentation/javaagent.go index 3692ffe43..bd961e5ff 100644 --- a/pkg/instrumentation/javaagent.go +++ b/pkg/instrumentation/javaagent.go @@ -19,7 +19,7 @@ const ( var ( commandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} - commandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPath} + commandWindows = []string{"copy", "javaagent.jar", "otel-auto-instrumentation-java"} ) func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { From 5f3c6e87ef6713f5e64d53af10289bc987c0baf2 Mon Sep 17 00:00:00 2001 From: lisguo Date: Mon, 17 Jun 2024 13:33:31 -0400 Subject: [PATCH 4/5] Use CMD --- pkg/instrumentation/javaagent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/instrumentation/javaagent.go b/pkg/instrumentation/javaagent.go index bd961e5ff..3692ffe43 100644 --- a/pkg/instrumentation/javaagent.go +++ b/pkg/instrumentation/javaagent.go @@ -19,7 +19,7 @@ const ( var ( commandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} - commandWindows = []string{"copy", "javaagent.jar", "otel-auto-instrumentation-java"} + commandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPath} ) func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { From bb7c6ac666917f62fc35f699624420a94f182eb2 Mon Sep 17 00:00:00 2001 From: lisguo Date: Tue, 18 Jun 2024 11:33:23 -0400 Subject: [PATCH 5/5] Fix command and add test --- pkg/instrumentation/javaagent.go | 13 +- pkg/instrumentation/javaagent_test.go | 172 ++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 6 deletions(-) diff --git a/pkg/instrumentation/javaagent.go b/pkg/instrumentation/javaagent.go index 3692ffe43..6f1d2b4c5 100644 --- a/pkg/instrumentation/javaagent.go +++ b/pkg/instrumentation/javaagent.go @@ -10,16 +10,17 @@ import ( ) const ( - envJavaToolsOptions = "JAVA_TOOL_OPTIONS" - javaJVMArgument = " -javaagent:/otel-auto-instrumentation-java/javaagent.jar" - javaInitContainerName = initContainerName + "-java" - javaVolumeName = volumeName + "-java" - javaInstrMountPath = "/otel-auto-instrumentation-java" + envJavaToolsOptions = "JAVA_TOOL_OPTIONS" + javaJVMArgument = " -javaagent:/otel-auto-instrumentation-java/javaagent.jar" + javaInitContainerName = initContainerName + "-java" + javaVolumeName = volumeName + "-java" + javaInstrMountPath = "/otel-auto-instrumentation-java" + javaInstrMountPathWindows = "\\otel-auto-instrumentation-java" ) var ( commandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} - commandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPath} + commandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPathWindows} ) func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { diff --git a/pkg/instrumentation/javaagent_test.go b/pkg/instrumentation/javaagent_test.go index c8f8256b2..840d837ca 100644 --- a/pkg/instrumentation/javaagent_test.go +++ b/pkg/instrumentation/javaagent_test.go @@ -178,3 +178,175 @@ func TestInjectJavaagent(t *testing.T) { }) } } + +func TestInjectJavaagentWindows(t *testing.T) { + tests := []struct { + name string + v1alpha1.Java + pod corev1.Pod + expected corev1.Pod + err error + }{ + { + name: "JAVA_TOOL_OPTIONS not defined", + Java: v1alpha1.Java{Image: "foo/bar:1"}, + pod: corev1.Pod{ + Spec: corev1.PodSpec{ + NodeSelector: map[string]string{ + "kubernetes.io/os": "windows", + }, + Containers: []corev1.Container{ + {}, + }, + }, + }, + expected: corev1.Pod{ + Spec: corev1.PodSpec{ + NodeSelector: map[string]string{ + "kubernetes.io/os": "windows", + }, + Volumes: []corev1.Volume{ + { + Name: "opentelemetry-auto-instrumentation-java", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{ + SizeLimit: &defaultVolumeLimitSize, + }, + }, + }, + }, + InitContainers: []corev1.Container{ + { + Name: "opentelemetry-auto-instrumentation-java", + Image: "foo/bar:1", + Command: []string{"CMD", "/c", "copy", "javaagent.jar", "\\otel-auto-instrumentation-java"}, + VolumeMounts: []corev1.VolumeMount{{ + Name: "opentelemetry-auto-instrumentation-java", + MountPath: "/otel-auto-instrumentation-java", + }}, + }, + }, + Containers: []corev1.Container{ + { + VolumeMounts: []corev1.VolumeMount{ + { + Name: "opentelemetry-auto-instrumentation-java", + MountPath: "/otel-auto-instrumentation-java", + }, + }, + Env: []corev1.EnvVar{ + { + Name: "JAVA_TOOL_OPTIONS", + Value: javaJVMArgument, + }, + }, + }, + }, + }, + }, + err: nil, + }, + { + name: "JAVA_TOOL_OPTIONS defined", + Java: v1alpha1.Java{Image: "foo/bar:1", Resources: testResourceRequirements}, + pod: corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Env: []corev1.EnvVar{ + { + Name: "JAVA_TOOL_OPTIONS", + Value: "-Dbaz=bar", + }, + }, + }, + }, + }, + }, + expected: corev1.Pod{ + Spec: corev1.PodSpec{ + Volumes: []corev1.Volume{ + { + Name: "opentelemetry-auto-instrumentation-java", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{ + SizeLimit: &defaultVolumeLimitSize, + }, + }, + }, + }, + InitContainers: []corev1.Container{ + { + Name: "opentelemetry-auto-instrumentation-java", + Image: "foo/bar:1", + Command: []string{"cp", "/javaagent.jar", "/otel-auto-instrumentation-java/javaagent.jar"}, + VolumeMounts: []corev1.VolumeMount{{ + Name: "opentelemetry-auto-instrumentation-java", + MountPath: "/otel-auto-instrumentation-java", + }}, + Resources: testResourceRequirements, + }, + }, + Containers: []corev1.Container{ + { + VolumeMounts: []corev1.VolumeMount{ + { + Name: "opentelemetry-auto-instrumentation-java", + MountPath: "/otel-auto-instrumentation-java", + }, + }, + Env: []corev1.EnvVar{ + { + Name: "JAVA_TOOL_OPTIONS", + Value: "-Dbaz=bar" + javaJVMArgument, + }, + }, + }, + }, + }, + }, + err: nil, + }, + { + name: "JAVA_TOOL_OPTIONS defined as ValueFrom", + Java: v1alpha1.Java{Image: "foo/bar:1"}, + pod: corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Env: []corev1.EnvVar{ + { + Name: "JAVA_TOOL_OPTIONS", + ValueFrom: &corev1.EnvVarSource{}, + }, + }, + }, + }, + }, + }, + expected: corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Env: []corev1.EnvVar{ + { + Name: "JAVA_TOOL_OPTIONS", + ValueFrom: &corev1.EnvVarSource{}, + }, + }, + }, + }, + }, + }, + err: fmt.Errorf("the container defines env var value via ValueFrom, envVar: %s", envJavaToolsOptions), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + pod, err := injectJavaagent(test.Java, test.pod, 0) + assert.Equal(t, test.expected, pod) + assert.Equal(t, test.err, err) + }) + } +}