You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2022/11/30 11:11:15 UTC

[camel-k] branch main updated: fix(trait): trait error "camel-catalog already exists" during upgrade

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 38c867b48 fix(trait): trait error "camel-catalog already exists" during upgrade
38c867b48 is described below

commit 38c867b489294a4b74fe697a73d347d60b49dfbe
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Wed Nov 30 13:02:24 2022 +0900

    fix(trait): trait error "camel-catalog already exists" during upgrade
    
    Fix #3822
---
 pkg/trait/camel.go | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index 09992ae4e..26d87c589 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -26,6 +26,7 @@ import (
 	"github.com/pkg/errors"
 
 	corev1 "k8s.io/api/core/v1"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/pointer"
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
@@ -76,8 +77,7 @@ func (t *camelTrait) Apply(e *Environment) error {
 	}
 
 	if e.CamelCatalog == nil {
-		err := t.loadOrCreateCatalog(e, t.RuntimeVersion)
-		if err != nil {
+		if err := t.loadOrCreateCatalog(e, t.RuntimeVersion); err != nil {
 			return err
 		}
 	}
@@ -125,7 +125,8 @@ func (t *camelTrait) loadOrCreateCatalog(e *Environment, runtimeVersion string)
 		if exactVersionRegexp.MatchString(runtimeVersion) {
 			ctx, cancel := context.WithTimeout(e.Ctx, e.Platform.Status.Build.GetTimeout().Duration)
 			defer cancel()
-			catalog, err = camel.GenerateCatalog(ctx, e.Client, ns, e.Platform.Status.Build.Maven, runtime, []maven.Dependency{})
+			catalog, err = camel.GenerateCatalog(ctx, e.Client,
+				ns, e.Platform.Status.Build.Maven, runtime, []maven.Dependency{})
 			if err != nil {
 				return err
 			}
@@ -140,12 +141,22 @@ func (t *camelTrait) loadOrCreateCatalog(e *Environment, runtimeVersion string)
 			cx.Labels["camel.apache.org/runtime.provider"] = string(runtime.Provider)
 			cx.Labels["camel.apache.org/catalog.generated"] = True
 
-			err = e.Client.Create(e.Ctx, &cx)
-			if err != nil {
-				return errors.Wrapf(err, "unable to create catalog runtime=%s, provider=%s, name=%s",
-					runtime.Version,
-					runtime.Provider,
-					catalogName)
+			if err := e.Client.Create(e.Ctx, &cx); err != nil {
+				if k8serrors.IsAlreadyExists(err) {
+					// It's still possible that catalog wasn't yet found at the time of loading
+					// but then created in the background before the client tries to create it.
+					// In this case, simply try loading again and reuse the existing catalog.
+					catalog, err = camel.LoadCatalog(e.Ctx, e.Client, ns, runtime)
+					if err != nil {
+						// unexpected error
+						return errors.Wrapf(err, "catalog %q already exists but unable to load", catalogName)
+					}
+				} else {
+					return errors.Wrapf(err, "unable to create catalog runtime=%s, provider=%s, name=%s",
+						runtime.Version,
+						runtime.Provider,
+						catalogName)
+				}
 			}
 		}
 	}