You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2019/11/04 16:10:47 UTC

[camel-k] 23/38: chore(quarkus): Factorize Camel catalog runtime generation logic

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 bc20fe15d64d7d923a49193201b00867007737d1
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Fri Oct 25 11:56:06 2019 +0200

    chore(quarkus): Factorize Camel catalog runtime generation logic
---
 pkg/trait/camel.go             | 106 +----------------------------------------
 pkg/trait/camel_test.go        |  25 ----------
 pkg/trait/util.go              |  10 ++++
 pkg/util/camel/catalog.go      |  88 ++++++++++++++++++++++++++++++++++
 pkg/util/camel/catalog_test.go |  47 ++++++++++++++++++
 5 files changed, 147 insertions(+), 129 deletions(-)

diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index 9a8281a..2a07b37 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -19,23 +19,14 @@ package trait
 
 import (
 	"fmt"
-	"io/ioutil"
-	"os"
-	"path"
-	"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"
 )
 
 type camelTrait struct {
@@ -112,17 +103,8 @@ func (t *camelTrait) loadOrCreateCatalog(e *Environment, camelVersion string, ru
 		// 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 err
-		}
-		rvHasFixedVersion, err := regexp.MatchString(`^(\d+)\.(\d+)\.([\w-\.]+)$`, runtimeVersion)
-		if err != nil {
-			return err
-		}
-
-		if cvHasFixedVersion && rvHasFixedVersion {
-			c, err = t.generateCatalog(e, camelVersion, runtimeVersion)
+		if exactVersionRegexp.MatchString(camelVersion) && exactVersionRegexp.MatchString(runtimeVersion) {
+			c, err = camel.GenerateCatalog(e.C, e.Client, ns, e.Platform.Spec.Build.Maven, camelVersion, runtimeVersion)
 			if err != nil {
 				return err
 			}
@@ -150,90 +132,6 @@ func (t *camelTrait) loadOrCreateCatalog(e *Environment, camelVersion string, ru
 	return 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 {
-		return nil, err
-	}
-
-	defer os.RemoveAll(tmpDir)
-
-	if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
-		return nil, err
-	}
-
-	project := t.generateMavenProject(camelVersion, runtimeVersion)
-
-	mc := maven.NewContext(tmpDir, project)
-	mc.LocalRepository = e.Platform.Spec.Build.Maven.LocalRepository
-	mc.Timeout = e.Platform.Spec.Build.Maven.Timeout.Duration
-	mc.AddSystemProperty("catalog.path", tmpDir)
-	mc.AddSystemProperty("catalog.file", "catalog.yaml")
-
-	ns := e.DetermineNamespace()
-	if ns == "" {
-		return nil, errors.New("unable to determine namespace")
-	}
-
-	settings, err := kubernetes.ResolveValueSource(e.C, e.Client, ns, &e.Platform.Spec.Build.Maven.Settings)
-	if err != nil {
-		return nil, err
-	}
-	if settings != "" {
-		mc.SettingsContent = []byte(settings)
-	}
-
-	err = maven.Run(mc)
-	if err != nil {
-		return nil, err
-	}
-
-	content, err := ioutil.ReadFile(path.Join(tmpDir, "catalog.yaml"))
-	if err != nil {
-		return nil, err
-	}
-
-	catalog := v1alpha1.CamelCatalog{}
-	if err := yaml2.Unmarshal(content, &catalog); err != nil {
-		return nil, err
-	}
-
-	return camel.NewRuntimeCatalog(catalog.Spec), nil
-}
-
-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{
-			{
-				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,
-					},
-				},
-			},
-		},
-	}
-
-	return p
-}
-
 func (t *camelTrait) determineCamelVersion(e *Environment) string {
 	if t.Version != "" {
 		return t.Version
diff --git a/pkg/trait/camel_test.go b/pkg/trait/camel_test.go
index 24c5032..49f594d 100644
--- a/pkg/trait/camel_test.go
+++ b/pkg/trait/camel_test.go
@@ -69,31 +69,6 @@ func TestApplyCamelTraitWithoutEnvironmentCatalogAndUnmatchableVersionFails(t *t
 	assert.Equal(t, "unable to find catalog matching version requirement: camel=Unmatchable version, runtime=0.0.1", err.Error())
 }
 
-func TestCamelTraitGenerateMavenProjectSucceeds(t *testing.T) {
-	trait, _ := createNominalCamelTest()
-
-	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)
-	assert.NotNil(t, mvnProject.Build)
-	assert.Equal(t, "generate-resources", mvnProject.Build.DefaultGoal)
-	assert.NotNil(t, mvnProject.Build.Plugins)
-	assert.Len(t, mvnProject.Build.Plugins, 1)
-	assert.Equal(t, "org.apache.camel.k", mvnProject.Build.Plugins[0].GroupID)
-	assert.Equal(t, "camel-k-maven-plugin", mvnProject.Build.Plugins[0].ArtifactID)
-	assert.NotNil(t, mvnProject.Build.Plugins[0].Executions)
-	assert.Len(t, mvnProject.Build.Plugins[0].Executions, 1)
-	assert.Equal(t, "generate-catalog", mvnProject.Build.Plugins[0].Executions[0].ID)
-	assert.NotNil(t, mvnProject.Build.Plugins[0].Executions[0].Goals)
-	assert.Len(t, mvnProject.Build.Plugins[0].Executions[0].Goals, 1)
-	assert.Equal(t, "generate-catalog", mvnProject.Build.Plugins[0].Executions[0].Goals[0])
-	assert.NotNil(t, mvnProject.Build.Plugins[0].Dependencies)
-	assert.Len(t, mvnProject.Build.Plugins[0].Dependencies, 1)
-	assert.Equal(t, "org.apache.camel", mvnProject.Build.Plugins[0].Dependencies[0].GroupID)
-	assert.Equal(t, "camel-catalog", mvnProject.Build.Plugins[0].Dependencies[0].ArtifactID)
-}
-
 func createNominalCamelTest() (*camelTrait, *Environment) {
 	client, _ := test.NewFakeClient()
 
diff --git a/pkg/trait/util.go b/pkg/trait/util.go
index da5b20a..9c3e12c 100644
--- a/pkg/trait/util.go
+++ b/pkg/trait/util.go
@@ -33,6 +33,16 @@ import (
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
+var exactVersionRegexp regexp.Regexp
+
+func init() {
+	r, err := regexp.Compile(`^(\d+)\.(\d+)\.([\w-\.]+)$`)
+	if err != nil {
+		panic(err)
+	}
+	exactVersionRegexp = *r
+}
+
 // GetIntegrationKit retrieves the kit set on the integration
 func GetIntegrationKit(ctx context.Context, c client.Client, integration *v1alpha1.Integration) (*v1alpha1.IntegrationKit, error) {
 	if integration.Status.Kit == "" {
diff --git a/pkg/util/camel/catalog.go b/pkg/util/camel/catalog.go
index adcf510..4505334 100644
--- a/pkg/util/camel/catalog.go
+++ b/pkg/util/camel/catalog.go
@@ -18,13 +18,21 @@ limitations under the License.
 package camel
 
 import (
+	"context"
+	"io/ioutil"
+	"os"
+	"path"
 	"strings"
 
 	yaml2 "gopkg.in/yaml.v2"
 
+	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+
 	"github.com/apache/camel-k/deploy"
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/util/defaults"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+	"github.com/apache/camel-k/pkg/util/maven"
 )
 
 // DefaultCatalog --
@@ -57,3 +65,83 @@ func catalogForRuntimeProvider(provider interface{}) (*RuntimeCatalog, error) {
 
 	return findBestMatch(catalogs, defaults.DefaultCamelVersion, defaults.DefaultRuntimeVersion, provider)
 }
+
+// GenerateCatalog --
+func GenerateCatalog(ctx context.Context, client k8sclient.Reader, namespace string, mvn v1alpha1.MavenSpec, camelVersion string, runtimeVersion string) (*RuntimeCatalog, error) {
+	root := os.TempDir()
+	tmpDir, err := ioutil.TempDir(root, "camel-catalog")
+	if err != nil {
+		return nil, err
+	}
+
+	defer os.RemoveAll(tmpDir)
+
+	if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
+		return nil, err
+	}
+
+	project := generateMavenProject(camelVersion, runtimeVersion)
+
+	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")
+
+	settings, err := kubernetes.ResolveValueSource(ctx, client, namespace, &mvn.Settings)
+	if err != nil {
+		return nil, err
+	}
+	if settings != "" {
+		mc.SettingsContent = []byte(settings)
+	}
+
+	err = maven.Run(mc)
+	if err != nil {
+		return nil, err
+	}
+
+	content, err := ioutil.ReadFile(path.Join(tmpDir, "catalog.yaml"))
+	if err != nil {
+		return nil, err
+	}
+
+	catalog := v1alpha1.CamelCatalog{}
+	if err := yaml2.Unmarshal(content, &catalog); err != nil {
+		return nil, err
+	}
+
+	return NewRuntimeCatalog(catalog.Spec), nil
+}
+
+func 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{
+			{
+				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,
+					},
+				},
+			},
+		},
+	}
+
+	return p
+}
diff --git a/pkg/util/camel/catalog_test.go b/pkg/util/camel/catalog_test.go
new file mode 100644
index 0000000..47ab71f
--- /dev/null
+++ b/pkg/util/camel/catalog_test.go
@@ -0,0 +1,47 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package camel
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestCamelTraitGenerateMavenProjectSucceeds(t *testing.T) {
+	mvnProject := generateMavenProject("1.23.0", "1.0.0", nil)
+	assert.NotNil(t, mvnProject)
+	assert.Equal(t, "org.apache.camel.k.integration", mvnProject.GroupID)
+	assert.Equal(t, "camel-k-catalog-generator", mvnProject.ArtifactID)
+	assert.NotNil(t, mvnProject.Build)
+	assert.Equal(t, "generate-resources", mvnProject.Build.DefaultGoal)
+	assert.NotNil(t, mvnProject.Build.Plugins)
+	assert.Len(t, mvnProject.Build.Plugins, 1)
+	assert.Equal(t, "org.apache.camel.k", mvnProject.Build.Plugins[0].GroupID)
+	assert.Equal(t, "camel-k-maven-plugin", mvnProject.Build.Plugins[0].ArtifactID)
+	assert.NotNil(t, mvnProject.Build.Plugins[0].Executions)
+	assert.Len(t, mvnProject.Build.Plugins[0].Executions, 1)
+	assert.Equal(t, "generate-catalog", mvnProject.Build.Plugins[0].Executions[0].ID)
+	assert.NotNil(t, mvnProject.Build.Plugins[0].Executions[0].Goals)
+	assert.Len(t, mvnProject.Build.Plugins[0].Executions[0].Goals, 1)
+	assert.Equal(t, "generate-catalog", mvnProject.Build.Plugins[0].Executions[0].Goals[0])
+	assert.NotNil(t, mvnProject.Build.Plugins[0].Dependencies)
+	assert.Len(t, mvnProject.Build.Plugins[0].Dependencies, 1)
+	assert.Equal(t, "org.apache.camel", mvnProject.Build.Plugins[0].Dependencies[0].GroupID)
+	assert.Equal(t, "camel-catalog", mvnProject.Build.Plugins[0].Dependencies[0].ArtifactID)
+}