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

pcongiusti pushed a commit to branch release-1.10.x
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit 097b2299230d7dc7d80a569210468b980c36d87c
Author: Pasquale Congiusti <pasquale.congiu...@gmail.com>
AuthorDate: Mon Sep 26 16:34:24 2022 +0200

    feat(cli): promote allow Integration update
    
    Closes #3673
---
 e2e/namespace/install/cli/promote_test.go | 15 +++++++++++++++
 e2e/support/test_support.go               | 15 +++++++++++++++
 pkg/cmd/promote.go                        | 20 ++++++++++++++++++--
 3 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/e2e/namespace/install/cli/promote_test.go 
b/e2e/namespace/install/cli/promote_test.go
index 76ad5b62a..bc95fc010 100644
--- a/e2e/namespace/install/cli/promote_test.go
+++ b/e2e/namespace/install/cli/promote_test.go
@@ -107,6 +107,21 @@ func TestKamelCLIPromote(t *testing.T) {
                                Expect(IntegrationPodImage(nsProd, 
"promote-route")()).Should(Equal(IntegrationPodImage(nsDev, "promote-route")()))
                        })
 
+                       t.Run("plain integration promotion update", func(t 
*testing.T) {
+                               // Update the configmap
+                               var cmData = make(map[string]string)
+                               cmData["my-configmap-key"] = "I am production, 
but I was updated!"
+                               UpdatePlainTextConfigmap(nsProd, "my-cm", 
cmData)
+
+                               Expect(Kamel("promote", "-n", nsDev, 
"promote-route", "--to", nsProd).Execute()).To(Succeed())
+                               Eventually(IntegrationPodPhase(nsProd, 
"promote-route"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+                               Eventually(IntegrationConditionStatus(nsProd, 
"promote-route", v1.IntegrationConditionReady), 
TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+                               Eventually(IntegrationLogs(nsProd, 
"promote-route"), TestTimeoutShort).Should(ContainSubstring("I am production, 
but I was updated!"))
+                               Eventually(IntegrationLogs(nsProd, 
"promote-route"), TestTimeoutShort).Should(ContainSubstring("very top secret 
production"))
+                               // They must use the same image
+                               Expect(IntegrationPodImage(nsProd, 
"promote-route")()).Should(Equal(IntegrationPodImage(nsDev, "promote-route")()))
+                       })
+
                        t.Run("no kamelet in destination", func(t *testing.T) {
                                Expect(Kamel("promote", "-n", nsDev, 
"timer-kamelet-usage", "--to", nsProd).Execute()).NotTo(Succeed())
                        })
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index 28eec818f..c6074a096 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -1190,6 +1190,21 @@ func CreatePlainTextConfigmap(ns string, name string, 
data map[string]string) er
        return TestClient().Create(TestContext, &cm)
 }
 
+func UpdatePlainTextConfigmap(ns string, name string, data map[string]string) 
error {
+       cm := corev1.ConfigMap{
+               TypeMeta: metav1.TypeMeta{
+                       Kind:       "ConfigMap",
+                       APIVersion: corev1.SchemeGroupVersion.String(),
+               },
+               ObjectMeta: metav1.ObjectMeta{
+                       Namespace: ns,
+                       Name:      name,
+               },
+               Data: data,
+       }
+       return TestClient().Update(TestContext, &cm)
+}
+
 func CreateBinaryConfigmap(ns string, name string, data map[string][]byte) 
error {
        cm := corev1.ConfigMap{
                TypeMeta: metav1.TypeMeta{
diff --git a/pkg/cmd/promote.go b/pkg/cmd/promote.go
index bf81e3e81..5d2e53723 100644
--- a/pkg/cmd/promote.go
+++ b/pkg/cmd/promote.go
@@ -127,7 +127,7 @@ func (o *promoteCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
                // KameletBinding promotion
                destKameletBinding := 
o.editKameletBinding(sourceKameletBinding, sourceIntegration)
 
-               return c.Create(o.Context, destKameletBinding)
+               return o.saveKameletBinding(destKameletBinding)
        }
        // Plain Integration promotion
        destIntegration := o.editIntegration(sourceIntegration)
@@ -138,7 +138,7 @@ func (o *promoteCmdOptions) run(cmd *cobra.Command, args 
[]string) error {
                return err
        }
 
-       return c.Create(o.Context, destIntegration)
+       return o.saveIntegration(destIntegration)
 }
 
 func checkOpsCompatibility(cmd *cobra.Command, source, dest map[string]string) 
error {
@@ -423,6 +423,14 @@ func (o *promoteCmdOptions) editIntegration(it 
*v1.Integration) *v1.Integration
        return &dst
 }
 
+func (o *promoteCmdOptions) saveIntegration(it *v1.Integration) error {
+       err := o._client.Create(o.Context, it)
+       if err != nil && !k8serrors.IsAlreadyExists(err) {
+               return o._client.Update(o.Context, it)
+       }
+       return err
+}
+
 func (o *promoteCmdOptions) editKameletBinding(kb *v1alpha1.KameletBinding, it 
*v1.Integration) *v1alpha1.KameletBinding {
        dst := v1alpha1.NewKameletBinding(o.To, kb.Name)
        dst.Spec = *kb.Spec.DeepCopy()
@@ -450,6 +458,14 @@ func (o *promoteCmdOptions) editKameletBinding(kb 
*v1alpha1.KameletBinding, it *
        return &dst
 }
 
+func (o *promoteCmdOptions) saveKameletBinding(kb *v1alpha1.KameletBinding) 
error {
+       err := o._client.Create(o.Context, kb)
+       if err != nil && !k8serrors.IsAlreadyExists(err) {
+               return o._client.Update(o.Context, kb)
+       }
+       return err
+}
+
 //
 // RoleBinding is required to allow access to images in one namespace
 // by another namespace. Without this on rbac-enabled clusters, the

Reply via email to