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 2021/05/26 12:44:40 UTC

[camel-k] 02/06: feat(cmd): build-property flag

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

commit 93b1d104cdeab9e628f1bcb7446d330fa5201139
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue May 18 15:06:07 2021 +0200

    feat(cmd): build-property flag
    
    * Included a build-time-properties in Builder trait to provide the Build task the ability to add build time properties.
    * Introduced a new flag which will allow the user to introduce build time properties.  It will convert into build-time-properties, as expected by the Builder trait.
---
 pkg/cmd/run.go            | 14 ++++++++++----
 pkg/cmd/run_test.go       | 12 ++++++++++++
 pkg/trait/builder.go      | 30 +++++++++++++++++++++++++++---
 pkg/trait/builder_test.go | 19 +++++++++++++++++++
 4 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 36418a8..ade7f80 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -79,6 +79,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions)
 	cmd.Flags().BoolP("wait", "w", false, "Wait for the integration to be running")
 	cmd.Flags().StringP("kit", "k", "", "The kit used to run the integration")
 	cmd.Flags().StringArrayP("property", "p", nil, "Add a camel property")
+	cmd.Flags().StringArray("build-property", nil, "Add a build time property")
 	cmd.Flags().StringArray("configmap", nil, "Add a ConfigMap")
 	cmd.Flags().StringArray("secret", nil, "Add a Secret")
 	cmd.Flags().StringArray("maven-repository", nil, "Add a maven repository")
@@ -127,6 +128,7 @@ type runCmdOptions struct {
 	OpenAPIs        []string `mapstructure:"open-apis" yaml:",omitempty"`
 	Dependencies    []string `mapstructure:"dependencies" yaml:",omitempty"`
 	Properties      []string `mapstructure:"properties" yaml:",omitempty"`
+	BuildProperties []string `mapstructure:"build-properties" yaml:",omitempty"`
 	ConfigMaps      []string `mapstructure:"configmaps" yaml:",omitempty"`
 	Secrets         []string `mapstructure:"secrets" yaml:",omitempty"`
 	Repositories    []string `mapstructure:"maven-repositories" yaml:",omitempty"`
@@ -505,7 +507,7 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 		}
 	}
 
-	err = resolvePodTemplate(context.Background(),o.PodTemplate, &integration.Spec)
+	err = resolvePodTemplate(context.Background(), o.PodTemplate, &integration.Spec)
 	if err != nil {
 		return nil, err
 	}
@@ -550,6 +552,10 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 	for _, item := range o.Properties {
 		integration.Spec.AddConfiguration("property", item)
 	}
+	// convert each build configuration to a builder trait property
+	for _, item := range o.BuildProperties {
+		o.Traits = append(o.Traits, fmt.Sprintf("builder.build-time-properties=%s", item))
+	}
 	for _, item := range o.LoggingLevels {
 		integration.Spec.AddConfiguration("property", "logging.level."+item)
 	}
@@ -754,14 +760,14 @@ func resolvePodTemplate(ctx context.Context, templateSrc string, spec *v1.Integr
 	//template is inline
 	templateBytes := []byte(templateSrc)
 
-	jsonTemplate,err:= yaml.ToJSON(templateBytes)
-	if err!= nil {
+	jsonTemplate, err := yaml.ToJSON(templateBytes)
+	if err != nil {
 		jsonTemplate = templateBytes
 	}
 	err = json.Unmarshal(jsonTemplate, &template)
 
 	if err == nil {
-		spec.PodTemplate = &v1.PodSpecTemplate {
+		spec.PodTemplate = &v1.PodSpecTemplate{
 			Spec: template,
 		}
 	}
diff --git a/pkg/cmd/run_test.go b/pkg/cmd/run_test.go
index 711bba1..f11e157 100644
--- a/pkg/cmd/run_test.go
+++ b/pkg/cmd/run_test.go
@@ -409,6 +409,18 @@ func TestRunVolumeFlagWrongPVCFormat(t *testing.T) {
 	assert.NotNil(t, err)
 }
 
+func TestRunBuildPropertyFlag(t *testing.T) {
+	runCmdOptions, rootCmd, _ := initializeRunCmdOptions(t)
+	_, err := test.ExecuteCommand(rootCmd, cmdRun,
+		"--build-property", "build-prop1=val1",
+		"--build-property", "build-prop2=val2",
+		integrationSource)
+	assert.Nil(t, err)
+	assert.Len(t, runCmdOptions.BuildProperties, 2)
+	assert.Equal(t, "build-prop1=val1", runCmdOptions.BuildProperties[0])
+	assert.Equal(t, "build-prop2=val2", runCmdOptions.BuildProperties[1])
+}
+
 func TestRunValidateArgs(t *testing.T) {
 	runCmdOptions, rootCmd, _ := initializeRunCmdOptions(t)
 	args := []string{}
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 07d7401..1e96d49 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -18,7 +18,9 @@ limitations under the License.
 package trait
 
 import (
+	"fmt"
 	"sort"
+	"strings"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/pkg/builder"
@@ -32,6 +34,8 @@ type builderTrait struct {
 	BaseTrait `property:",squash"`
 	// Enable verbose logging on build components that support it (e.g. Kaniko build pod).
 	Verbose *bool `property:"verbose" json:"verbose,omitempty"`
+	// A list of properties to be provided to the build task
+	BuildTimeProperties []string `property:"build-time-properties" json:"buildTimeProperties,omitempty"`
 }
 
 func newBuilderTrait() Trait {
@@ -59,7 +63,11 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 }
 
 func (t *builderTrait) Apply(e *Environment) error {
-	builderTask := t.builderTask(e)
+	builderTask, err := t.builderTask(e)
+	if err != nil {
+		// Should we clean the failing integration kit as well?
+		return err
+	}
 
 	e.BuildTasks = append(e.BuildTasks, v1.Task{Builder: builderTask})
 
@@ -118,7 +126,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 	return nil
 }
 
-func (t *builderTrait) builderTask(e *Environment) *v1.BuilderTask {
+func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 	task := &v1.BuilderTask{
 		BaseTask: v1.BaseTask{
 			Name: "builder",
@@ -130,6 +138,22 @@ func (t *builderTrait) builderTask(e *Environment) *v1.BuilderTask {
 		Maven:        e.Platform.Status.Build.Maven,
 	}
 
+	// initialize properties if nil
+	if task.Properties == nil {
+		task.Properties = make(map[string]string)
+	}
+	// User provided build time configuration properties
+	if t.BuildTimeProperties != nil {
+		for _, v := range t.BuildTimeProperties {
+			split := strings.Split(v, "=")
+			if len(split) != 2 {
+				return nil, fmt.Errorf("Build time configuration property must have key=value format, it was %v", v)
+			}
+
+			task.Properties[split[0]] = split[1]
+		}
+	}
+
 	steps := make([]builder.Step, 0)
 	steps = append(steps, builder.DefaultSteps...)
 
@@ -143,7 +167,7 @@ func (t *builderTrait) builderTask(e *Environment) *v1.BuilderTask {
 
 	task.Steps = builder.StepIDsFor(steps...)
 
-	return task
+	return task, nil
 }
 
 func getImageName(e *Environment) string {
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 2bce1b5..591c744 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -27,6 +27,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/util"
 	"github.com/apache/camel-k/pkg/util/camel"
 	"github.com/apache/camel-k/pkg/util/defaults"
 	"github.com/apache/camel-k/pkg/util/kubernetes"
@@ -150,3 +151,21 @@ func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy v1.Int
 func NewBuilderTestCatalog() *Catalog {
 	return NewCatalog(context.TODO(), nil)
 }
+
+func TestBuildtimeConfigurationBuilderTrait(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.BuildTimeProperties = append(builderTrait.BuildTimeProperties, "build-time-prop1=build-time-value1")
+
+	err := builderTrait.Apply(env)
+
+	assert.Nil(t, err)
+	assert.Equal(t, "build-time-value1", env.BuildTasks[0].Builder.Properties["build-time-prop1"])
+}
+
+func createNominalBuilderTraitTest() *builderTrait {
+	builderTrait := newBuilderTrait().(*builderTrait)
+	builderTrait.Enabled = util.BoolP(true)
+
+	return builderTrait
+}