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