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

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

commit e6f028156593395e098eeec0a38b14902ee3bae0
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Tue Oct 22 15:35:22 2019 +0200

    feat(quarkus): Support loading Camel Quarkus catalog
---
 pkg/builder/builder_steps.go           |  18 -----
 pkg/builder/runtime/main.go            |  13 ++++
 pkg/builder/runtime/quarkus.go         |  15 +++-
 pkg/builder/runtime/runtime.go         |  10 +++
 pkg/controller/integrationkit/build.go |  16 ++--
 pkg/trait/camel.go                     | 132 ++++++++++++++++++---------------
 pkg/trait/camel_test.go                |   9 +--
 pkg/trait/quarkus.go                   |  23 ++++++
 pkg/util/camel/camel_runtime.go        |  30 ++++++--
 pkg/util/camel/camel_util.go           |  35 ++++++++-
 pkg/util/camel/camel_util_test.go      |  20 ++---
 pkg/util/camel/catalog.go              |   2 +-
 12 files changed, 210 insertions(+), 113 deletions(-)

diff --git a/pkg/builder/builder_steps.go b/pkg/builder/builder_steps.go
index d6b1f3f..32a54fa 100644
--- a/pkg/builder/builder_steps.go
+++ b/pkg/builder/builder_steps.go
@@ -27,7 +27,6 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/kubernetes"
        "github.com/apache/camel-k/pkg/util/maven"
        "github.com/apache/camel-k/pkg/util/tar"
@@ -40,7 +39,6 @@ func init() {
 }
 
 type steps struct {
-       LoadCatalog             Step
        GenerateProjectSettings Step
        InjectDependencies      Step
        SanitizeDependencies    Step
@@ -50,10 +48,6 @@ type steps struct {
 
 // Steps --
 var Steps = steps{
-       LoadCatalog: NewStep(
-               InitPhase,
-               loadCatalog,
-       ),
        GenerateProjectSettings: NewStep(
                ProjectGenerationPhase+1,
                generateProjectSettings,
@@ -78,7 +72,6 @@ var Steps = steps{
 
 // DefaultSteps --
 var DefaultSteps = []Step{
-       Steps.LoadCatalog,
        Steps.GenerateProjectSettings,
        Steps.InjectDependencies,
        Steps.SanitizeDependencies,
@@ -111,17 +104,6 @@ func registerStep(steps ...Step) {
        }
 }
 
-func loadCatalog(ctx *Context) error {
-       catalog, err := camel.LoadCatalog(ctx.C, ctx.Client, 
ctx.Build.Meta.Namespace, ctx.Build.CamelVersion, ctx.Build.RuntimeVersion)
-       if err != nil {
-               return err
-       }
-
-       ctx.Catalog = catalog
-
-       return nil
-}
-
 func generateProjectSettings(ctx *Context) error {
        val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, 
ctx.Namespace, &ctx.Build.Platform.Build.Maven.Settings)
        if err != nil {
diff --git a/pkg/builder/runtime/main.go b/pkg/builder/runtime/main.go
index 4b363a0..03fddda 100644
--- a/pkg/builder/runtime/main.go
+++ b/pkg/builder/runtime/main.go
@@ -27,16 +27,29 @@ import (
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/builder"
+       "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/maven"
 )
 
 // MainSteps --
 var MainSteps = []builder.Step{
+       Steps.LoadCamelCatalog,
        Steps.GenerateProject,
        Steps.ComputeDependencies,
 }
 
+func loadCamelCatalog(ctx *builder.Context) error {
+       catalog, err := camel.LoadCatalog(ctx.C, ctx.Client, 
ctx.Build.Meta.Namespace, ctx.Build.CamelVersion, ctx.Build.RuntimeVersion, nil)
+       if err != nil {
+               return err
+       }
+
+       ctx.Catalog = catalog
+
+       return nil
+}
+
 func generateProject(ctx *builder.Context) error {
        p := maven.NewProjectWithGAV("org.apache.camel.k.integration", 
"camel-k-integration", defaults.Version)
        p.Properties = ctx.Build.Platform.Build.Properties
diff --git a/pkg/builder/runtime/quarkus.go b/pkg/builder/runtime/quarkus.go
index df0faf5..c3c734a 100644
--- a/pkg/builder/runtime/quarkus.go
+++ b/pkg/builder/runtime/quarkus.go
@@ -10,16 +10,29 @@ import (
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/builder"
+       "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/maven"
 )
 
 // QuarkusSteps --
 var QuarkusSteps = []builder.Step{
+       Steps.LoadCamelQuarkusCatalog,
        Steps.GenerateQuarkusProject,
        Steps.ComputeQuarkusDependencies,
 }
 
+func loadCamelQuarkusCatalog(ctx *builder.Context) error {
+       catalog, err := camel.LoadCatalog(ctx.C, ctx.Client, 
ctx.Build.Meta.Namespace, ctx.Build.CamelVersion, ctx.Build.RuntimeVersion, 
ctx.Build.RuntimeProvider.Quarkus)
+       if err != nil {
+               return err
+       }
+
+       ctx.Catalog = catalog
+
+       return nil
+}
+
 func generateQuarkusProject(ctx *builder.Context) error {
        p := maven.NewProjectWithGAV("org.apache.camel.k.integration", 
"camel-k-integration", defaults.Version)
        p.Properties = ctx.Build.Platform.Build.Properties
@@ -82,7 +95,7 @@ func computeQuarkusDependencies(ctx *builder.Context) error {
 
        // Build the project, as the quarkus-bootstrap plugin build-tree goal
        // requires the artifact to be installed
-       mc.AddArgument("package")
+       mc.AddArgument("install")
        if err := maven.Run(mc); err != nil {
                return errors.Wrap(err, "failure while building project")
        }
diff --git a/pkg/builder/runtime/runtime.go b/pkg/builder/runtime/runtime.go
index 22106e0..ebd2162 100644
--- a/pkg/builder/runtime/runtime.go
+++ b/pkg/builder/runtime/runtime.go
@@ -28,15 +28,21 @@ func init() {
 // TODO: organise runtime steps into nested structs
 type steps struct {
        // Main
+       LoadCamelCatalog    builder.Step
        GenerateProject     builder.Step
        ComputeDependencies builder.Step
        // Quarkus
+       LoadCamelQuarkusCatalog    builder.Step
        GenerateQuarkusProject     builder.Step
        ComputeQuarkusDependencies builder.Step
 }
 
 var Steps = steps{
        // Main
+       LoadCamelCatalog: builder.NewStep(
+               builder.InitPhase,
+               loadCamelCatalog,
+       ),
        GenerateProject: builder.NewStep(
                builder.ProjectGenerationPhase,
                generateProject,
@@ -46,6 +52,10 @@ var Steps = steps{
                computeDependencies,
        ),
        // Quarkus
+       LoadCamelQuarkusCatalog: builder.NewStep(
+               builder.InitPhase,
+               loadCamelQuarkusCatalog,
+       ),
        GenerateQuarkusProject: builder.NewStep(
                builder.ProjectGenerationPhase,
                generateQuarkusProject,
diff --git a/pkg/controller/integrationkit/build.go 
b/pkg/controller/integrationkit/build.go
index 7f68382..cbc1471 100644
--- a/pkg/controller/integrationkit/build.go
+++ b/pkg/controller/integrationkit/build.go
@@ -92,13 +92,15 @@ func (action *buildAction) handleBuildSubmitted(ctx 
context.Context, kit *v1alph
                                Name:      kit.Name,
                        },
                        Spec: v1alpha1.BuildSpec{
-                               Meta:           kit.ObjectMeta,
-                               CamelVersion:   env.CamelCatalog.Version,
-                               RuntimeVersion: env.RuntimeVersion,
-                               Platform:       env.Platform.Spec,
-                               Dependencies:   kit.Spec.Dependencies,
-                               Steps:          
builder.StepIDsFor(env.Steps...),
-                               BuildDir:       env.BuildDir,
+                               Meta:            kit.ObjectMeta,
+                               CamelVersion:    env.CamelCatalog.Version,
+                               RuntimeVersion:  env.RuntimeVersion,
+                               RuntimeProvider: 
env.CamelCatalog.RuntimeProvider,
+                               Platform:        env.Platform.Spec,
+                               Dependencies:    kit.Spec.Dependencies,
+                               // TODO: sort for easy read
+                               Steps:    builder.StepIDsFor(env.Steps...),
+                               BuildDir: env.BuildDir,
                        },
                }
 
diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index b776d9c..c7c8a61 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -25,15 +25,17 @@ import (
        "regexp"
        "strings"
 
+       yaml2 "gopkg.in/yaml.v2"
+
+       "github.com/pkg/errors"
+
+       k8serrors "k8s.io/apimachinery/pkg/api/errors"
+
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/kubernetes"
        "github.com/apache/camel-k/pkg/util/maven"
-       "github.com/pkg/errors"
-
-       yaml2 "gopkg.in/yaml.v2"
-       k8serrors "k8s.io/apimachinery/pkg/api/errors"
 )
 
 type camelTrait struct {
@@ -57,11 +59,6 @@ func (t *camelTrait) Configure(e *Environment) (bool, error) 
{
 }
 
 func (t *camelTrait) Apply(e *Environment) error {
-       ns := e.DetermineNamespace()
-       if ns == "" {
-               return errors.New("unable to determine namespace")
-       }
-
        cv := e.DetermineCamelVersion()
        rv := e.DetermineRuntimeVersion()
 
@@ -73,52 +70,21 @@ func (t *camelTrait) Apply(e *Environment) error {
        }
 
        if e.CamelCatalog == nil {
-               c, err := camel.LoadCatalog(e.C, e.Client, ns, cv, rv)
+               var catalog *camel.RuntimeCatalog
+               var err error
+               quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait)
+               if quarkus.isEnabled() {
+                       catalog, err = quarkus.loadOrCreateCatalog(e, cv, rv)
+               } else {
+                       catalog, err = t.loadOrCreateCatalog(e, cv, rv)
+               }
                if err != nil {
                        return err
-               }
-               if c == nil {
-                       // if the catalog is not found in the cluster, try to 
create it if
-                       // the required versions (camel and runtime) are not 
expressed as
-                       // semver constraints
-                       cvHasFixedVersion, err := 
regexp.MatchString(`^(\d+)\.(\d+)\.([\w-\.]+)$`, cv)
-                       if err != nil {
-                               return err
-                       }
-                       rvHasFixedVersion, err := 
regexp.MatchString(`^(\d+)\.(\d+)\.([\w-\.]+)$`, rv)
-                       if err != nil {
-                               return err
-                       }
-
-                       if cvHasFixedVersion && rvHasFixedVersion {
-                               c, err = t.GenerateCatalog(e, cv, rv)
-                               if err != nil {
-                                       return err
-                               }
-
-                               // sanitize catalog name
-                               catalogName := "camel-catalog-" + 
strings.ToLower(cv+"-"+rv)
-
-                               cx := v1alpha1.NewCamelCatalogWithSpecs(ns, 
catalogName, c.CamelCatalogSpec)
-                               cx.Labels = make(map[string]string)
-                               cx.Labels["app"] = "camel-k"
-                               cx.Labels["camel.apache.org/catalog.version"] = 
cv
-                               
cx.Labels["camel.apache.org/catalog.loader.version"] = cv
-                               cx.Labels["camel.apache.org/runtime.version"] = 
rv
-                               cx.Labels["camel.apache.org/catalog.generated"] 
= True
-
-                               err = e.Client.Create(e.C, &cx)
-                               if err != nil && 
!k8serrors.IsAlreadyExists(err) {
-                                       return err
-                               }
-                       }
-               }
-
-               if c == nil {
+               } else if catalog == nil {
                        return fmt.Errorf("unable to find catalog for: %s", cv)
                }
 
-               e.CamelCatalog = c
+               e.CamelCatalog = catalog
        }
 
        e.RuntimeVersion = rv
@@ -126,17 +92,68 @@ func (t *camelTrait) Apply(e *Environment) error {
        if e.Integration != nil {
                e.Integration.Status.CamelVersion = e.CamelCatalog.Version
                e.Integration.Status.RuntimeVersion = rv
+               e.Integration.Status.RuntimeProvider = 
e.CamelCatalog.RuntimeProvider
        }
        if e.IntegrationKit != nil {
                e.IntegrationKit.Status.CamelVersion = e.CamelCatalog.Version
                e.IntegrationKit.Status.RuntimeVersion = rv
+               e.IntegrationKit.Status.RuntimeProvider = 
e.CamelCatalog.RuntimeProvider
        }
 
        return nil
 }
 
-// GenerateCatalog --
-func (t *camelTrait) GenerateCatalog(e *Environment, camelVersion string, 
runtimeVersion string) (*camel.RuntimeCatalog, error) {
+func (t *camelTrait) loadOrCreateCatalog(e *Environment, camelVersion string, 
runtimeVersion string) (*camel.RuntimeCatalog, error) {
+       ns := e.DetermineNamespace()
+       if ns == "" {
+               return nil, errors.New("unable to determine namespace")
+       }
+
+       c, err := camel.LoadCatalog(e.C, e.Client, ns, camelVersion, 
runtimeVersion, nil)
+       if err != nil {
+               return nil, err
+       }
+
+       if c == nil {
+               // if the catalog is not found in the cluster, try to create it 
if
+               // the required versions (camel and runtime) are not expressed 
as
+               // semver constraints
+               cvHasFixedVersion, err := 
regexp.MatchString(`^(\d+)\.(\d+)\.([\w-\.]+)$`, camelVersion)
+               if err != nil {
+                       return nil, err
+               }
+               rvHasFixedVersion, err := 
regexp.MatchString(`^(\d+)\.(\d+)\.([\w-\.]+)$`, runtimeVersion)
+               if err != nil {
+                       return nil, err
+               }
+
+               if cvHasFixedVersion && rvHasFixedVersion {
+                       c, err = t.generateCatalog(e, camelVersion, 
runtimeVersion)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       // sanitize catalog name
+                       catalogName := "camel-catalog-" + 
strings.ToLower(camelVersion+"-"+runtimeVersion)
+
+                       cx := v1alpha1.NewCamelCatalogWithSpecs(ns, 
catalogName, c.CamelCatalogSpec)
+                       cx.Labels = make(map[string]string)
+                       cx.Labels["app"] = "camel-k"
+                       cx.Labels["camel.apache.org/catalog.version"] = 
camelVersion
+                       cx.Labels["camel.apache.org/catalog.loader.version"] = 
camelVersion
+                       cx.Labels["camel.apache.org/runtime.version"] = 
runtimeVersion
+                       cx.Labels["camel.apache.org/catalog.generated"] = True
+
+                       err = e.Client.Create(e.C, &cx)
+                       if err != nil && !k8serrors.IsAlreadyExists(err) {
+                               return nil, err
+                       }
+               }
+       }
+       return c, nil
+}
+
+func (t *camelTrait) generateCatalog(e *Environment, camelVersion string, 
runtimeVersion string) (*camel.RuntimeCatalog, error) {
        root := os.TempDir()
        tmpDir, err := ioutil.TempDir(root, "camel-catalog")
        if err != nil {
@@ -149,10 +166,7 @@ func (t *camelTrait) GenerateCatalog(e *Environment, 
camelVersion string, runtim
                return nil, err
        }
 
-       project, err := t.GenerateMavenProject(camelVersion, runtimeVersion)
-       if err != nil {
-               return nil, err
-       }
+       project := t.generateMavenProject(camelVersion, runtimeVersion)
 
        mc := maven.NewContext(tmpDir, project)
        mc.LocalRepository = e.Platform.Spec.Build.LocalRepository
@@ -191,9 +205,9 @@ func (t *camelTrait) GenerateCatalog(e *Environment, 
camelVersion string, runtim
        return camel.NewRuntimeCatalog(catalog.Spec), nil
 }
 
-// GenerateCatalogMavenProject --
-func (t *camelTrait) GenerateMavenProject(camelVersion string, runtimeVersion 
string) (maven.Project, error) {
+func (t *camelTrait) generateMavenProject(camelVersion string, runtimeVersion 
string) maven.Project {
        p := maven.NewProjectWithGAV("org.apache.camel.k.integration", 
"camel-k-catalog-generator", defaults.Version)
+
        p.Build = &maven.Build{
                DefaultGoal: "generate-resources",
                Plugins: []maven.Plugin{
@@ -220,5 +234,5 @@ func (t *camelTrait) GenerateMavenProject(camelVersion 
string, runtimeVersion st
                },
        }
 
-       return p, nil
+       return p
 }
diff --git a/pkg/trait/camel_test.go b/pkg/trait/camel_test.go
index ee35856..24c5032 100644
--- a/pkg/trait/camel_test.go
+++ b/pkg/trait/camel_test.go
@@ -72,8 +72,7 @@ func 
TestApplyCamelTraitWithoutEnvironmentCatalogAndUnmatchableVersionFails(t *t
 func TestCamelTraitGenerateMavenProjectSucceeds(t *testing.T) {
        trait, _ := createNominalCamelTest()
 
-       mvnProject, err := trait.GenerateMavenProject("1.23.0", "1.0.0")
-       assert.Nil(t, err)
+       mvnProject := trait.generateMavenProject("1.23.0", "1.0.0")
        assert.NotNil(t, mvnProject)
        assert.Equal(t, "org.apache.camel.k.integration", mvnProject.GroupID)
        assert.Equal(t, "camel-k-catalog-generator", mvnProject.ArtifactID)
@@ -96,7 +95,6 @@ func TestCamelTraitGenerateMavenProjectSucceeds(t *testing.T) 
{
 }
 
 func createNominalCamelTest() (*camelTrait, *Environment) {
-
        client, _ := test.NewFakeClient()
 
        trait := newCamelTrait()
@@ -109,8 +107,9 @@ func createNominalCamelTest() (*camelTrait, *Environment) {
                                Version: "1.23.0",
                        },
                },
-               C:      context.TODO(),
-               Client: client,
+               Catalog: NewEnvironmentTestCatalog(),
+               C:       context.TODO(),
+               Client:  client,
                Integration: &v1alpha1.Integration{
                        ObjectMeta: metav1.ObjectMeta{
                                Namespace: "namespace",
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 8b70b11..2be0cac 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -21,10 +21,13 @@ import (
        "fmt"
        "strings"
 
+       "github.com/pkg/errors"
+
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/builder/runtime"
        "github.com/apache/camel-k/pkg/metadata"
        "github.com/apache/camel-k/pkg/util"
+       "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/envvar"
 )
@@ -51,6 +54,26 @@ func (t *quarkusTrait) Apply(e *Environment) error {
        return nil
 }
 
+func (t *quarkusTrait) loadOrCreateCatalog(e *Environment, camelVersion 
string, runtimeVersion string) (*camel.RuntimeCatalog, error) {
+       ns := e.DetermineNamespace()
+       if ns == "" {
+               return nil, errors.New("unable to determine namespace")
+       }
+
+       c, err := camel.LoadCatalog(e.C, e.Client, ns, camelVersion, 
runtimeVersion, v1alpha1.QuarkusRuntimeProvider{
+               // FIXME
+               CamelQuarkusVersion: "0.2.0",
+               QuarkusVersion:      "0.21.2",
+       })
+       if err != nil {
+               return nil, err
+       }
+
+       // TODO: generate a catalog if nil
+
+       return c, nil
+}
+
 func (t *quarkusTrait) addBuildSteps(e *Environment) {
        e.Steps = append(e.Steps, runtime.QuarkusSteps...)
 }
diff --git a/pkg/util/camel/camel_runtime.go b/pkg/util/camel/camel_runtime.go
index a0d502a..331d648 100644
--- a/pkg/util/camel/camel_runtime.go
+++ b/pkg/util/camel/camel_runtime.go
@@ -28,24 +28,38 @@ import (
 )
 
 // LoadCatalog --
-func LoadCatalog(ctx context.Context, client client.Client, namespace string, 
camelVersion string, runtimeVersion string) (*RuntimeCatalog, error) {
-       var catalog *RuntimeCatalog
-       var err error
+func LoadCatalog(ctx context.Context, client client.Client, namespace string, 
camelVersion string, runtimeVersion string, provider interface{}) 
(*RuntimeCatalog, error) {
+       options := []k8sclient.ListOption{
+               k8sclient.InNamespace(namespace),
+       }
+
+       if _, ok := provider.(v1alpha1.QuarkusRuntimeProvider); ok {
+               options = append(options, k8sclient.MatchingLabels{
+                       "camel.apache.org/runtime.provider": "quarkus",
+               })
+       }
 
        list := v1alpha1.NewCamelCatalogList()
-       err = client.List(ctx, &list, k8sclient.InNamespace(namespace))
+       err := client.List(ctx, &list, options...)
        if err != nil {
                return nil, err
        }
 
-       catalog, err = findBestMatch(list.Items, camelVersion, runtimeVersion)
+       catalog, err := findBestMatch(list.Items, camelVersion, runtimeVersion, 
provider)
        if err != nil {
                return nil, err
        }
 
-       if catalog == nil {
-               return nil, fmt.Errorf("unable to find catalog matching version 
requirement: camel=%s, runtime=%s", camelVersion, runtimeVersion)
+       if catalog != nil {
+               return catalog, nil
        }
 
-       return catalog, nil
+       switch provider := provider.(type) {
+       case v1alpha1.QuarkusRuntimeProvider:
+               return nil, fmt.Errorf("unable to find catalog matching version 
requirement: camel=%s, runtime=%s, camel-quarkus=%s, quarkus=%s",
+                       camelVersion, runtimeVersion, 
provider.CamelQuarkusVersion, provider.QuarkusVersion)
+       default:
+               return nil, fmt.Errorf("unable to find catalog matching version 
requirement: camel=%s, runtime=%s",
+                       camelVersion, runtimeVersion)
+       }
 }
diff --git a/pkg/util/camel/camel_util.go b/pkg/util/camel/camel_util.go
index ae80ac7..6aecdfe 100644
--- a/pkg/util/camel/camel_util.go
+++ b/pkg/util/camel/camel_util.go
@@ -26,7 +26,8 @@ import (
        "github.com/apache/camel-k/pkg/util/log"
 )
 
-func findBestMatch(catalogs []v1alpha1.CamelCatalog, camelVersion string, 
runtimeVersion string) (*RuntimeCatalog, error) {
+func findBestMatch(catalogs []v1alpha1.CamelCatalog, camelVersion string, 
runtimeVersion string, provider interface{}) (*RuntimeCatalog, error) {
+       // FIXME: take the provider into account for exact match
        for _, catalog := range catalogs {
                if catalog.Spec.Version == camelVersion && 
catalog.Spec.RuntimeVersion == runtimeVersion {
                        return NewRuntimeCatalog(catalog.Spec), nil
@@ -40,9 +41,35 @@ func findBestMatch(catalogs []v1alpha1.CamelCatalog, 
camelVersion string, runtim
        }
 
        cc := newCatalogVersionCollection(catalogs)
-       for _, x := range cc {
-               if vc.Check(x.Version) && rc.Check(x.RuntimeVersion) {
-                       return NewRuntimeCatalog(x.Catalog.Spec), nil
+
+       switch provider := provider.(type) {
+       case v1alpha1.QuarkusRuntimeProvider:
+               qc := newSemVerConstraint(provider.QuarkusVersion)
+               cqc := newSemVerConstraint(provider.CamelQuarkusVersion)
+               if qc == nil || cqc == nil {
+                       return nil, nil
+               }
+               for _, c := range cc {
+                       qv, err := 
semver.NewVersion(c.Catalog.Spec.RuntimeProvider.Quarkus.QuarkusVersion)
+                       if err != nil {
+                               log.Debugf("Invalid semver version (quarkus) 
%s", qv)
+                               continue
+                       }
+                       cqv, err := 
semver.NewVersion(c.Catalog.Spec.RuntimeProvider.Quarkus.CamelQuarkusVersion)
+                       if err != nil {
+                               log.Debugf("Invalid semver version (camel 
quarkus) %s", cqv)
+                               continue
+                       }
+                       if vc.Check(c.Version) && rc.Check(c.RuntimeVersion) && 
qc.Check(qv) && cqc.Check(cqv) {
+                               return NewRuntimeCatalog(c.Catalog.Spec), nil
+                       }
+               }
+
+       default:
+               for _, c := range cc {
+                       if vc.Check(c.Version) && rc.Check(c.RuntimeVersion) {
+                               return NewRuntimeCatalog(c.Catalog.Spec), nil
+                       }
                }
        }
 
diff --git a/pkg/util/camel/camel_util_test.go 
b/pkg/util/camel/camel_util_test.go
index 456556a..2e02c50 100644
--- a/pkg/util/camel/camel_util_test.go
+++ b/pkg/util/camel/camel_util_test.go
@@ -32,7 +32,7 @@ func TestFindBestMatch_Camel(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "~2.23.x", "1.0.0")
+       c, err := findBestMatch(catalogs, "~2.23.x", "1.0.0", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1", c.Version)
@@ -45,7 +45,7 @@ func TestFindBestMatch_Runtime(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.0", "~1.0.x")
+       c, err := findBestMatch(catalogs, "2.23.0", "~1.0.x", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.0", c.Version)
@@ -60,7 +60,7 @@ func TestFindBestMatch(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "~2.23.x", "~1.0.x")
+       c, err := findBestMatch(catalogs, "~2.23.x", "~1.0.x", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1", c.Version)
@@ -74,7 +74,7 @@ func TestFindExactSemVerMatch_Camel(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.0", "1.0.0")
+       c, err := findBestMatch(catalogs, "2.23.0", "1.0.0", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.0", c.Version)
@@ -87,7 +87,7 @@ func TestFindExactSemVerMatch_Runtime(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.0", "1.0.0")
+       c, err := findBestMatch(catalogs, "2.23.0", "1.0.0", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.0", c.Version)
@@ -102,7 +102,7 @@ func TestFindExactMatch_Camel(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.1-tag-00001", "1.0.0")
+       c, err := findBestMatch(catalogs, "2.23.1-tag-00001", "1.0.0", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1-tag-00001", c.Version)
@@ -116,7 +116,7 @@ func TestFindExactMatch_Runtime(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.1-tag-00001", "1.0.1")
+       c, err := findBestMatch(catalogs, "2.23.1-tag-00001", "1.0.1", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1-tag-00001", c.Version)
@@ -131,7 +131,7 @@ func TestFindRangeMatch_Camel(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, ">= 2.23.0, < 2.23.2", "1.0.0")
+       c, err := findBestMatch(catalogs, ">= 2.23.0, < 2.23.2", "1.0.0", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1", c.Version)
@@ -146,7 +146,7 @@ func TestFindRangeMatch_Runtime(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, "2.23.0", "> 1.0.1, < 1.0.3")
+       c, err := findBestMatch(catalogs, "2.23.0", "> 1.0.1, < 1.0.3", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.0", c.Version)
@@ -163,7 +163,7 @@ func TestFindRangeMatch(t *testing.T) {
                {Spec: v1alpha1.CamelCatalogSpec{Version: "2.22.1", 
RuntimeVersion: "1.0.0"}},
        }
 
-       c, err := findBestMatch(catalogs, ">= 2.23.0, < 2.23.2", "> 1.0.1, < 
1.0.3")
+       c, err := findBestMatch(catalogs, ">= 2.23.0, < 2.23.2", "> 1.0.1, < 
1.0.3", nil)
        assert.Nil(t, err)
        assert.NotNil(t, c)
        assert.Equal(t, "2.23.1", c.Version)
diff --git a/pkg/util/camel/catalog.go b/pkg/util/camel/catalog.go
index 4b8df56..a5a6d1e 100644
--- a/pkg/util/camel/catalog.go
+++ b/pkg/util/camel/catalog.go
@@ -42,5 +42,5 @@ func DefaultCatalog() (*RuntimeCatalog, error) {
                }
        }
 
-       return findBestMatch(catalogs, defaults.DefaultCamelVersion, 
defaults.DefaultRuntimeVersion)
+       return findBestMatch(catalogs, defaults.DefaultCamelVersion, 
defaults.DefaultRuntimeVersion, nil)
 }

Reply via email to