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

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

commit 9719d5e8c8bf444a18ab89281c81545486ebb54f
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Thu Jan 16 18:10:04 2025 +0100

    fix(ctrl): use maven settings to install Kamelets
    
    Closes #6030
---
 pkg/controller/integrationplatform/create_test.go  |  8 ++++
 pkg/controller/integrationplatform/kamelets.go     | 47 +++++++++++++++++++---
 .../integrationplatform/kamelets_test.go           | 19 ++++++++-
 3 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/pkg/controller/integrationplatform/create_test.go 
b/pkg/controller/integrationplatform/create_test.go
index 0124a81db..30726a8b2 100644
--- a/pkg/controller/integrationplatform/create_test.go
+++ b/pkg/controller/integrationplatform/create_test.go
@@ -24,6 +24,7 @@ import (
        "os"
        "strings"
        "testing"
+       "time"
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
        "github.com/apache/camel-k/v2/pkg/platform"
@@ -35,6 +36,7 @@ import (
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
        corev1 "k8s.io/api/core/v1"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/runtime"
        k8stesting "k8s.io/client-go/testing"
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -124,6 +126,9 @@ func TestCreateNewCatalog(t *testing.T) {
                        Build: v1.IntegrationPlatformBuildSpec{
                                RuntimeProvider: v1.RuntimeProviderQuarkus,
                                RuntimeVersion:  defaults.DefaultRuntimeVersion,
+                               Timeout: &metav1.Duration{
+                                       Duration: 1 * time.Minute,
+                               },
                        },
                },
        }
@@ -187,6 +192,9 @@ func TestCreateNewCatalog(t *testing.T) {
                        Build: v1.IntegrationPlatformBuildSpec{
                                RuntimeProvider: v1.RuntimeProviderQuarkus,
                                RuntimeVersion:  defaults.DefaultRuntimeVersion,
+                               Timeout: &metav1.Duration{
+                                       Duration: 1 * time.Minute,
+                               },
                        },
                },
        }
diff --git a/pkg/controller/integrationplatform/kamelets.go 
b/pkg/controller/integrationplatform/kamelets.go
index 9ff27c956..7d355e339 100644
--- a/pkg/controller/integrationplatform/kamelets.go
+++ b/pkg/controller/integrationplatform/kamelets.go
@@ -36,6 +36,8 @@ import (
        "github.com/apache/camel-k/v2/pkg/client"
        "github.com/apache/camel-k/v2/pkg/util"
        "github.com/apache/camel-k/v2/pkg/util/defaults"
+       "github.com/apache/camel-k/v2/pkg/util/jvm"
+       "github.com/apache/camel-k/v2/pkg/util/kubernetes"
        "github.com/apache/camel-k/v2/pkg/util/log"
        "github.com/apache/camel-k/v2/pkg/util/maven"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -61,7 +63,7 @@ func installKameletCatalog(ctx context.Context, c 
client.Client, platform *v1.In
                return -1, -1, err
        }
        // Download Kamelet dependency
-       if err := downloadKameletDependency(ctx, version, kameletDir); err != 
nil {
+       if err := downloadKameletDependency(ctx, c, platform, version, 
kameletDir); err != nil {
                return -1, -1, err
        }
        // Extract Kamelets files
@@ -100,9 +102,7 @@ func prepareKameletDirectory() (string, error) {
        return kameletDir, nil
 }
 
-func downloadKameletDependency(ctx context.Context, version, kameletsDir 
string) error {
-       // TODO: we may want to add the maven settings coming from the platform
-       // in order to cover any user security setting in place
+func downloadKameletDependency(ctx context.Context, c client.Client, platform 
*v1.IntegrationPlatform, version, kameletsDir string) error {
        p := maven.NewProjectWithGAV("org.apache.camel.k.kamelets", 
"kamelets-catalog", defaults.Version)
        mc := maven.NewContext(kameletsDir)
        mc.AddArgument("-q")
@@ -111,7 +111,44 @@ func downloadKameletDependency(ctx context.Context, 
version, kameletsDir string)
        mc.AddArgument("-Dmdep.useBaseVersion=true")
        mc.AddArgument(fmt.Sprintf("-DoutputDirectory=%s", kameletsDir))
 
-       return p.Command(mc).Do(ctx)
+       if settings, err := kubernetes.ResolveValueSource(ctx, c, 
platform.Namespace, &platform.Status.Build.Maven.Settings); err != nil {
+               return err
+       } else if settings != "" {
+               mc.UserSettings = []byte(settings)
+       }
+
+       settings, err := maven.NewSettings(maven.DefaultRepositories, 
maven.ProxyFromEnvironment)
+       if err != nil {
+               return err
+       }
+       data, err := settings.MarshalBytes()
+       if err != nil {
+               return err
+       }
+       mc.GlobalSettings = data
+       secrets := platform.Status.Build.Maven.CASecrets
+
+       if secrets != nil {
+               certsData, err := kubernetes.GetSecretsRefData(ctx, c, 
platform.Namespace, secrets)
+               if err != nil {
+                       return err
+               }
+               trustStoreName := "trust.jks"
+               trustStorePass := jvm.NewKeystorePassword()
+               err = jvm.GenerateKeystore(ctx, kameletsDir, trustStoreName, 
trustStorePass, certsData)
+               if err != nil {
+                       return err
+               }
+               mc.ExtraMavenOpts = append(mc.ExtraMavenOpts,
+                       "-Djavax.net.ssl.trustStore="+trustStoreName,
+                       "-Djavax.net.ssl.trustStorePassword="+trustStorePass,
+               )
+       }
+
+       timeoutCtx, cancel := context.WithTimeout(ctx, 
platform.Status.Build.GetTimeout().Duration)
+       defer cancel()
+
+       return p.Command(mc).Do(timeoutCtx)
 }
 
 func extractKameletsFromDependency(ctx context.Context, version, kameletsDir 
string) error {
diff --git a/pkg/controller/integrationplatform/kamelets_test.go 
b/pkg/controller/integrationplatform/kamelets_test.go
index 0bf31c0c2..f99abe1d1 100644
--- a/pkg/controller/integrationplatform/kamelets_test.go
+++ b/pkg/controller/integrationplatform/kamelets_test.go
@@ -26,13 +26,16 @@ import (
        "path/filepath"
        "strings"
        "testing"
+       "time"
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
        "github.com/apache/camel-k/v2/pkg/util/boolean"
        "github.com/apache/camel-k/v2/pkg/util/camel"
+       "github.com/apache/camel-k/v2/pkg/util/defaults"
        "github.com/apache/camel-k/v2/pkg/util/test"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func TestLoadKamelet(t *testing.T) {
@@ -112,6 +115,20 @@ func TestPrepareKameletsDirectory(t *testing.T) {
 }
 
 func TestDownloadKameletDependencyAndExtract(t *testing.T) {
+       cli, err := test.NewFakeClient()
+       assert.NoError(t, err)
+       itp := v1.NewIntegrationPlatform("itp-ns", "my-itp")
+       itp.Status = v1.IntegrationPlatformStatus{
+               IntegrationPlatformSpec: v1.IntegrationPlatformSpec{
+                       Build: v1.IntegrationPlatformBuildSpec{
+                               RuntimeProvider: v1.RuntimeProviderQuarkus,
+                               RuntimeVersion:  defaults.DefaultRuntimeVersion,
+                               Timeout: &metav1.Duration{
+                                       Duration: 1 * time.Minute,
+                               },
+                       },
+               },
+       }
        // use local Maven executable in tests
        t.Setenv("MAVEN_WRAPPER", boolean.FalseString)
        _, ok := os.LookupEnv("MAVEN_CMD")
@@ -126,7 +143,7 @@ func TestDownloadKameletDependencyAndExtract(t *testing.T) {
        assert.NoError(t, err)
        camelVersion := c.Runtime.Metadata["camel.version"]
        assert.NotEqual(t, "", camelVersion)
-       err = downloadKameletDependency(context.TODO(), camelVersion, tmpDir)
+       err = downloadKameletDependency(context.TODO(), cli, &itp, 
camelVersion, tmpDir)
        assert.NoError(t, err)
        downloadedDependency, err := os.Stat(path.Join(tmpDir, 
fmt.Sprintf("camel-kamelets-%s.jar", camelVersion)))
        assert.NoError(t, err)

Reply via email to