[camel-k] branch master updated: Fix Quarkus dependency detection

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[camel-k] branch master updated: Fix Quarkus dependency detection

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

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


The following commit(s) were added to refs/heads/master by this push:
     new d7a0808  Fix Quarkus dependency detection
     new e3d9325  Merge pull request #1279 from jamesnetherton/inspector-tidy
d7a0808 is described below

commit d7a08084046a300dbb7f3fd6c55b9ea5b578d22a
Author: James Netherton <[hidden email]>
AuthorDate: Fri Feb 14 10:16:41 2020 +0000

    Fix Quarkus dependency detection
---
 pkg/metadata/metadata_dependencies_test.go |   4 ++
 pkg/util/source/inspector.go               | 109 +++++++++++++++++------------
 pkg/util/source/inspector_xml.go           |  10 +--
 pkg/util/source/inspector_yaml.go          |  10 +--
 4 files changed, 78 insertions(+), 55 deletions(-)

diff --git a/pkg/metadata/metadata_dependencies_test.go b/pkg/metadata/metadata_dependencies_test.go
index 29635e4..291259b 100644
--- a/pkg/metadata/metadata_dependencies_test.go
+++ b/pkg/metadata/metadata_dependencies_test.go
@@ -139,6 +139,8 @@ func TestDependenciesQuarkus(t *testing.T) {
     from("http:test").to("log:end");
     from("https:test").to("log:end");
     from("twitter-timeline:test").to("mock:end");
+    from("direct:start").circuitBreaker().hystrixConfiguration().executionTimeoutInMilliseconds(100).end()
+    .to("direct:other").onFallback().setBody(constant("Fallback response")).end();
     `,
  },
  Language: v1.LanguageJavaSource,
@@ -156,6 +158,8 @@ func TestDependenciesQuarkus(t *testing.T) {
  "camel-quarkus:log",
  "camel-quarkus:timer",
  "camel-quarkus:twitter",
+ "camel-quarkus:direct",
+ "camel-quarkus:hystrix",
  },
  meta.Dependencies.List())
 }
diff --git a/pkg/util/source/inspector.go b/pkg/util/source/inspector.go
index 4279849..0f1a219 100644
--- a/pkg/util/source/inspector.go
+++ b/pkg/util/source/inspector.go
@@ -27,42 +27,53 @@ import (
 )
 
 var (
- singleQuotedFrom = regexp.MustCompile(`from\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
- doubleQuotedFrom = regexp.MustCompile(`from\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
- singleQuotedTo   = regexp.MustCompile(`\.to\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
- singleQuotedToD  = regexp.MustCompile(`\.toD\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
- singleQuotedToF  = regexp.MustCompile(`\.toF\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
- doubleQuotedTo   = regexp.MustCompile(`\.to\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
- doubleQuotedToD  = regexp.MustCompile(`\.toD\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
- doubleQuotedToF  = regexp.MustCompile(`\.toF\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
- languageRegexp   = regexp.MustCompile(`language\s*\(\s*["|']([a-zA-Z0-9-]+[^"|']+)["|']\s*,.*\)`)
- camelTypeRegexp  = regexp.MustCompile(`.*(org.apache.camel.*Component|DataFormat|Language)`)
+ singleQuotedFrom        = regexp.MustCompile(`from\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
+ doubleQuotedFrom        = regexp.MustCompile(`from\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
+ singleQuotedTo          = regexp.MustCompile(`\.to\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
+ singleQuotedToD         = regexp.MustCompile(`\.toD\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
+ singleQuotedToF         = regexp.MustCompile(`\.toF\s*\(\s*'([a-zA-Z0-9-]+:[^']+)'`)
+ doubleQuotedTo          = regexp.MustCompile(`\.to\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
+ doubleQuotedToD         = regexp.MustCompile(`\.toD\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
+ doubleQuotedToF         = regexp.MustCompile(`\.toF\s*\(\s*"([a-zA-Z0-9-]+:[^"]+)"`)
+ languageRegexp          = regexp.MustCompile(`language\s*\(\s*["|']([a-zA-Z0-9-]+[^"|']+)["|']\s*,.*\)`)
+ camelTypeRegexp         = regexp.MustCompile(`.*(org.apache.camel.*Component|DataFormat|Language)`)
+ jsonLibraryRegexp       = regexp.MustCompile(`.*JsonLibrary\.Jackson.*`)
+ jsonLanguageRegexp      = regexp.MustCompile(`.*\.json\(\).*`)
+ circuitBreakerRegexp    = regexp.MustCompile(`.*\.circuitBreaker\(\).*`)
+ restConfigurationRegexp = regexp.MustCompile(`.*restConfiguration\(\).*`)
+ restRegexp              = regexp.MustCompile(`.*rest\(("[a-zA-Z0-9-/]+")*\).*`)
+ restXMLRegexp           = regexp.MustCompile(`^\s*rest\s*{.*`)
+ groovyLanguageRegexp    = regexp.MustCompile(`.*\.groovy\s*\(.*\).*`)
+ jsonPathLanguageRegexp  = regexp.MustCompile(`.*\.?(jsonpath|jsonpathWriteAsString)\s*\(.*\).*`)
+ ognlRegexp              = regexp.MustCompile(`.*\.ognl\s*\(.*\).*`)
+ mvelRegexp              = regexp.MustCompile(`.*\.mvel\s*\(.*\).*`)
+ simpleLanguageRegexp    = regexp.MustCompile(`.*\.?simple\s*\(.*\).*`)
+ xqueryRegexp            = regexp.MustCompile(`.*\.xquery\s*\(.*\).*`)
+ xpathRegexp             = regexp.MustCompile(`.*\.?xpath\s*\(.*\).*`)
+ xtokenizeRegexp         = regexp.MustCompile(`.*\.xtokenize\s*\(.*\).*`)
 
  sourceDependencies = struct {
- main    map[string]string
- quarkus map[string]string
+ main    map[*regexp.Regexp]string
+ quarkus map[*regexp.Regexp]string
  }{
- main: map[string]string{
- `.*JsonLibrary\.Jackson.*`:                         "camel:jackson",
- `.*\.json\(\).*`:                                   "camel:jackson",
- `.*\.circuitBreaker\(\).*`:                         "camel:hystrix",
- `.*restConfiguration\(\).*`:                        "camel:rest",
- `.*rest\(("[a-zA-Z0-9-/]+")*\).*`:                  "camel:rest",
- `^\s*rest\s*{.*`:                                   "camel:rest",
- `.*\.groovy\s*\(.*\).*`:                            "camel:groovy",
- `.*\.?(jsonpath|jsonpathWriteAsString)\s*\(.*\).*`: "camel:jsonpath",
- `.*\.ognl\s*\(.*\).*`:                              "camel:ognl",
- `.*\.mvel\s*\(.*\).*`:                              "camel:mvel",
- `.*\.?simple\s*\(.*\).*`:                           "camel:bean",
- `.*\.xquery\s*\(.*\).*`:                            "camel:saxon",
- `.*\.?xpath\s*\(.*\).*`:                            "camel:xpath",
- `.*\.xtokenize\s*\(.*\).*`:                         "camel:jaxp",
+ main: map[*regexp.Regexp]string{
+ jsonLibraryRegexp:       "camel:jackson",
+ jsonLanguageRegexp:      "camel:jackson",
+ circuitBreakerRegexp:    "camel:hystrix",
+ restConfigurationRegexp: "camel:rest",
+ restRegexp:              "camel:rest",
+ restXMLRegexp:           "camel:rest",
+ groovyLanguageRegexp:    "camel:groovy",
+ jsonPathLanguageRegexp:  "camel:jsonpath",
+ ognlRegexp:              "camel:ognl",
+ mvelRegexp:              "camel:mvel",
+ simpleLanguageRegexp:    "camel:bean",
+ xqueryRegexp:            "camel:saxon",
+ xpathRegexp:             "camel:xpath",
+ xtokenizeRegexp:         "camel:jaxp",
  },
- quarkus: map[string]string{
- `.*restConfiguration\(\).*`:       "camel-quarkus:rest",
- `.*rest\(("[a-zA-Z0-9-/]+")*\).*`: "camel-quarkus:rest",
- `^\s*rest\s*{.*`:                  "camel-quarkus:rest",
- `.*\.?simple\s*\(.*\).*`:          "camel-quarkus:bean",
+ quarkus: map[*regexp.Regexp]string{
+ xtokenizeRegexp: "camel-quarkus:core-xml",
  },
  }
 )
@@ -130,27 +141,26 @@ func (i *baseInspector) discoverDependencies(source v1.SourceSpec, meta *Metadat
  for _, uri := range uris {
  candidateComp := i.decodeComponent(uri)
  if candidateComp != "" {
- meta.Dependencies.Add(candidateComp)
+ i.addDependency(candidateComp, meta)
  }
  }
 
- var additionalDependencies map[string]string
- if i.catalog.Runtime.Provider == v1.RuntimeProviderQuarkus {
- additionalDependencies = sourceDependencies.quarkus
- } else {
- additionalDependencies = sourceDependencies.main
- }
- for pattern, dep := range additionalDependencies {
- pat := regexp.MustCompile(pattern)
- if pat.MatchString(source.Content) {
- meta.Dependencies.Add(dep)
+ for pattern, dep := range sourceDependencies.main {
+ if i.catalog.Runtime.Provider == v1.RuntimeProviderQuarkus {
+ // Check whether quarkus has its own artifact that differs from the standard one
+ if _, ok := sourceDependencies.quarkus[pattern]; ok {
+ dep = sourceDependencies.quarkus[pattern]
+ }
+ }
+ if pattern.MatchString(source.Content) {
+ i.addDependency(dep, meta)
  }
  }
 
  for _, match := range languageRegexp.FindAllStringSubmatch(source.Content, -1) {
  if len(match) > 1 {
  if dependency, ok := i.catalog.GetLanguageDependency(match[1]); ok {
- meta.Dependencies.Add(dependency)
+ i.addDependency(dependency, meta)
  }
  }
  }
@@ -158,12 +168,21 @@ func (i *baseInspector) discoverDependencies(source v1.SourceSpec, meta *Metadat
  for _, match := range camelTypeRegexp.FindAllStringSubmatch(source.Content, -1) {
  if len(match) > 1 {
  if dependency, ok := i.catalog.GetJavaTypeDependency(match[1]); ok {
- meta.Dependencies.Add(dependency)
+ i.addDependency(dependency, meta)
  }
  }
  }
 }
 
+func (i *baseInspector) addDependency(dependency string, meta *Metadata) {
+ if i.catalog.Runtime.Provider == v1.RuntimeProviderQuarkus {
+ if strings.HasPrefix(dependency, "camel:") {
+ dependency = "camel-quarkus:" + strings.TrimPrefix(dependency, "camel:")
+ }
+ }
+ meta.Dependencies.Add(dependency)
+}
+
 func (i *baseInspector) decodeComponent(uri string) string {
  uriSplit := strings.SplitN(uri, ":", 2)
  if len(uriSplit) < 2 {
diff --git a/pkg/util/source/inspector_xml.go b/pkg/util/source/inspector_xml.go
index f68d974..952b799 100644
--- a/pkg/util/source/inspector_xml.go
+++ b/pkg/util/source/inspector_xml.go
@@ -44,16 +44,16 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta *Metadata) error {
  if se, ok := t.(xml.StartElement); ok {
  switch se.Name.Local {
  case "rest", "restConfiguration":
- meta.Dependencies.Add("camel:rest")
+ i.addDependency("camel:rest", meta)
  case "circuitBreaker":
- meta.Dependencies.Add("camel:hystrix")
+ i.addDependency("camel:hystrix", meta)
  case "simple":
- meta.Dependencies.Add("camel:bean")
+ i.addDependency("camel:bean", meta)
  case "language":
  for _, a := range se.Attr {
  if a.Name.Local == "language" {
  if dependency, ok := i.catalog.GetLanguageDependency(a.Value); ok {
- meta.Dependencies.Add(dependency)
+ i.addDependency(dependency, meta)
  }
  }
  }
@@ -72,7 +72,7 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta *Metadata) error {
  }
 
  if dependency, ok := i.catalog.GetLanguageDependency(se.Name.Local); ok {
- meta.Dependencies.Add(dependency)
+ i.addDependency(dependency, meta)
  }
  }
  }
diff --git a/pkg/util/source/inspector_yaml.go b/pkg/util/source/inspector_yaml.go
index 1a4ed47..b56f996 100644
--- a/pkg/util/source/inspector_yaml.go
+++ b/pkg/util/source/inspector_yaml.go
@@ -55,9 +55,9 @@ func (inspector YAMLInspector) Extract(source v1.SourceSpec, meta *Metadata) err
 func (inspector YAMLInspector) parseStep(key string, content interface{}, meta *Metadata) error {
  switch key {
  case "rest":
- meta.Dependencies.Add("camel:rest")
+ inspector.addDependency("camel:rest", meta)
  case "circuitBreaker":
- meta.Dependencies.Add("camel:hystrix")
+ inspector.addDependency("camel:hystrix", meta)
  }
 
  var maybeURI string
@@ -71,13 +71,13 @@ func (inspector YAMLInspector) parseStep(key string, content interface{}, meta *
  }
 
  if _, ok := t["simple"]; ok {
- meta.Dependencies.Add("camel:bean")
+ inspector.addDependency("camel:bean", meta)
  }
 
  if _, ok := t["language"]; ok {
  if s, ok := t["language"].(string); ok {
  if dependency, ok := inspector.catalog.GetLanguageDependency(s); ok {
- meta.Dependencies.Add(dependency)
+ inspector.addDependency(dependency, meta)
  }
  } else if m, ok := t["language"].(map[interface{}]interface{}); ok {
  if err := inspector.parseStep("language", m, meta); err != nil {
@@ -89,7 +89,7 @@ func (inspector YAMLInspector) parseStep(key string, content interface{}, meta *
  for k := range t {
  if s, ok := k.(string); ok {
  if dependency, ok := inspector.catalog.GetLanguageDependency(s); ok {
- meta.Dependencies.Add(dependency)
+ inspector.addDependency(dependency, meta)
  }
  }
  }