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