You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2020/01/24 17:09:07 UTC

[camel-k] 06/07: feat(trait): Add options to configure JVM remote debugging

This is an automated email from the ASF dual-hosted git repository.

astefanutti pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit c9ab8d26c32ac81676a146f9865efbe9598cd532
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Thu Jan 23 15:56:12 2020 +0100

    feat(trait): Add options to configure JVM remote debugging
---
 docs/modules/ROOT/pages/traits/jvm.adoc |  8 ++++++++
 pkg/trait/jvm.go                        | 16 +++++++++++++--
 pkg/trait/jvm_test.go                   | 35 +++++++++++++++++++++++++++++++++
 3 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/docs/modules/ROOT/pages/traits/jvm.adoc b/docs/modules/ROOT/pages/traits/jvm.adoc
index bdbe13c..8dbfad4 100755
--- a/docs/modules/ROOT/pages/traits/jvm.adoc
+++ b/docs/modules/ROOT/pages/traits/jvm.adoc
@@ -30,6 +30,14 @@ The following configuration options are available:
 | bool
 | Activates remote debugging, so that a debugger can be attached to the JVM, e.g., using port-forwarding
 
+| jvm.debug-suspend
+| bool
+| Suspends the target JVM immediately before the main class is loaded
+
+| jvm.debug-address
+| string
+| Transport address at which to listen for the newly launched JVM
+
 | jvm.options
 | string
 | A comma-separated list of JVM options
diff --git a/pkg/trait/jvm.go b/pkg/trait/jvm.go
index b5ece60..b1a783b 100644
--- a/pkg/trait/jvm.go
+++ b/pkg/trait/jvm.go
@@ -42,6 +42,10 @@ type jvmTrait struct {
 	BaseTrait `property:",squash"`
 	// Activates remote debugging, so that a debugger can be attached to the JVM, e.g., using port-forwarding
 	Debug bool `property:"debug"`
+	// Suspends the target JVM immediately before the main class is loaded
+	DebugSuspend bool `property:"debug-suspend"`
+	// Transport address at which to listen for the newly launched JVM
+	DebugAddress string `property:"debug-address"`
 	// A comma-separated list of JVM options
 	Options *string `property:"options"`
 }
@@ -49,6 +53,8 @@ type jvmTrait struct {
 func newJvmTrait() *jvmTrait {
 	return &jvmTrait{
 		BaseTrait: newBaseTrait("jvm"),
+		// To be defaulted to "*:5005" when upgrading the default base image to JDK9+
+		DebugAddress: "5005",
 	}
 }
 
@@ -108,9 +114,15 @@ func (t *jvmTrait) Apply(e *Environment) error {
 		container.Command = []string{"java"}
 		container.WorkingDir = "/deployments"
 
+		// Remote debugging
 		if t.Debug {
-			// TODO: Add options to configure debugging agent
-			container.Args = append(container.Args, "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005")
+			suspend := "n"
+			if t.DebugSuspend {
+				suspend = "y"
+			}
+			container.Args = append(container.Args,
+				fmt.Sprintf("-agentlib:jdwp=transport=dt_socket,server=y,suspend=%s,address=%s",
+					suspend, t.DebugAddress))
 		}
 
 		// Add JVM options
diff --git a/pkg/trait/jvm_test.go b/pkg/trait/jvm_test.go
index 57260db..e180202 100644
--- a/pkg/trait/jvm_test.go
+++ b/pkg/trait/jvm_test.go
@@ -141,6 +141,41 @@ func TestApplyJvmTraitWithKNativeResource(t *testing.T) {
 	})
 }
 
+func TestApplyJvmTraitWithDebugEnabled(t *testing.T) {
+	trait, environment := createNominalJvmTest()
+	trait.Debug = true
+	trait.DebugSuspend = true
+
+	d := appsv1.Deployment{
+		Spec: appsv1.DeploymentSpec{
+			Template: corev1.PodTemplateSpec{
+				Spec: corev1.PodSpec{
+					Containers: []corev1.Container{
+						{
+							Name: defaultContainerName,
+							VolumeMounts: []corev1.VolumeMount{
+								{
+									MountPath: "/mount/path",
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+
+	environment.Resources.Add(&d)
+
+	err := trait.Apply(environment)
+
+	assert.Nil(t, err)
+
+	assert.Contains(t, d.Spec.Template.Spec.Containers[0].Args,
+		"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005",
+	)
+}
+
 func createNominalJvmTest() (*jvmTrait, *Environment) {
 	return createJvmTestWithKitType(v1.IntegrationKitTypePlatform)
 }