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 <[email protected]>
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
+}

Reply via email to