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 2024/09/14 05:23:40 UTC

(camel-k) 02/02: fix(kamelets): don't fail on Kamelets recreation

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

commit fa10c8d303ddbce697feab25c04f8fbece79c06e
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Sep 13 16:37:03 2024 +0200

    fix(kamelets): don't fail on Kamelets recreation
---
 pkg/controller/integrationplatform/create.go       | 21 ++++++++++----------
 pkg/controller/integrationplatform/create_test.go  | 23 +++++++++++++++++++++-
 pkg/controller/integrationplatform/kamelets.go     | 15 ++++++++++----
 .../integrationplatform/kamelets_test.go           |  3 ++-
 4 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/pkg/controller/integrationplatform/create.go b/pkg/controller/integrationplatform/create.go
index 85edbf94a..55e9ca3f3 100644
--- a/pkg/controller/integrationplatform/create.go
+++ b/pkg/controller/integrationplatform/create.go
@@ -167,23 +167,22 @@ func installKamelets(ctx context.Context, c client.Client, platform *v1.Integrat
 		camelVersion := platform.Status.Build.RuntimeCoreVersion
 		installedKam, erroredKam, err := installKameletCatalog(ctx, c, platform, camelVersion)
 		if err != nil {
-			platform.Status.Phase = v1.IntegrationPlatformPhaseError
+			// An error here should not be disruptive, we just report it happened
 			platform.Status.SetCondition(
 				v1.IntegrationPlatformConditionKameletCatalogAvailable,
 				corev1.ConditionFalse,
 				"IntegrationPlatformKameletCatalogAvailable",
-				fmt.Sprintf("kamelet catalog %s not available, please review given camel version. Error: %s", camelVersion, err),
+				fmt.Sprintf("kamelet catalog %s not available. Error: %s", camelVersion, err),
+			)
+		} else {
+			platform.Status.SetCondition(
+				v1.IntegrationPlatformConditionKameletCatalogAvailable,
+				corev1.ConditionTrue,
+				"IntegrationPlatformKameletCatalogAvailable",
+				fmt.Sprintf("successfully installed Kamelet catalog version %s: success %d Kamelets, failed %d Kamelets",
+					camelVersion, installedKam, erroredKam),
 			)
-
-			return platform, nil
 		}
-		platform.Status.SetCondition(
-			v1.IntegrationPlatformConditionKameletCatalogAvailable,
-			corev1.ConditionTrue,
-			"IntegrationPlatformKameletCatalogAvailable",
-			fmt.Sprintf("successfully installed Kamelet catalog version %s: success %d Kamelets, failed %d Kamelets",
-				camelVersion, installedKam, erroredKam),
-		)
 	}
 
 	return platform, nil
diff --git a/pkg/controller/integrationplatform/create_test.go b/pkg/controller/integrationplatform/create_test.go
index c47532070..0124a81db 100644
--- a/pkg/controller/integrationplatform/create_test.go
+++ b/pkg/controller/integrationplatform/create_test.go
@@ -159,10 +159,10 @@ func TestCreateNewCatalog(t *testing.T) {
 
 	// Set the folder where to install testing kamelets
 	tmpDir, err := os.MkdirTemp("/tmp", "kamelets*")
+	defer os.Unsetenv(kameletDirEnv)
 	assert.NoError(t, err)
 	os.Setenv(kameletDirEnv, tmpDir)
 	answer, err := action.Handle(context.TODO(), &ip)
-	os.Unsetenv(kameletDirEnv)
 	require.NoError(t, err)
 	assert.NotNil(t, answer)
 
@@ -180,6 +180,27 @@ func TestCreateNewCatalog(t *testing.T) {
 
 	require.NoError(t, err)
 	assert.NotEmpty(t, list.Items)
+
+	// Creating again a platform should not cause problem because any existing Kamelets file leftover
+	ip.Status = v1.IntegrationPlatformStatus{
+		IntegrationPlatformSpec: v1.IntegrationPlatformSpec{
+			Build: v1.IntegrationPlatformBuildSpec{
+				RuntimeProvider: v1.RuntimeProviderQuarkus,
+				RuntimeVersion:  defaults.DefaultRuntimeVersion,
+			},
+		},
+	}
+	// Refresh client with changed IP
+	c, err = test.NewFakeClient(&ip)
+	require.NoError(t, err)
+	action.InjectClient(c)
+	answer, err = action.Handle(context.TODO(), &ip)
+	require.NoError(t, err)
+	assert.NotNil(t, answer)
+
+	assert.Equal(t, v1.IntegrationPlatformPhaseReady, answer.Status.Phase)
+	assert.Equal(t, corev1.ConditionTrue, answer.Status.GetCondition(v1.IntegrationPlatformConditionCamelCatalogAvailable).Status)
+	assert.Equal(t, corev1.ConditionTrue, answer.Status.GetCondition(v1.IntegrationPlatformConditionKameletCatalogAvailable).Status)
 }
 
 func TestCreateCatalogError(t *testing.T) {
diff --git a/pkg/controller/integrationplatform/kamelets.go b/pkg/controller/integrationplatform/kamelets.go
index 370f464e0..83cfa5d6d 100644
--- a/pkg/controller/integrationplatform/kamelets.go
+++ b/pkg/controller/integrationplatform/kamelets.go
@@ -56,7 +56,10 @@ func installKameletCatalog(ctx context.Context, c client.Client, platform *v1.In
 		return -1, -1, err
 	}
 	// Prepare directory to contains kamelets
-	kameletDir := prepareKameletDirectory()
+	kameletDir, err := prepareKameletDirectory()
+	if err != nil {
+		return -1, -1, err
+	}
 	// Download Kamelet dependency
 	if err := downloadKameletDependency(ctx, version, kameletDir); err != nil {
 		return -1, -1, err
@@ -65,7 +68,6 @@ func installKameletCatalog(ctx context.Context, c client.Client, platform *v1.In
 	if err := extractKameletsFromDependency(ctx, version, kameletDir); err != nil {
 		return -1, -1, err
 	}
-
 	// Store Kamelets as Kubernetes resources
 	return applyKamelets(ctx, c, platform, kameletDir)
 }
@@ -84,13 +86,18 @@ func prepareKameletsPermissions(ctx context.Context, c client.Client, installing
 	return nil
 }
 
-func prepareKameletDirectory() string {
+func prepareKameletDirectory() (string, error) {
 	kameletDir := os.Getenv(kameletDirEnv)
 	if kameletDir == "" {
 		kameletDir = defaultKameletDir
 	}
+	// If the directory exists, it is likely a leftover from any previous Kamelet
+	// catalog installation. We should remove to be able to proceed
+	if err := os.RemoveAll(kameletDir); err != nil {
+		return kameletDirEnv, err
+	}
 
-	return kameletDir
+	return kameletDir, nil
 }
 
 func downloadKameletDependency(ctx context.Context, version, kameletsDir string) error {
diff --git a/pkg/controller/integrationplatform/kamelets_test.go b/pkg/controller/integrationplatform/kamelets_test.go
index 7a1a79aa6..0bf31c0c2 100644
--- a/pkg/controller/integrationplatform/kamelets_test.go
+++ b/pkg/controller/integrationplatform/kamelets_test.go
@@ -106,7 +106,8 @@ func TestPrepareKameletsPermissions(t *testing.T) {
 }
 
 func TestPrepareKameletsDirectory(t *testing.T) {
-	kameletDir := prepareKameletDirectory()
+	kameletDir, err := prepareKameletDirectory()
+	assert.NoError(t, err)
 	assert.Equal(t, defaultKameletDir, kameletDir)
 }