From 2836a5e0dfa10b8a2dd09fa67df85dca8e355c03 Mon Sep 17 00:00:00 2001 From: Antonin Stefanutti Date: Tue, 21 Jan 2020 11:44:28 +0100 Subject: [PATCH] chore(trait): Use container args to configure JVM debugging --- pkg/trait/classpath.go | 12 ++---------- pkg/trait/debug.go | 14 +++++++++----- pkg/trait/debug_test.go | 29 ++++++++++++++++++++++++----- pkg/trait/jolokia.go | 8 +------- pkg/trait/prometheus.go | 8 +------- pkg/trait/quarkus.go | 4 ---- pkg/trait/trait_catalog.go | 6 +++--- pkg/trait/trait_types.go | 10 ++++++++++ 8 files changed, 50 insertions(+), 41 deletions(-) diff --git a/pkg/trait/classpath.go b/pkg/trait/classpath.go index 0405ee3256..71b7cc4609 100644 --- a/pkg/trait/classpath.go +++ b/pkg/trait/classpath.go @@ -85,9 +85,7 @@ func (t *classpathTrait) Apply(e *Environment) error { classpath.Add("./resources") quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait) - if quarkus.isEnabled() { - quarkus.addClasspath(e) - } else { + if !quarkus.isEnabled() { for _, artifact := range kit.Status.Artifacts { classpath.Add(artifact.Target) } @@ -100,13 +98,7 @@ func (t *classpathTrait) Apply(e *Environment) error { classpath.Add("/deployments/dependencies/*") } - containerName := defaultContainerName - dt := e.Catalog.GetTrait(containerTraitID) - if dt != nil { - containerName = dt.(*containerTrait).Name - } - - container := e.Resources.GetContainerByName(containerName) + container := e.getIntegrationContainer() if container != nil { // Add mounted resources to the class path for _, m := range container.VolumeMounts { diff --git a/pkg/trait/debug.go b/pkg/trait/debug.go index 9ecaed8f5b..38d3c5fa47 100644 --- a/pkg/trait/debug.go +++ b/pkg/trait/debug.go @@ -18,15 +18,14 @@ limitations under the License. package trait import ( + "fmt" + v1 "github.com/apache/camel-k/pkg/apis/camel/v1" - "github.com/apache/camel-k/pkg/util/envvar" ) // The Debug trait can be used to enable debugging on the integration container, // so that a remote debugger can be attached. // -// Enabling the trait will inject the `JAVA_DEBUG` environment variable into the integration container. -// // +camel-k:trait=debug type debugTrait struct { BaseTrait `property:",squash"` @@ -47,8 +46,13 @@ func (t *debugTrait) Configure(e *Environment) (bool, error) { } func (t *debugTrait) Apply(e *Environment) error { - // this is all that's needed as long as the base image is `fabric8/s2i-java` look into builder/builder.go - envvar.SetVal(&e.EnvVars, "JAVA_DEBUG", True) + container := e.getIntegrationContainer() + if container == nil { + return fmt.Errorf("unable to find integration container") + } + + // TODO: Add options to configure debugging agent + container.Args = append(container.Args, "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005") return nil } diff --git a/pkg/trait/debug_test.go b/pkg/trait/debug_test.go index 71ea9d1f4a..32b3e1dea7 100644 --- a/pkg/trait/debug_test.go +++ b/pkg/trait/debug_test.go @@ -18,15 +18,17 @@ limitations under the License. package trait import ( + "context" "testing" "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/util/camel" - "github.com/apache/camel-k/pkg/util/envvar" + "github.com/apache/camel-k/pkg/util/kubernetes" ) func TestDebugTraitApplicability(t *testing.T) { @@ -49,7 +51,6 @@ func TestDebugTraitApplicability(t *testing.T) { }, }, }, - EnvVars: make([]corev1.EnvVar, 0), } trait := newDebugTrait() @@ -67,6 +68,7 @@ func TestDebugTraitApplicability(t *testing.T) { func TestApplyDebugTrait(t *testing.T) { environment := Environment{ + Catalog: NewCatalog(context.TODO(), nil), Integration: &v1.Integration{ Status: v1.IntegrationStatus{ Phase: v1.IntegrationPhaseDeploying, @@ -81,12 +83,29 @@ func TestApplyDebugTrait(t *testing.T) { }, }, }, - EnvVars: make([]corev1.EnvVar, 0), + Resources: kubernetes.NewCollection(), } + d := appsv1.Deployment{ + Spec: appsv1.DeploymentSpec{ + Template: corev1.PodTemplateSpec{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: defaultContainerName, + }, + }, + }, + }, + }, + } + + environment.Resources.Add(&d) + trait := newDebugTrait() assert.Nil(t, trait.Apply(&environment)) - assert.NotNil(t, envvar.Get(environment.EnvVars, "JAVA_DEBUG")) - assert.Equal(t, True, envvar.Get(environment.EnvVars, "JAVA_DEBUG").Value) + assert.Equal(t, d.Spec.Template.Spec.Containers[0].Args, []string{ + "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005", + }) } diff --git a/pkg/trait/jolokia.go b/pkg/trait/jolokia.go index 5022d90f31..4f1ef04f84 100644 --- a/pkg/trait/jolokia.go +++ b/pkg/trait/jolokia.go @@ -128,13 +128,7 @@ func (t *jolokiaTrait) Apply(e *Environment) (err error) { return nil } - containerName := defaultContainerName - dt := e.Catalog.GetTrait(containerTraitID) - if dt != nil { - containerName = dt.(*containerTrait).Name - } - - container := e.Resources.GetContainerByName(containerName) + container := e.getIntegrationContainer() if container == nil { e.Integration.Status.SetCondition( v1.IntegrationConditionJolokiaAvailable, diff --git a/pkg/trait/prometheus.go b/pkg/trait/prometheus.go index b995f6308f..f4898746b3 100644 --- a/pkg/trait/prometheus.go +++ b/pkg/trait/prometheus.go @@ -68,13 +68,7 @@ func (t *prometheusTrait) Configure(e *Environment) (bool, error) { } func (t *prometheusTrait) Apply(e *Environment) (err error) { - containerName := defaultContainerName - dt := e.Catalog.GetTrait(containerTraitID) - if dt != nil { - containerName = dt.(*containerTrait).Name - } - - container := e.Resources.GetContainerByName(containerName) + container := e.getIntegrationContainer() if container == nil { e.Integration.Status.SetCondition( v1.IntegrationConditionPrometheusAvailable, diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go index c8146757b1..50e9c1fe97 100644 --- a/pkg/trait/quarkus.go +++ b/pkg/trait/quarkus.go @@ -148,10 +148,6 @@ func (t *quarkusTrait) addBuildSteps(task *v1.BuilderTask) { task.Steps = append(task.Steps, builder.StepIDsFor(runtime.QuarkusSteps...)...) } -func (t *quarkusTrait) addClasspath(_ *Environment) { - // No-op as we rely on the Quarkus runner -} - func (t *quarkusTrait) addRuntimeDependencies(e *Environment) error { dependencies := &e.Integration.Status.Dependencies diff --git a/pkg/trait/trait_catalog.go b/pkg/trait/trait_catalog.go index 42b2069828..a045f3085f 100644 --- a/pkg/trait/trait_catalog.go +++ b/pkg/trait/trait_catalog.go @@ -151,7 +151,6 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { return []Trait{ c.tPlatform, c.tCamel, - c.tDebug, c.tRestDsl, c.tDependencies, c.tBuilder, @@ -167,6 +166,7 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { c.tPullSecret, c.tJolokia, c.tPrometheus, + c.tDebug, c.tClasspath, c.tProbes, c.tRoute, @@ -177,7 +177,6 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { return []Trait{ c.tPlatform, c.tCamel, - c.tDebug, c.tRestDsl, c.tDependencies, c.tBuilder, @@ -193,6 +192,7 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { c.tPullSecret, c.tJolokia, c.tPrometheus, + c.tDebug, c.tClasspath, c.tProbes, c.tIngress, @@ -203,7 +203,6 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { return []Trait{ c.tPlatform, c.tCamel, - c.tDebug, c.tRestDsl, c.tKnative, c.tDependencies, @@ -220,6 +219,7 @@ func (c *Catalog) TraitsForProfile(profile v1.TraitProfile) []Trait { c.tPullSecret, c.tJolokia, c.tPrometheus, + c.tDebug, c.tClasspath, c.tProbes, c.tIstio, diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go index de8a6c9c94..f3c8e4bace 100644 --- a/pkg/trait/trait_types.go +++ b/pkg/trait/trait_types.go @@ -613,3 +613,13 @@ func (e *Environment) CollectConfigurationValues(configurationType string) []str func (e *Environment) CollectConfigurationPairs(configurationType string) map[string]string { return CollectConfigurationPairs(configurationType, e.Platform, e.IntegrationKit, e.Integration) } + +func (e *Environment) getIntegrationContainer() *corev1.Container { + containerName := defaultContainerName + dt := e.Catalog.GetTrait(containerTraitID) + if dt != nil { + containerName = dt.(*containerTrait).Name + } + + return e.Resources.GetContainerByName(containerName) +}