This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit b45bd8a9e687aefdac44193d9f28a2baa1394f54 Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Tue Jul 23 09:02:11 2019 +0200 fix(classpath): lookup integration container by name instead of iterating amoung all the containers --- pkg/trait/classpath.go | 54 +++++++++++++++------------------------------ pkg/trait/classpath_test.go | 50 ++++++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 54 deletions(-) diff --git a/pkg/trait/classpath.go b/pkg/trait/classpath.go index d2191da..fba666c 100644 --- a/pkg/trait/classpath.go +++ b/pkg/trait/classpath.go @@ -19,20 +19,15 @@ package trait import ( "fmt" - "sort" "strings" - "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" "github.com/apache/camel-k/pkg/util/envvar" - "github.com/scylladb/go-set/strset" - + "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" "github.com/pkg/errors" + "github.com/scylladb/go-set/strset" - serving "github.com/knative/serving/pkg/apis/serving/v1alpha1" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -96,38 +91,25 @@ func (t *classpathTrait) Apply(e *Environment) error { e.Classpath.Add("/deployments/dependencies/*") } - if e.Resources != nil { - e.Resources.VisitDeployment(func(deployment *appsv1.Deployment) { - for i := 0; i < len(deployment.Spec.Template.Spec.Containers); i++ { - cp := e.Classpath.Copy() - - for _, m := range deployment.Spec.Template.Spec.Containers[i].VolumeMounts { - cp.Add(m.MountPath) - } - - t.setJavaClasspath(cp, &deployment.Spec.Template.Spec.Containers[i].Env) - } - }) - e.Resources.VisitKnativeService(func(service *serving.Service) { - for ci := range service.Spec.ConfigurationSpec.GetTemplate().Spec.Containers { - c := &service.Spec.ConfigurationSpec.GetTemplate().Spec.Containers[ci] - for mi := range c.VolumeMounts { - m := &c.VolumeMounts[mi] - e.Classpath.Add(m.MountPath) - } - t.setJavaClasspath(e.Classpath, &c.Env) - } - }) + containerName := defaultContainerName + dt := e.Catalog.GetTrait(containerTraitID) + if dt != nil { + containerName = dt.(*containerTrait).Name } - return nil -} + container := e.Resources.GetContainerByName(containerName) + if container != nil { + for _, m := range container.VolumeMounts { + e.Classpath.Add(m.MountPath) + } -func (t *classpathTrait) setJavaClasspath(cp *strset.Set, env *[]corev1.EnvVar) { - items := cp.List() + items := e.Classpath.List() - // keep classpath sorted - sort.Strings(items) + // keep classpath sorted + sort.Strings(items) - envvar.SetVal(env, "JAVA_CLASSPATH", strings.Join(items, ":")) + envvar.SetVal(&container.Env, "JAVA_CLASSPATH", strings.Join(items, ":")) + } + + return nil } diff --git a/pkg/trait/classpath_test.go b/pkg/trait/classpath_test.go index a9412df..2863fee8 100644 --- a/pkg/trait/classpath_test.go +++ b/pkg/trait/classpath_test.go @@ -19,6 +19,8 @@ package trait import ( "context" + "sort" + "strings" "testing" serving "github.com/knative/serving/pkg/apis/serving/v1alpha1" @@ -107,42 +109,48 @@ func TestConfigureClasspathTraitWithIntegrationKitStatusArtifact(t *testing.T) { func TestConfigureClasspathTraitWithDeploymentResource(t *testing.T) { trait, environment := createNominalTest() - container := corev1.Container{ - VolumeMounts: []corev1.VolumeMount{{MountPath: "/mount/path"}}, - } - - deployment := appsv1.Deployment{ + d := appsv1.Deployment{ Spec: appsv1.DeploymentSpec{ Template: corev1.PodTemplateSpec{ Spec: corev1.PodSpec{ - Containers: []corev1.Container{container}, + Containers: []corev1.Container{ + { + Name: defaultContainerName, + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: "/mount/path", + }, + }, + }, + }, }, }, }, } - environment.Resources = kubernetes.NewCollection(&deployment) + environment.Resources.Add(&d) err := trait.Apply(environment) + cp := environment.Classpath.List() + sort.Strings(cp) + assert.Nil(t, err) assert.NotNil(t, environment.Classpath) - assert.Equal(t, strset.New("/etc/camel/resources", "./resources"), environment.Classpath) - - assert.Len(t, container.Env, 0) + assert.Equal(t, strset.New("/etc/camel/resources", "./resources", "/mount/path"), environment.Classpath) + assert.Len(t, d.Spec.Template.Spec.Containers[0].Env, 1) + assert.Equal(t, "JAVA_CLASSPATH", d.Spec.Template.Spec.Containers[0].Env[0].Name) + assert.Equal(t, strings.Join(cp, ":"), d.Spec.Template.Spec.Containers[0].Env[0].Value) } func TestConfigureClasspathTraitWithKNativeResource(t *testing.T) { trait, environment := createNominalTest() - container := corev1.Container{ - VolumeMounts: []corev1.VolumeMount{{MountPath: "/mount/path"}}, - } - s := serving.Service{} s.Spec.ConfigurationSpec.Template = &serving.RevisionTemplateSpec{} s.Spec.ConfigurationSpec.Template.Spec.Containers = []corev1.Container{ { + Name: defaultContainerName, VolumeMounts: []corev1.VolumeMount{ { MountPath: "/mount/path", @@ -151,15 +159,19 @@ func TestConfigureClasspathTraitWithKNativeResource(t *testing.T) { }, } - environment.Resources = kubernetes.NewCollection(&s) + environment.Resources.Add(&s) err := trait.Apply(environment) + cp := environment.Classpath.List() + sort.Strings(cp) + assert.Nil(t, err) assert.NotNil(t, environment.Classpath) - assert.Equal(t, strset.New("/etc/camel/resources", "./resources", "/mount/path"), environment.Classpath) - - assert.Len(t, container.Env, 0) + assert.ElementsMatch(t, []string{"/etc/camel/resources", "./resources", "/mount/path"}, cp) + assert.Len(t, s.Spec.ConfigurationSpec.Template.Spec.Containers[0].Env, 1) + assert.Equal(t, "JAVA_CLASSPATH", s.Spec.ConfigurationSpec.Template.Spec.Containers[0].Env[0].Name) + assert.Equal(t, strings.Join(cp, ":"), s.Spec.ConfigurationSpec.Template.Spec.Containers[0].Env[0].Value) } func TestConfigureClasspathTraitWithNominalIntegrationKit(t *testing.T) { @@ -201,6 +213,7 @@ func createTestWithKitType(kitType string) (*classpathTrait, *Environment) { trait.client = client environment := &Environment{ + Catalog: NewCatalog(context.TODO(), nil), Integration: &v1alpha1.Integration{ Status: v1alpha1.IntegrationStatus{ Phase: v1alpha1.IntegrationPhaseDeploying, @@ -211,6 +224,7 @@ func createTestWithKitType(kitType string) (*classpathTrait, *Environment) { Phase: v1alpha1.IntegrationKitPhaseReady, }, }, + Resources: kubernetes.NewCollection(), } return trait, environment