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

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


The following commit(s) were added to refs/heads/main by this push:
     new 17e0913  fix(cli) Duplicated trait set as modeline and kamel run 
parameters causes error
17e0913 is described below

commit 17e09131a1711125e371a80b51400da47162926b
Author: Claudio Miranda <[email protected]>
AuthorDate: Tue Jun 29 18:34:37 2021 -0300

    fix(cli) Duplicated trait set as modeline and kamel run parameters causes 
error
    
    Fix #2466
---
 e2e/common/cli/duplicate_parameters_test.go   | 49 +++++++++++++++++++++++++++
 e2e/common/cli/files/JavaDuplicateParams.java | 30 ++++++++++++++++
 pkg/cmd/modeline.go                           | 24 ++++++-------
 pkg/cmd/modeline_test.go                      | 48 ++++++++++++++++++++++++++
 pkg/cmd/run.go                                | 10 +++---
 5 files changed, 144 insertions(+), 17 deletions(-)

diff --git a/e2e/common/cli/duplicate_parameters_test.go 
b/e2e/common/cli/duplicate_parameters_test.go
new file mode 100644
index 0000000..dd744a2
--- /dev/null
+++ b/e2e/common/cli/duplicate_parameters_test.go
@@ -0,0 +1,49 @@
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> 
Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package common
+
+import (
+       "context"
+       "testing"
+
+       . "github.com/apache/camel-k/e2e/support"
+       "github.com/apache/camel-k/pkg/cmd"
+       . "github.com/onsi/gomega"
+)
+
+func TestDuplicateParameters(t *testing.T) {
+       RegisterTestingT(t)
+
+       ctx, cancel := context.WithCancel(TestContext)
+       defer cancel()
+
+       // run kamel to output the traits/configuration structure in json 
format to check the processed values
+       // the tracing.enabled is false inside JavaDuplicateParams.java, so we 
can check the output of this trait as true.
+       cmdParams := []string{"kamel", "run", "files/JavaDuplicateParams.java", 
"-o", "json", "-t", "tracing.enabled=true", "--trait", 
"pull-secret.enabled=true", "--property", "prop1=true", "-p", "prop2=true"}
+       comm, _, _ := cmd.NewKamelWithModelineCommand(ctx, cmdParams)
+
+       // the command is executed inside GetOutputString function
+       commOutput := GetOutputString(comm)
+
+       outParams := 
`"traits":{"affinity":{"configuration":{"enabled":true}},"pull-secret":{"configuration":{"enabled":true}},"tracing":{"configuration":{"enabled":true}}},"configuration":[{"type":"property","value":"prop1
 = true"},{"type":"property","value":"prop2 = 
true"},{"type":"property","value":"foo = bar"}]}`
+       Expect(commOutput).To(ContainSubstring(outParams))
+}
diff --git a/e2e/common/cli/files/JavaDuplicateParams.java 
b/e2e/common/cli/files/JavaDuplicateParams.java
new file mode 100644
index 0000000..465e1cc
--- /dev/null
+++ b/e2e/common/cli/files/JavaDuplicateParams.java
@@ -0,0 +1,30 @@
+// camel-k: language=java trait=tracing.enabled=false 
trait=affinity.enabled=true property=prop1=false property=foo=bar
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class JavaDuplicateParams extends RouteBuilder {
+  @Override
+  public void configure() throws Exception {
+         from("timer:tick")
+         .setHeader("m").constant("string!")
+         .setBody().simple("Magic${header.m}")
+      .log("${body}");
+  }
+}
diff --git a/pkg/cmd/modeline.go b/pkg/cmd/modeline.go
index cae66f6..fb6cf90 100644
--- a/pkg/cmd/modeline.go
+++ b/pkg/cmd/modeline.go
@@ -132,14 +132,14 @@ func createKamelWithModelineCommand(ctx context.Context, 
args []string) (*cobra.
                return nil, nil, errors.Wrap(err, "cannot read sources")
        }
 
-       // Extract list of property names already specified by the user.
-       userPropertyNames := []string{}
+       // Extract list of property/trait names already specified by the user.
+       cliParamNames := []string{}
        index := 0
        for _, arg := range args {
-               if arg == "-p" || arg == "--property" {
-                       // Property is assumed to be in the form: <name>=<value>
+               if arg == "-p" || arg == "--property" || arg == "-t" || arg == 
"--trait" {
+                       // Property or trait is assumed to be in the form: 
<name>=<value>
                        splitValues := strings.Split(args[index+1], "=")
-                       userPropertyNames = append(userPropertyNames, 
splitValues[0])
+                       cliParamNames = append(cliParamNames, splitValues[0])
                }
                index++
        }
@@ -148,19 +148,19 @@ func createKamelWithModelineCommand(ctx context.Context, 
args []string) (*cobra.
        nOpts := 0
        for _, o := range opts {
                // Check if property name is given by user.
-               propertyAlreadySpecifiedByUser := false
-               if o.Name == "property" {
-                       propertyComponents := strings.Split(o.Value, "=")
-                       for _, propName := range userPropertyNames {
-                               if propName == propertyComponents[0] {
-                                       propertyAlreadySpecifiedByUser = true
+               paramAlreadySpecifiedByUser := false
+               if o.Name == "property" || o.Name == "trait" {
+                       paramComponents := strings.Split(o.Value, "=")
+                       for _, paramName := range cliParamNames {
+                               if paramName == paramComponents[0] {
+                                       paramAlreadySpecifiedByUser = true
                                        break
                                }
                        }
                }
 
                // Skip properties already specified by the user otherwise add 
all options.
-               if !propertyAlreadySpecifiedByUser && !nonRunOptions[o.Name] {
+               if !paramAlreadySpecifiedByUser && !nonRunOptions[o.Name] {
                        opts[nOpts] = o
                        nOpts++
                }
diff --git a/pkg/cmd/modeline_test.go b/pkg/cmd/modeline_test.go
index 8b82d49..df20c09 100644
--- a/pkg/cmd/modeline_test.go
+++ b/pkg/cmd/modeline_test.go
@@ -124,6 +124,30 @@ func TestModelineRunProperty(t *testing.T) {
        assert.Equal(t, []string{"run", fileName, "--property=my-prop=my-val"}, 
flags)
 }
 
+func TestModelineRunDuplicatedProperties(t *testing.T) {
+       dir, err := ioutil.TempDir("", "camel-k-test-")
+       assert.NoError(t, err)
+       defer os.RemoveAll(dir)
+
+       subDir := path.Join(dir, "sub")
+       err = os.Mkdir(subDir, 0777)
+       assert.NoError(t, err)
+
+       file := `
+               // camel-k: property=prop1=false
+               // camel-k: property=prop2=false
+               // camel-k: property=foo=bar
+       `
+       fileName := path.Join(subDir, "simple.groovy")
+       err = ioutil.WriteFile(fileName, []byte(file), 0777)
+       assert.NoError(t, err)
+
+       cmd, flags, err := NewKamelWithModelineCommand(context.TODO(), 
[]string{"kamel", "run", fileName, "-p", "prop1=true", "--property", 
"prop2=true"})
+       assert.NoError(t, err)
+       assert.NotNil(t, cmd)
+       assert.Equal(t, []string{"run", fileName, "-p", "prop1=true", 
"--property", "prop2=true", "--property=foo=bar"}, flags)
+}
+
 func TestModelineRunPropertyFiles(t *testing.T) {
        dir, err := ioutil.TempDir("", "camel-k-test-")
        assert.NoError(t, err)
@@ -204,6 +228,30 @@ func TestModelineRunBuildPropertyFiles(t *testing.T) {
        assert.Equal(t, []string{"run", fileName, 
fmt.Sprintf("--build-property=file:%s", propFileName)}, flags)
 }
 
+func TestModelineRunDuplicateTraits(t *testing.T) {
+       dir, err := ioutil.TempDir("", "camel-k-test-")
+       assert.NoError(t, err)
+       defer os.RemoveAll(dir)
+
+       subDir := path.Join(dir, "sub")
+       err = os.Mkdir(subDir, 0777)
+       assert.NoError(t, err)
+
+       file := `
+               // camel-k: trait=trait1=false
+               // camel-k: trait=trait2=false
+               // camel-k: trait=foo=bar
+       `
+       fileName := path.Join(subDir, "simple.groovy")
+       err = ioutil.WriteFile(fileName, []byte(file), 0777)
+       assert.NoError(t, err)
+
+       cmd, flags, err := NewKamelWithModelineCommand(context.TODO(), 
[]string{"kamel", "run", fileName, "-t", "trait1=true", "--trait", 
"trait2=true"})
+       assert.NoError(t, err)
+       assert.NotNil(t, cmd)
+       assert.Equal(t, []string{"run", fileName, "-t", "trait1=true", 
"--trait", "trait2=true", "--trait=foo=bar"}, flags)
+}
+
 func TestModelineRunConfigConfigmap(t *testing.T) {
        dir, err := ioutil.TempDir("", "camel-k-test-")
        assert.NoError(t, err)
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index b97dca7..5095362 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -287,7 +287,7 @@ func (o *runCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
                }
        }
 
-       integration, err := o.createOrUpdateIntegration(c, args, catalog)
+       integration, err := o.createOrUpdateIntegration(cmd, c, args, catalog)
        if err != nil {
                return err
        }
@@ -441,7 +441,7 @@ func (o *runCmdOptions) syncIntegration(cmd *cobra.Command, 
c client.Client, sou
                                                newCmd.Args = o.validateArgs
                                                newCmd.PreRunE = o.decode
                                                newCmd.RunE = func(cmd 
*cobra.Command, args []string) error {
-                                                       _, err := 
o.createOrUpdateIntegration(c, sources, catalog)
+                                                       _, err := 
o.createOrUpdateIntegration(cmd, c, sources, catalog)
                                                        return err
                                                }
                                                newCmd.PostRunE = nil
@@ -465,7 +465,7 @@ func (o *runCmdOptions) syncIntegration(cmd *cobra.Command, 
c client.Client, sou
 }
 
 // nolint: gocyclo
-func (o *runCmdOptions) createOrUpdateIntegration(c client.Client, sources 
[]string, catalog *trait.Catalog) (*v1.Integration, error) {
+func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c 
client.Client, sources []string, catalog *trait.Catalog) (*v1.Integration, 
error) {
        namespace := o.Namespace
        name := o.GetIntegrationName(sources)
 
@@ -637,7 +637,7 @@ func (o *runCmdOptions) createOrUpdateIntegration(c 
client.Client, sources []str
                if err != nil {
                        return nil, err
                }
-               fmt.Print(string(data))
+               fmt.Fprint(cmd.OutOrStdout(), string(data))
                return nil, nil
 
        case "json":
@@ -645,7 +645,7 @@ func (o *runCmdOptions) createOrUpdateIntegration(c 
client.Client, sources []str
                if err != nil {
                        return nil, err
                }
-               fmt.Print(string(data))
+               fmt.Fprint(cmd.OutOrStdout(), string(data))
                return nil, nil
 
        default:

Reply via email to