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

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


The following commit(s) were added to refs/heads/camel-main by this push:
     new daae799  Fix #2271: add support for beans in kamelets
daae799 is described below

commit daae7990546fd75e139142899f4812f98135e734
Author: nicolaferraro <ni.ferr...@gmail.com>
AuthorDate: Tue Jun 8 23:29:01 2021 +0200

    Fix #2271: add support for beans in kamelets
---
 config/crd/bases/camel.apache.org_kamelets.yaml    |  8 ++-
 .../1.5.0-snapshot/camel.apache.org_kamelets.yaml  |  8 ++-
 e2e/knative/knative_platform_test.go               |  6 +-
 .../common/kamelet-beans/beans-source.kamelet.yaml | 36 ++++++++++++
 e2e/yaks/common/kamelet-beans/kamelet.feature      | 15 +++++
 e2e/yaks/common/kamelet-beans/yaks-config.yaml     | 26 +++++++++
 helm/camel-k/crds/crd-kamelet.yaml                 |  8 ++-
 pkg/apis/camel/v1/common_types.go                  |  5 ++
 pkg/apis/camel/v1alpha1/kamelet_types.go           |  8 ++-
 pkg/apis/camel/v1alpha1/kamelet_types_support.go   | 10 ++++
 pkg/cmd/run.go                                     |  4 +-
 pkg/kamelet/initialize.go                          |  9 +++
 pkg/trait/init.go                                  |  4 +-
 pkg/trait/kamelets.go                              | 33 ++++-------
 pkg/trait/kamelets_test.go                         | 60 ++++----------------
 pkg/util/digest/digest.go                          |  4 +-
 pkg/util/{flow => dsl}/flow.go                     |  2 +-
 pkg/util/{flow => dsl}/flow_test.go                |  2 +-
 pkg/util/{flow/flow.go => dsl/template.go}         | 49 +++++------------
 .../{flow/flow_test.go => dsl/template_test.go}    | 64 +++++++++++++---------
 20 files changed, 209 insertions(+), 152 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_kamelets.yaml 
b/config/crd/bases/camel.apache.org_kamelets.yaml
index e8371f9..dcd7a52 100644
--- a/config/crd/bases/camel.apache.org_kamelets.yaml
+++ b/config/crd/bases/camel.apache.org_kamelets.yaml
@@ -214,8 +214,7 @@ spec:
                   type: string
                 type: array
               flow:
-                description: Flow is an unstructured object representing a 
Camel Flow
-                  in YAML/JSON DSL
+                description: 'Deprecated: use template'
                 type: object
                 x-kubernetes-preserve-unknown-fields: true
               sources:
@@ -262,6 +261,11 @@ spec:
                       type: string
                   type: object
                 type: array
+              template:
+                description: Template is an unstructured object representing a 
Kamelet
+                  template in YAML/JSON DSL
+                type: object
+                x-kubernetes-preserve-unknown-fields: true
               types:
                 additionalProperties:
                   properties:
diff --git 
a/deploy/olm-catalog/camel-k-dev/1.5.0-snapshot/camel.apache.org_kamelets.yaml 
b/deploy/olm-catalog/camel-k-dev/1.5.0-snapshot/camel.apache.org_kamelets.yaml
index e8371f9..dcd7a52 100644
--- 
a/deploy/olm-catalog/camel-k-dev/1.5.0-snapshot/camel.apache.org_kamelets.yaml
+++ 
b/deploy/olm-catalog/camel-k-dev/1.5.0-snapshot/camel.apache.org_kamelets.yaml
@@ -214,8 +214,7 @@ spec:
                   type: string
                 type: array
               flow:
-                description: Flow is an unstructured object representing a 
Camel Flow
-                  in YAML/JSON DSL
+                description: 'Deprecated: use template'
                 type: object
                 x-kubernetes-preserve-unknown-fields: true
               sources:
@@ -262,6 +261,11 @@ spec:
                       type: string
                   type: object
                 type: array
+              template:
+                description: Template is an unstructured object representing a 
Kamelet
+                  template in YAML/JSON DSL
+                type: object
+                x-kubernetes-preserve-unknown-fields: true
               types:
                 additionalProperties:
                   properties:
diff --git a/e2e/knative/knative_platform_test.go 
b/e2e/knative/knative_platform_test.go
index 4bb5952..75b4321 100644
--- a/e2e/knative/knative_platform_test.go
+++ b/e2e/knative/knative_platform_test.go
@@ -33,7 +33,7 @@ import (
 
        . "github.com/apache/camel-k/e2e/support"
        "github.com/apache/camel-k/pkg/apis/camel/v1"
-       "github.com/apache/camel-k/pkg/util/flow"
+       "github.com/apache/camel-k/pkg/util/dsl"
        "github.com/apache/camel-k/pkg/util/knative"
 )
 
@@ -57,10 +57,10 @@ func TestKnativePlatform(t *testing.T) {
                        // Change something in the integration to produce a 
redeploy
                        Expect(UpdateIntegration(ns, "yaml", func(it 
*v1.Integration) {
                                it.Spec.Profile = ""
-                               content, err := flow.ToYamlDSL(it.Spec.Flows)
+                               content, err := dsl.ToYamlDSL(it.Spec.Flows)
                                assert.NoError(t, err)
                                newData := strings.ReplaceAll(string(content), 
"string!", "string!!!")
-                               newFlows, err := flow.FromYamlDSLString(newData)
+                               newFlows, err := dsl.FromYamlDSLString(newData)
                                assert.NoError(t, err)
                                it.Spec.Flows = newFlows
                        })).To(Succeed())
diff --git a/e2e/yaks/common/kamelet-beans/beans-source.kamelet.yaml 
b/e2e/yaks/common/kamelet-beans/beans-source.kamelet.yaml
new file mode 100644
index 0000000..3b5a279
--- /dev/null
+++ b/e2e/yaks/common/kamelet-beans/beans-source.kamelet.yaml
@@ -0,0 +1,36 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: beans-source
+  labels:
+    camel.apache.org/kamelet.type: "source"
+spec:
+  template:
+    beans:
+    - name: myBean
+      type: "#class:java.util.Date"
+      properties:
+        time: 0
+    from:
+      uri: timer:tick
+      steps:
+        - set-body:
+            simple: "Bean time is ${bean:{{myBean}}?method=getTime}!"
+        - to: "kamelet:sink"
diff --git a/e2e/yaks/common/kamelet-beans/kamelet.feature 
b/e2e/yaks/common/kamelet-beans/kamelet.feature
new file mode 100644
index 0000000..97e5c0d
--- /dev/null
+++ b/e2e/yaks/common/kamelet-beans/kamelet.feature
@@ -0,0 +1,15 @@
+Feature: Kamelets can declare local beans
+
+  Background:
+    Given Disable auto removal of Kamelet resources
+    Given Disable auto removal of Kubernetes resources
+    Given Camel-K resource polling configuration
+      | maxAttempts          | 40   |
+      | delayBetweenAttempts | 3000 |
+
+  Scenario: Kamelets templates can use beans
+    Given bind Kamelet beans-source to uri log:info
+    When create KameletBinding binding
+    Then KameletBinding binding should be available
+    Then Camel-K integration binding should be running
+    Then Camel-K integration binding should print Bean time is 0!
diff --git a/e2e/yaks/common/kamelet-beans/yaks-config.yaml 
b/e2e/yaks/common/kamelet-beans/yaks-config.yaml
new file mode 100644
index 0000000..22e1b0e
--- /dev/null
+++ b/e2e/yaks/common/kamelet-beans/yaks-config.yaml
@@ -0,0 +1,26 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+config:
+  namespace:
+    temporary: true
+pre:
+- name: installation
+  run: |
+    kamel install -n $YAKS_NAMESPACE
+
+    kubectl apply -f beans-source.kamelet.yaml -n $YAKS_NAMESPACE
diff --git a/helm/camel-k/crds/crd-kamelet.yaml 
b/helm/camel-k/crds/crd-kamelet.yaml
index e8371f9..dcd7a52 100644
--- a/helm/camel-k/crds/crd-kamelet.yaml
+++ b/helm/camel-k/crds/crd-kamelet.yaml
@@ -214,8 +214,7 @@ spec:
                   type: string
                 type: array
               flow:
-                description: Flow is an unstructured object representing a 
Camel Flow
-                  in YAML/JSON DSL
+                description: 'Deprecated: use template'
                 type: object
                 x-kubernetes-preserve-unknown-fields: true
               sources:
@@ -262,6 +261,11 @@ spec:
                       type: string
                   type: object
                 type: array
+              template:
+                description: Template is an unstructured object representing a 
Kamelet
+                  template in YAML/JSON DSL
+                type: object
+                x-kubernetes-preserve-unknown-fields: true
               types:
                 additionalProperties:
                   properties:
diff --git a/pkg/apis/camel/v1/common_types.go 
b/pkg/apis/camel/v1/common_types.go
index 2bcc733..99baf6c 100644
--- a/pkg/apis/camel/v1/common_types.go
+++ b/pkg/apis/camel/v1/common_types.go
@@ -175,6 +175,11 @@ type Flow struct {
        RawMessage `json:",inline"`
 }
 
+// Template is an unstructured object representing a Kamelet template in 
YAML/JSON DSL
+type Template struct {
+       RawMessage `json:",inline"`
+}
+
 // RuntimeProvider --
 type RuntimeProvider string
 
diff --git a/pkg/apis/camel/v1alpha1/kamelet_types.go 
b/pkg/apis/camel/v1alpha1/kamelet_types.go
index 5a6def7..2b85920 100644
--- a/pkg/apis/camel/v1alpha1/kamelet_types.go
+++ b/pkg/apis/camel/v1alpha1/kamelet_types.go
@@ -43,8 +43,10 @@ var (
 
 // KameletSpec defines the desired state of Kamelet
 type KameletSpec struct {
-       Definition    *JSONSchemaProps            `json:"definition,omitempty"`
-       Sources       []camelv1.SourceSpec        `json:"sources,omitempty"`
+       Definition *JSONSchemaProps     `json:"definition,omitempty"`
+       Sources    []camelv1.SourceSpec `json:"sources,omitempty"`
+       Template   *camelv1.Template    `json:"template,omitempty"`
+       // Deprecated: use template
        Flow          *camelv1.Flow               `json:"flow,omitempty"`
        Authorization *AuthorizationSpec          
`json:"authorization,omitempty"`
        Types         map[EventSlot]EventTypeSpec `json:"types,omitempty"`
@@ -108,6 +110,8 @@ const (
        KameletConditionReasonInvalidName string = "InvalidName"
        // KameletConditionReasonInvalidProperty --
        KameletConditionReasonInvalidProperty string = "InvalidProperty"
+       // KameletConditionReasonInvalidTemplate --
+       KameletConditionReasonInvalidTemplate string = "InvalidTemplate"
 )
 
 type KameletPhase string
diff --git a/pkg/apis/camel/v1alpha1/kamelet_types_support.go 
b/pkg/apis/camel/v1alpha1/kamelet_types_support.go
index 52635f2..e363204 100644
--- a/pkg/apis/camel/v1alpha1/kamelet_types_support.go
+++ b/pkg/apis/camel/v1alpha1/kamelet_types_support.go
@@ -192,6 +192,16 @@ func ValidKameletProperties(kamelet *Kamelet) bool {
        return true
 }
 
+func ValidKameletTemplate(kamelet *Kamelet) bool {
+       if kamelet == nil {
+               return true
+       }
+       if kamelet.Spec.Template != nil && kamelet.Spec.Flow != nil {
+               return false
+       }
+       return true
+}
+
 // NewKamelet creates a new kamelet
 func NewKamelet(namespace string, name string) Kamelet {
        return Kamelet{
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index b097cf1..3d7c1eb 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -47,7 +47,7 @@ import (
        "github.com/apache/camel-k/pkg/client"
        "github.com/apache/camel-k/pkg/trait"
        "github.com/apache/camel-k/pkg/util"
-       "github.com/apache/camel-k/pkg/util/flow"
+       "github.com/apache/camel-k/pkg/util/dsl"
        "github.com/apache/camel-k/pkg/util/kubernetes"
        k8slog "github.com/apache/camel-k/pkg/util/kubernetes/log"
        "github.com/apache/camel-k/pkg/util/sync"
@@ -523,7 +523,7 @@ func (o *runCmdOptions) updateIntegrationCode(c 
client.Client, sources []string,
 
        for _, source := range resolvedSources {
                if o.UseFlows && !o.Compression && 
(strings.HasSuffix(source.Name, ".yaml") || strings.HasSuffix(source.Name, 
".yml")) {
-                       flows, err := flow.FromYamlDSLString(source.Content)
+                       flows, err := dsl.FromYamlDSLString(source.Content)
                        if err != nil {
                                return nil, err
                        }
diff --git a/pkg/kamelet/initialize.go b/pkg/kamelet/initialize.go
index 7fd4373..d3b38a1 100644
--- a/pkg/kamelet/initialize.go
+++ b/pkg/kamelet/initialize.go
@@ -49,6 +49,15 @@ func Initialize(kamelet *v1alpha1.Kamelet) 
(*v1alpha1.Kamelet, error) {
                        fmt.Sprintf("Kamelet property %q is reserved and cannot 
be part of the schema", v1alpha1.KameletIDProperty),
                )
        }
+       if !v1alpha1.ValidKameletTemplate(kamelet) {
+               ok = false
+               target.Status.SetCondition(
+                       v1alpha1.KameletConditionReady,
+                       corev1.ConditionFalse,
+                       v1alpha1.KameletConditionReasonInvalidTemplate,
+                       `Kamelet can only specify one of "flow" or "template"`,
+               )
+       }
 
        if !ok {
                target.Status.Phase = v1alpha1.KameletPhaseError
diff --git a/pkg/trait/init.go b/pkg/trait/init.go
index 07b923d..afd9d32 100644
--- a/pkg/trait/init.go
+++ b/pkg/trait/init.go
@@ -24,7 +24,7 @@ import (
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/util"
-       "github.com/apache/camel-k/pkg/util/flow"
+       "github.com/apache/camel-k/pkg/util/dsl"
 )
 
 const flowsInternalSourceName = "camel-k-embedded-flow.yaml"
@@ -53,7 +53,7 @@ func (t *initTrait) Apply(e *Environment) error {
 
                // Flows need to be turned into a generated source
                if len(e.Integration.Spec.Flows) > 0 {
-                       content, err := flow.ToYamlDSL(e.Integration.Spec.Flows)
+                       content, err := dsl.ToYamlDSL(e.Integration.Spec.Flows)
                        if err != nil {
                                return err
                        }
diff --git a/pkg/trait/kamelets.go b/pkg/trait/kamelets.go
index 1f3cdef..2a3a2cf 100644
--- a/pkg/trait/kamelets.go
+++ b/pkg/trait/kamelets.go
@@ -34,7 +34,7 @@ import (
        "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/util"
        "github.com/apache/camel-k/pkg/util/digest"
-       "github.com/apache/camel-k/pkg/util/flow"
+       "github.com/apache/camel-k/pkg/util/dsl"
        "github.com/apache/camel-k/pkg/util/kubernetes"
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -260,28 +260,27 @@ func (t *kameletsTrait) configureApplicationProperties(e 
*Environment) error {
 func (t *kameletsTrait) addKameletAsSource(e *Environment, kamelet 
*v1alpha1.Kamelet) error {
        sources := make([]v1.SourceSpec, 0)
 
-       if kamelet.Spec.Flow != nil {
-
-               flowData, err := flow.ToYamlDSL([]v1.Flow{*kamelet.Spec.Flow})
+       if kamelet.Spec.Template != nil || kamelet.Spec.Flow != nil {
+               template := kamelet.Spec.Template
+               if template == nil {
+                       // Backward compatibility with Kamelets using flow
+                       template = &v1.Template{
+                               RawMessage: kamelet.Spec.Flow.RawMessage,
+                       }
+               }
+               flowData, err := dsl.TemplateToYamlDSL(*template, kamelet.Name)
                if err != nil {
                        return err
                }
 
-               propertyNames := make([]string, 0, 
len(kamelet.Status.Properties))
-               for _, p := range kamelet.Status.Properties {
-                       propertyNames = append(propertyNames, p.Name)
-               }
-
                flowSource := v1.SourceSpec{
                        DataSpec: v1.DataSpec{
                                Name:    fmt.Sprintf("%s.yaml", kamelet.Name),
                                Content: string(flowData),
                        },
-                       Language:      v1.LanguageYaml,
-                       Type:          v1.SourceTypeTemplate,
-                       PropertyNames: propertyNames,
+                       Language: v1.LanguageYaml,
                }
-               flowSource, err = integrationSourceFromKameletSource(e, 
kamelet, flowSource, fmt.Sprintf("%s-kamelet-%s-flow", e.Integration.Name, 
kamelet.Name))
+               flowSource, err = integrationSourceFromKameletSource(e, 
kamelet, flowSource, fmt.Sprintf("%s-kamelet-%s-template", e.Integration.Name, 
kamelet.Name))
                if err != nil {
                        return err
                }
@@ -296,11 +295,7 @@ func (t *kameletsTrait) addKameletAsSource(e *Environment, 
kamelet *v1alpha1.Kam
                sources = append(sources, intSource)
        }
 
-       kameletCounter := 0
        for _, source := range sources {
-               if source.Type == v1.SourceTypeTemplate {
-                       kameletCounter++
-               }
                replaced := false
                for idx, existing := range 
e.Integration.Status.GeneratedSources {
                        if existing.Name == source.Name {
@@ -313,10 +308,6 @@ func (t *kameletsTrait) addKameletAsSource(e *Environment, 
kamelet *v1alpha1.Kam
                }
        }
 
-       if kameletCounter > 1 {
-               return fmt.Errorf(`kamelet %s contains %d sources of type 
"kamelet": at most one is allowed`, kamelet.Name, kameletCounter)
-       }
-
        return nil
 }
 
diff --git a/pkg/trait/kamelets_test.go b/pkg/trait/kamelets_test.go
index 942536a..1e34eae 100644
--- a/pkg/trait/kamelets_test.go
+++ b/pkg/trait/kamelets_test.go
@@ -109,13 +109,13 @@ func TestKameletLookup(t *testing.T) {
        assert.NoError(t, err)
        cm := environment.Resources.GetConfigMap(func(_ *corev1.ConfigMap) bool 
{ return true })
        assert.NotNil(t, cm)
-       assert.Equal(t, "it-kamelet-timer-flow", cm.Name)
+       assert.Equal(t, "it-kamelet-timer-template", cm.Name)
        assert.Equal(t, "test", cm.Namespace)
 
        assert.Len(t, environment.Integration.Status.GeneratedSources, 1)
        source := environment.Integration.Status.GeneratedSources[0]
        assert.Equal(t, "timer.yaml", source.Name)
-       assert.Equal(t, "template", string(source.Type))
+       assert.Equal(t, "", string(source.Type))
 
        assert.Equal(t, []string{"camel:log", "camel:timer"}, 
environment.Integration.Status.Dependencies)
 }
@@ -156,7 +156,7 @@ func TestKameletSecondarySourcesLookup(t *testing.T) {
 
        err = trait.Apply(environment)
        assert.NoError(t, err)
-       cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-flow" })
+       cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-template" })
        assert.NotNil(t, cmFlow)
        cmRes := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-000" })
        assert.NotNil(t, cmRes)
@@ -165,8 +165,8 @@ func TestKameletSecondarySourcesLookup(t *testing.T) {
 
        flowSource := environment.Integration.Status.GeneratedSources[0]
        assert.Equal(t, "timer.yaml", flowSource.Name)
-       assert.Equal(t, "template", string(flowSource.Type))
-       assert.Equal(t, "it-kamelet-timer-flow", flowSource.ContentRef)
+       assert.Equal(t, "", string(flowSource.Type))
+       assert.Equal(t, "it-kamelet-timer-template", flowSource.ContentRef)
        assert.Equal(t, "content", flowSource.ContentKey)
 
        supportSource := environment.Integration.Status.GeneratedSources[1]
@@ -218,44 +218,6 @@ func TestNonYAMLKameletLookup(t *testing.T) {
        assert.Equal(t, "template", string(source.Type))
 }
 
-func TestErrorMultipleKameletSources(t *testing.T) {
-       trait, environment := createKameletsTestEnvironment(`
-- from:
-    uri: kamelet:timer
-    steps:
-    - to: log:info
-`, &v1alpha1.Kamelet{
-               ObjectMeta: metav1.ObjectMeta{
-                       Namespace: "test",
-                       Name:      "timer",
-               },
-               Spec: v1alpha1.KameletSpec{
-                       Sources: []v1.SourceSpec{
-                               {
-                                       DataSpec: v1.DataSpec{
-                                               Name:    "mykamelet.groovy",
-                                               Content: 
`from("timer").to("log:info")`,
-                                       },
-                                       Type: v1.SourceTypeTemplate,
-                               },
-                       },
-                       Flow: marshalOrFail(map[string]interface{}{
-                               "from": map[string]interface{}{
-                                       "uri": "timer:tick",
-                               },
-                       }),
-               },
-               Status: v1alpha1.KameletStatus{Phase: 
v1alpha1.KameletPhaseReady},
-       })
-       enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
-       assert.True(t, enabled)
-       assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
-
-       err = trait.Apply(environment)
-       assert.Error(t, err)
-}
-
 func TestMultipleKamelets(t *testing.T) {
        trait, environment := createKameletsTestEnvironment(`
 - from:
@@ -322,25 +284,25 @@ func TestMultipleKamelets(t *testing.T) {
        err = trait.Apply(environment)
        assert.NoError(t, err)
 
-       cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-flow" })
+       cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-template" })
        assert.NotNil(t, cmFlow)
        cmRes := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-000" })
        assert.NotNil(t, cmRes)
-       cmFlow2 := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-logger-flow" })
+       cmFlow2 := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-logger-template" })
        assert.NotNil(t, cmFlow2)
 
        assert.Len(t, environment.Integration.Status.GeneratedSources, 3)
 
        flowSource2 := environment.Integration.Status.GeneratedSources[0]
        assert.Equal(t, "logger.yaml", flowSource2.Name)
-       assert.Equal(t, "template", string(flowSource2.Type))
-       assert.Equal(t, "it-kamelet-logger-flow", flowSource2.ContentRef)
+       assert.Equal(t, "", string(flowSource2.Type))
+       assert.Equal(t, "it-kamelet-logger-template", flowSource2.ContentRef)
        assert.Equal(t, "content", flowSource2.ContentKey)
 
        flowSource := environment.Integration.Status.GeneratedSources[1]
        assert.Equal(t, "timer.yaml", flowSource.Name)
-       assert.Equal(t, "template", string(flowSource.Type))
-       assert.Equal(t, "it-kamelet-timer-flow", flowSource.ContentRef)
+       assert.Equal(t, "", string(flowSource.Type))
+       assert.Equal(t, "it-kamelet-timer-template", flowSource.ContentRef)
        assert.Equal(t, "content", flowSource.ContentKey)
 
        supportSource := environment.Integration.Status.GeneratedSources[2]
diff --git a/pkg/util/digest/digest.go b/pkg/util/digest/digest.go
index e3baad4..6b2bf59 100644
--- a/pkg/util/digest/digest.go
+++ b/pkg/util/digest/digest.go
@@ -34,7 +34,7 @@ import (
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/util"
        "github.com/apache/camel-k/pkg/util/defaults"
-       "github.com/apache/camel-k/pkg/util/flow"
+       "github.com/apache/camel-k/pkg/util/dsl"
 )
 
 // ComputeForIntegration a digest of the fields that are relevant for the 
deployment
@@ -74,7 +74,7 @@ func ComputeForIntegration(integration *v1.Integration) 
(string, error) {
 
        // Integration flows
        if len(integration.Spec.Flows) > 0 {
-               flows, err := flow.ToYamlDSL(integration.Spec.Flows)
+               flows, err := dsl.ToYamlDSL(integration.Spec.Flows)
                if err != nil {
                        return "", err
                }
diff --git a/pkg/util/flow/flow.go b/pkg/util/dsl/flow.go
similarity index 99%
copy from pkg/util/flow/flow.go
copy to pkg/util/dsl/flow.go
index fa963cf..8ffeaac 100644
--- a/pkg/util/flow/flow.go
+++ b/pkg/util/dsl/flow.go
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package flow
+package dsl
 
 import (
        "bytes"
diff --git a/pkg/util/flow/flow_test.go b/pkg/util/dsl/flow_test.go
similarity index 99%
copy from pkg/util/flow/flow_test.go
copy to pkg/util/dsl/flow_test.go
index 731e2ff..cd6cbcc 100644
--- a/pkg/util/flow/flow_test.go
+++ b/pkg/util/dsl/flow_test.go
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package flow
+package dsl
 
 import (
        "bytes"
diff --git a/pkg/util/flow/flow.go b/pkg/util/dsl/template.go
similarity index 51%
rename from pkg/util/flow/flow.go
rename to pkg/util/dsl/template.go
index fa963cf..7abf08f 100644
--- a/pkg/util/flow/flow.go
+++ b/pkg/util/dsl/template.go
@@ -15,59 +15,36 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package flow
+package dsl
 
 import (
-       "bytes"
        "encoding/json"
        "fmt"
-       "io"
-       "io/ioutil"
 
        yaml2 "gopkg.in/yaml.v2"
 
-       "k8s.io/apimachinery/pkg/util/yaml"
-
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 )
 
-// FromYamlDSLString creates a slice of flows from a Camel YAML DSL string
-func FromYamlDSLString(flowsString string) ([]v1.Flow, error) {
-       return FromYamlDSL(bytes.NewReader([]byte(flowsString)))
-}
-
-// FromYamlDSL creates a slice of flows from a Camel YAML DSL stream
-func FromYamlDSL(reader io.Reader) ([]v1.Flow, error) {
-       buffered, err := ioutil.ReadAll(reader)
-       if err != nil {
-               return nil, err
-       }
-       var flows []v1.Flow
-       // Using the Kubernetes decoder to turn them into JSON before unmarshal.
-       // This avoids having map[interface{}]interface{} objects which are not 
JSON compatible.
-       jsonData, err := yaml.ToJSON(buffered)
+// TemplateToYamlDSL converts a kamelet template into its Camel YAML DSL 
equivalent
+func TemplateToYamlDSL(template v1.Template, id string) ([]byte, error) {
+       data, err := json.Marshal(&template)
        if err != nil {
                return nil, err
        }
-
-       if err = json.Unmarshal(jsonData, &flows); err != nil {
-               return nil, err
-       }
-       return flows, err
-}
-
-// ToYamlDSL converts a flow into its Camel YAML DSL equivalent
-func ToYamlDSL(flows []v1.Flow) ([]byte, error) {
-       data, err := json.Marshal(&flows)
-       if err != nil {
-               return nil, err
-       }
-       jsondata := make([]map[string]interface{}, 0)
+       jsondata := make(map[string]interface{}, 0)
        err = json.Unmarshal(data, &jsondata)
        if err != nil {
                return nil, fmt.Errorf("error unmarshalling json: %v", err)
        }
-       yamldata, err := yaml2.Marshal(&jsondata)
+       if _, present := jsondata["id"]; !present {
+               jsondata["id"] = id
+       }
+       templateWrapper := make(map[string]interface{}, 2)
+       templateWrapper["template"] = jsondata
+       listWrapper := make([]interface{}, 0, 1)
+       listWrapper = append(listWrapper, templateWrapper)
+       yamldata, err := yaml2.Marshal(listWrapper)
        if err != nil {
                return nil, fmt.Errorf("error marshalling to yaml: %v", err)
        }
diff --git a/pkg/util/flow/flow_test.go b/pkg/util/dsl/template_test.go
similarity index 56%
rename from pkg/util/flow/flow_test.go
rename to pkg/util/dsl/template_test.go
index 731e2ff..b2fb016 100644
--- a/pkg/util/flow/flow_test.go
+++ b/pkg/util/dsl/template_test.go
@@ -15,39 +15,49 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package flow
+package dsl
 
 import (
-       "bytes"
-       "encoding/json"
        "testing"
 
+       v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/stretchr/testify/assert"
 )
 
-func TestReadWriteYaml(t *testing.T) {
-       // yaml in conventional form as marshalled by the go runtime
-       yaml := `- from:
-    steps:
-    - to: log:info
-    uri: timer:tick
-`
-
-       yamlReader := bytes.NewReader([]byte(yaml))
-       flows, err := FromYamlDSL(yamlReader)
-       assert.NoError(t, err)
-       assert.NotNil(t, flows)
-       assert.Len(t, flows, 1)
-
-       flow := map[string]interface{}{}
-       err = json.Unmarshal(flows[0].RawMessage, &flow)
+func TestTemplateReadWrite(t *testing.T) {
+       templateJSON := v1.Template{
+               RawMessage: []byte(`
+               {
+                       "beans": [
+                               {
+                                       "name": "myBean",
+                                       "type": "com.acme.MyBean"
+                               }
+                       ],
+                       "from": {
+                               "uri": "kamelet:source",
+                               "steps": [
+                                       {
+                                               "uri": "log:info"
+                                       }
+                               ]
+                       }
+               }
+               `),
+       }
+
+       yamlBytes, err := TemplateToYamlDSL(templateJSON, "myid")
        assert.NoError(t, err)
-
-       assert.NotNil(t, flow["from"])
-       assert.Nil(t, flow["xx"])
-
-       data, err := ToYamlDSL(flows)
-       assert.NoError(t, err)
-       assert.NotNil(t, data)
-       assert.Equal(t, yaml, string(data))
+       yaml := string(yamlBytes)
+       expected := `- template:
+    beans:
+    - name: myBean
+      type: com.acme.MyBean
+    from:
+      steps:
+      - uri: log:info
+      uri: kamelet:source
+    id: myid
+`
+       assert.Equal(t, expected, yaml)
 }

Reply via email to