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 +}
