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

[camel-k] 01/02: Support CLI properties for kamel local run.

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

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

commit 20894493ce2156951d51769412b3448272f56f30
Author: Doru Bercea <gh...@ibm.com>
AuthorDate: Wed Nov 18 18:04:08 2020 -0500

    Support CLI properties for kamel local run.
---
 deploy/resources.go          |  4 +--
 pkg/cmd/local_run.go         | 15 ++++++----
 pkg/cmd/local_run_test.go    | 20 +++++++++++++
 pkg/cmd/run.go               | 13 ++-------
 pkg/cmd/util_commands.go     |  2 +-
 pkg/cmd/util_dependencies.go | 69 ++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 105 insertions(+), 18 deletions(-)

diff --git a/deploy/resources.go b/deploy/resources.go
index f432da1..a76d437 100644
--- a/deploy/resources.go
+++ b/deploy/resources.go
@@ -340,9 +340,9 @@ var assets = func() http.FileSystem {
 		"/traits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "traits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 32828,
+			uncompressedSize: 33738,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\x1b\x37\x92\xf0\xf7\xfc\x0a\x94\x9e\xa7\x4a\xa2\x8a\x1c\xc9\xd9\xca\x26\xab\xbb\x5c\x4a\xeb\x38\xbb\x72\x62\x5b\x67\x39\xc9\x5d\xe5\xb6\x96\xe0\x4c\x93\x84\x85\x01\x66\x01\x0c\x65\xe6\xea\xfe\xfb\x55\x37\x5e\x06\x33\x1c\x49\x94\x63\xa5\xb4\x55\x57\xf9\x10\x93\x9a\x69\x34\x1a\xfd\xfe\x02\x3a\xc3\x85\xb3\x67\x9f\xcd\x98\xe2\x35\x9c\x31\xbe\x5c\x0a\x25\xdc\xf6\x33\xc6\x1a\xc9\xdd\x52\x9b\xfa\x8c\x2d\xb9\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x6f\xdc\xb6\xd6\xe0\xf7\xfe\x0a\xc2\xbb\x80\x3d\xc6\x48\x76\x7a\xd1\xdb\x5e\xef\x76\x0b\x37\x49\xef\x75\xda\x24\xde\x38\x6d\x77\xd1\xbd\xb8\xc3\x91\xce\xcc\x30\xa6\x48\x3d\x24\x35\xce\x74\xb1\xff\x7d\xc1\xc3\x57\x69\x64\x5b\x4e\xe3\xc2\x17\x78\x90\x0f\xb1\xc7\x12\x79\x78\x78\xde\xdf\xc6\x28\xca\x8c\x3e\xfb\xa2\x20\x82\x36\x70\x46\xe8\x6a\xc5\x04\x33\xbb\x2f\x08\x69\x39\x35\x2b\xa9\x9a\x33\xb2\xa2\x5c\x83\x [...]
 		},
 		"/user-cluster-role.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "user-cluster-role.yaml",
diff --git a/pkg/cmd/local_run.go b/pkg/cmd/local_run.go
index f2b86f4..4f45493 100644
--- a/pkg/cmd/local_run.go
+++ b/pkg/cmd/local_run.go
@@ -19,7 +19,6 @@ package cmd
 
 import (
 	"fmt"
-	"strings"
 
 	"github.com/spf13/cobra"
 )
@@ -56,9 +55,8 @@ func newCmdLocalRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *localRunCm
 	}
 
 	cmd.Flags().StringArray("property-file", nil, "Add a property file to the integration.")
-	cmd.Flags().StringArrayP("dependency", "d", nil, `Additional top-level dependency with the format:
-<type>:<dependency-name>
-where <type> is one of {`+strings.Join(acceptedDependencyTypes, "|")+`}.`)
+	cmd.Flags().StringArrayP("property", "p", nil, "Add a camel property.")
+	cmd.Flags().StringArrayP("dependency", "d", nil, additionalDependencyUsageMessage)
 
 	return &cmd, &options
 }
@@ -66,6 +64,7 @@ where <type> is one of {`+strings.Join(acceptedDependencyTypes, "|")+`}.`)
 type localRunCmdOptions struct {
 	*RootCmdOptions
 	PropertyFiles          []string `mapstructure:"property-files"`
+	Properties             []string `mapstructure:"properties"`
 	AdditionalDependencies []string `mapstructure:"dependencies"`
 }
 
@@ -77,7 +76,7 @@ func (command *localRunCmdOptions) validate(args []string) error {
 	}
 
 	// Validate properties file.
-	err = validateFiles(command.PropertyFiles)
+	err = validatePropertyFiles(command.PropertyFiles)
 	if err != nil {
 		return nil
 	}
@@ -96,6 +95,12 @@ func (command *localRunCmdOptions) run(args []string) error {
 		return err
 	}
 
+	// Manage integration properties which may come from files or CLI.
+	err = updateIntegrationProperties(command)
+	if err != nil {
+		return nil
+	}
+
 	// Run the integration locally.
 	err = RunLocalIntegration(command.PropertyFiles, dependencies, args)
 	if err != nil {
diff --git a/pkg/cmd/local_run_test.go b/pkg/cmd/local_run_test.go
index 72f84f2..95f5657 100644
--- a/pkg/cmd/local_run_test.go
+++ b/pkg/cmd/local_run_test.go
@@ -57,6 +57,26 @@ func TestLocalRunPropertyFileFlag(t *testing.T) {
 	}
 }
 
+func TestLocalRunPropertiesFlag(t *testing.T) {
+	options, rootCmd := kamelTestPreAddCommandInit()
+
+	localRunCmdOptions := addTestLocalRunCmd(options, rootCmd)
+
+	kamelTestPostAddCommandInit(t, rootCmd)
+
+	_, err := test.ExecuteCommand(rootCmd, "local", "run", "route.java", "-p", "prop1=value1", "-p", "prop2=value2")
+	if err != nil {
+		t.Fatalf("Unexpected error: %v", err)
+	}
+
+	if len(localRunCmdOptions.Properties) != 2 {
+		t.Fatalf("Additional dependencies expected to contain: \n %v elements\nGot:\n %v elements\n", 2, len(localRunCmdOptions.Properties))
+	}
+	if localRunCmdOptions.Properties[0] != "prop1=value1" || localRunCmdOptions.Properties[1] != "prop2=value2" {
+		t.Fatalf("Additional dependencies expected to be: \n %v\nGot:\n %v\n", "[prop1=value1, prop2=value2]", localRunCmdOptions.Properties)
+	}
+}
+
 func TestLocalRunAdditionalDependenciesFlag(t *testing.T) {
 	options, rootCmd := kamelTestPreAddCommandInit()
 
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index e484d39..5904272 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -218,16 +218,9 @@ func (o *runCmdOptions) validate() error {
 		}
 	}
 
-	for _, fileName := range o.PropertyFiles {
-		if !strings.HasSuffix(fileName, ".properties") {
-			return fmt.Errorf("supported property files must have a .properties extension: %s", fileName)
-		}
-
-		if file, err := os.Stat(fileName); err != nil {
-			return errors.Wrapf(err, "unable to access property file %s", fileName)
-		} else if file.IsDir() {
-			return fmt.Errorf("property file %s is a directory", fileName)
-		}
+	err := validatePropertyFiles(o.PropertyFiles)
+	if err != nil {
+		return err
 	}
 
 	for _, label := range o.Labels {
diff --git a/pkg/cmd/util_commands.go b/pkg/cmd/util_commands.go
index b44243a..4819935 100644
--- a/pkg/cmd/util_commands.go
+++ b/pkg/cmd/util_commands.go
@@ -86,7 +86,7 @@ func RunLocalIntegration(properties []string, dependencies []string, routes []st
 	fmt.Printf("executing: %s", strings.Join(cmd.Args, " "))
 
 	// Add directory where the properties file resides.
-	cmd.Env = append(cmd.Env, "CAMEL_K_CONF_D="+strings.Join(confDirectories(properties), ","))
+	cmd.Env = append(cmd.Env, "CAMEL_K_CONF_D="+getPropertiesDir())
 
 	// Add files to the command line under the CAMEL_K_ROUTES flag.
 	cmd.Env = append(cmd.Env, "CAMEL_K_ROUTES="+strings.Join(formatRoutes(routes), ","))
diff --git a/pkg/cmd/util_dependencies.go b/pkg/cmd/util_dependencies.go
index 30722a7..c73f56b 100644
--- a/pkg/cmd/util_dependencies.go
+++ b/pkg/cmd/util_dependencies.go
@@ -305,6 +305,75 @@ func validateIntegrationForDependencies(args []string, additionalDependencies []
 	return nil
 }
 
+func validatePropertyFiles(propertyFiles []string) error {
+	for _, fileName := range propertyFiles {
+		if !strings.HasSuffix(fileName, ".properties") {
+			return fmt.Errorf("supported property files must have a .properties extension: %s", fileName)
+		}
+
+		if file, err := os.Stat(fileName); err != nil {
+			return errors.Wrapf(err, "unable to access property file %s", fileName)
+		} else if file.IsDir() {
+			return fmt.Errorf("property file %s is a directory", fileName)
+		}
+	}
+
+	return nil
+}
+
+func getPropertiesDir() string {
+	// Directory is created under the maven directory which is removed.
+	return path.Join(mavenWorkingDirectory, "properties")
+}
+
+func createPropertiesDirectory() error {
+	// Check directory exists.
+	directoryExists, err := util.DirectoryExists(getPropertiesDir())
+	if err != nil {
+		return err
+	}
+
+	if !directoryExists {
+		err := os.MkdirAll(getPropertiesDir(), 0777)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func updateIntegrationProperties(command *localRunCmdOptions) error {
+	// Create properties directory under Maven working directory. This ensures that
+	// property files of different integrations do not clash.
+	err := createPropertiesDirectory()
+	if err != nil {
+		return err
+	}
+
+	// Relocate properties files to this integration's property directory.
+	relocatedPropertyFiles := []string{}
+	for _, propertyFile := range command.PropertyFiles {
+		relocatedPropertyFile := path.Join(getPropertiesDir(), path.Base(propertyFile))
+		util.CopyFile(propertyFile, relocatedPropertyFile)
+		relocatedPropertyFiles = append(relocatedPropertyFiles, relocatedPropertyFile)
+	}
+
+	// Output list of properties to property file if any CLI properties were given.
+	if len(command.Properties) > 0 {
+		propertyFilePath := path.Join(getPropertiesDir(), "CLI.properties")
+		err = ioutil.WriteFile(propertyFilePath, []byte(strings.Join(command.Properties, "\n")), 0777)
+		if err != nil {
+			return err
+		}
+		relocatedPropertyFiles = append(relocatedPropertyFiles, propertyFilePath)
+	}
+
+	// Update command PropertyFiles.
+	command.PropertyFiles = relocatedPropertyFiles
+
+	return nil
+}
+
 func createMavenWorkingDirectory() error {
 	// Create local Maven context.
 	temporaryDirectory, err := ioutil.TempDir(os.TempDir(), "maven-")