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 86df7cf10e3903110f8ae62eb424a90f3a9dcb38
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Fri Oct 25 12:17:41 2019 +0200

    feat(quarkus): Support generating Camel Quarkus catalog on the flight
---
 pkg/trait/quarkus.go      | 50 +++++++++++++++++++++++++++++++++++----
 pkg/util/camel/catalog.go | 60 +++++++++++++++++++++++++++++------------------
 2 files changed, 82 insertions(+), 28 deletions(-)

diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 9dfe8ba..208a551 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -23,6 +23,8 @@ import (
 
        "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/builder/runtime"
        "github.com/apache/camel-k/pkg/metadata"
@@ -30,6 +32,7 @@ import (
        "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/envvar"
+       "github.com/apache/camel-k/pkg/util/maven"
 )
 
 type quarkusTrait struct {
@@ -62,17 +65,54 @@ func (t *quarkusTrait) loadOrCreateCatalog(e *Environment, 
camelVersion string,
                return errors.New("unable to determine namespace")
        }
 
-       c, err := camel.LoadCatalog(e.C, e.Client, ns, camelVersion, 
runtimeVersion, v1alpha1.QuarkusRuntimeProvider{
-               CamelQuarkusVersion: t.determineCamelQuarkusVersion(e),
-               QuarkusVersion:      t.determineQuarkusVersion(e),
+       camelQuarkusVersion := t.determineCamelQuarkusVersion(e)
+       quarkusVersion := t.determineQuarkusVersion(e)
+
+       catalog, err := camel.LoadCatalog(e.C, e.Client, ns, camelVersion, 
runtimeVersion, v1alpha1.QuarkusRuntimeProvider{
+               CamelQuarkusVersion: camelQuarkusVersion,
+               QuarkusVersion:      quarkusVersion,
        })
        if err != nil {
                return err
        }
 
-       e.CamelCatalog = c
+       if catalog == nil {
+               // if the catalog is not found in the cluster, try to create it 
if
+               // the required versions (camel, runtime and provider) are not 
expressed as
+               // semver constraints
+               if exactVersionRegexp.MatchString(camelVersion) && 
exactVersionRegexp.MatchString(runtimeVersion) &&
+                       exactVersionRegexp.MatchString(camelQuarkusVersion) && 
exactVersionRegexp.MatchString(quarkusVersion) {
+                       catalog, err = camel.GenerateCatalogWithProvider(e.C, 
e.Client, ns, e.Platform.Spec.Build.Maven, camelVersion, runtimeVersion,
+                               "quarkus",
+                               &maven.Dependency{
+                                       GroupID:    "org.apache.camel.quarkus",
+                                       ArtifactID: "camel-catalog-quarkus",
+                                       Version:    camelQuarkusVersion,
+                               })
+                       if err != nil {
+                               return err
+                       }
+
+                       // sanitize catalog name
+                       catalogName := "camel-catalog-quarkus" + 
strings.ToLower(camelVersion+"-"+runtimeVersion)
+
+                       cx := v1alpha1.NewCamelCatalogWithSpecs(ns, 
catalogName, catalog.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/runtime.provider"] = 
"quarkus"
+                       cx.Labels["camel.apache.org/catalog.generated"] = True
+
+                       err = e.Client.Create(e.C, &cx)
+                       if err != nil && !k8serrors.IsAlreadyExists(err) {
+                               return err
+                       }
+               }
+       }
 
-       // TODO: generate a catalog if nil
+       e.CamelCatalog = catalog
 
        return nil
 }
diff --git a/pkg/util/camel/catalog.go b/pkg/util/camel/catalog.go
index 4505334..b83eebc 100644
--- a/pkg/util/camel/catalog.go
+++ b/pkg/util/camel/catalog.go
@@ -67,7 +67,14 @@ func catalogForRuntimeProvider(provider interface{}) 
(*RuntimeCatalog, error) {
 }
 
 // GenerateCatalog --
-func GenerateCatalog(ctx context.Context, client k8sclient.Reader, namespace 
string, mvn v1alpha1.MavenSpec, camelVersion string, runtimeVersion string) 
(*RuntimeCatalog, error) {
+func GenerateCatalog(ctx context.Context, client k8sclient.Reader, namespace 
string, mvn v1alpha1.MavenSpec,
+       camelVersion string, runtimeVersion string) (*RuntimeCatalog, error) {
+       return GenerateCatalogWithProvider(ctx, client, namespace, mvn, 
camelVersion, runtimeVersion, "", nil)
+}
+
+// GenerateCatalogWithProvider --
+func GenerateCatalogWithProvider(ctx context.Context, client k8sclient.Reader, 
namespace string, mvn v1alpha1.MavenSpec,
+       camelVersion string, runtimeVersion string, providerName string, 
providerDependency *maven.Dependency) (*RuntimeCatalog, error) {
        root := os.TempDir()
        tmpDir, err := ioutil.TempDir(root, "camel-catalog")
        if err != nil {
@@ -80,13 +87,16 @@ func GenerateCatalog(ctx context.Context, client 
k8sclient.Reader, namespace str
                return nil, err
        }
 
-       project := generateMavenProject(camelVersion, runtimeVersion)
+       project := generateMavenProject(camelVersion, runtimeVersion, 
providerDependency)
 
        mc := maven.NewContext(tmpDir, project)
        mc.LocalRepository = mvn.LocalRepository
        mc.Timeout = mvn.Timeout.Duration
        mc.AddSystemProperty("catalog.path", tmpDir)
        mc.AddSystemProperty("catalog.file", "catalog.yaml")
+       if providerName != "" {
+               mc.AddSystemProperty("catalog.runtime", providerName)
+       }
 
        settings, err := kubernetes.ResolveValueSource(ctx, client, namespace, 
&mvn.Settings)
        if err != nil {
@@ -114,33 +124,37 @@ func GenerateCatalog(ctx context.Context, client 
k8sclient.Reader, namespace str
        return NewRuntimeCatalog(catalog.Spec), nil
 }
 
-func generateMavenProject(camelVersion string, runtimeVersion string) 
maven.Project {
+func generateMavenProject(camelVersion string, runtimeVersion string, 
providerDependency *maven.Dependency) 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{
+       plugin := maven.Plugin{
+               GroupID:    "org.apache.camel.k",
+               ArtifactID: "camel-k-maven-plugin",
+               Version:    runtimeVersion,
+               Executions: []maven.Execution{
                        {
-                               GroupID:    "org.apache.camel.k",
-                               ArtifactID: "camel-k-maven-plugin",
-                               Version:    runtimeVersion,
-                               Executions: []maven.Execution{
-                                       {
-                                               ID: "generate-catalog",
-                                               Goals: []string{
-                                                       "generate-catalog",
-                                               },
-                                       },
-                               },
-                               Dependencies: []maven.Dependency{
-                                       {
-                                               GroupID:    "org.apache.camel",
-                                               ArtifactID: "camel-catalog",
-                                               Version:    camelVersion,
-                                       },
+                               ID: "generate-catalog",
+                               Goals: []string{
+                                       "generate-catalog",
                                },
                        },
                },
+               Dependencies: []maven.Dependency{
+                       {
+                               GroupID:    "org.apache.camel",
+                               ArtifactID: "camel-catalog",
+                               Version:    camelVersion,
+                       },
+               },
+       }
+
+       if providerDependency != nil {
+               plugin.Dependencies = append(plugin.Dependencies, 
*providerDependency)
+       }
+
+       p.Build = &maven.Build{
+               DefaultGoal: "generate-resources",
+               Plugins:     []maven.Plugin{plugin},
        }
 
        return p

Reply via email to