This is an automated email from the ASF dual-hosted git repository.
nferraro 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 8ce6226 add support for non java integrations
8ce6226 is described below
commit 8ce62264d701cf7249d34c9d09e7f1468a2203c6
Author: lburgazzoli <[email protected]>
AuthorDate: Tue Sep 11 23:54:46 2018 +0200
add support for non java integrations
---
README.md | 10 +++++--
pkg/apis/camel/v1alpha1/types.go | 4 ++-
pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go | 9 ++++--
pkg/build/api/types.go | 7 ++++-
pkg/build/build_manager_integration_test.go | 13 ++++++---
pkg/build/local/local_builder.go | 6 ++--
pkg/build/local/local_builder_integration_test.go | 19 ++++++++----
pkg/client/cmd/run.go | 10 ++++++-
pkg/stub/action/integration/build.go | 5 +++-
pkg/util/digest/digest.go | 9 +++---
pkg/util/maven/maven.go | 27 +++++++++++++++++
pkg/util/maven/mavent_test.go | 33 +++++++++++++++++++++
pkg/util/maven/types.go | 18 ++++++++++--
Sample.java => runtime/examples/Sample.java | 6 +---
runtime/examples/routes.js | 34 ++++++++++++++++++++++
.../java/org/apache/camel/k/jvm/RouteLoaders.java | 11 ++++---
.../org/apache/camel/k/jvm/RouteLoadersTest.java | 6 ++--
17 files changed, 189 insertions(+), 38 deletions(-)
diff --git a/README.md b/README.md
index 7d9b496..228ef59 100644
--- a/README.md
+++ b/README.md
@@ -55,10 +55,16 @@ For Minishift, this means executing `oc login -u
system:admin` then `kamel insta
After the initial setup, you can run a Camel integration on the cluster
executing:
```
-kamel run Sample.java
+kamel run runtime/examples/Sample.java
```
-A "Sample.java" file is included in the root of this repository. You can
change the content of the file and execute the command again to see the changes.
+A "Sample.java" file is included in the folder runtime/examples of this
repository. You can change the content of the file and execute the command
again to see the changes.
+
+A JavaScript integration has also been provided as example, to run it:
+
+```
+kamel run runtime/examples/routes.js
+```
### Monitoring the Status
diff --git a/pkg/apis/camel/v1alpha1/types.go b/pkg/apis/camel/v1alpha1/types.go
index efdd022..324d056 100644
--- a/pkg/apis/camel/v1alpha1/types.go
+++ b/pkg/apis/camel/v1alpha1/types.go
@@ -45,7 +45,9 @@ type IntegrationSpec struct {
}
type SourceSpec struct {
- Code *string `json:"code,omitempty"`
+ Name *string `json:"name,omitempty"`
+ Content *string `json:"content,omitempty"`
+ Language *string `json:"language,omitempty"`
}
type IntegrationStatus struct {
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index d29a234..8b16b1e 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -267,8 +267,13 @@ func (in *PropertySpec) DeepCopy() *PropertySpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver,
writing into out. in must be non-nil.
func (in *SourceSpec) DeepCopyInto(out *SourceSpec) {
*out = *in
- if in.Code != nil {
- in, out := &in.Code, &out.Code
+ if in.Name != nil {
+ in, out := &in.Name, &out.Name
+ *out = new(string)
+ **out = **in
+ }
+ if in.Content != nil {
+ in, out := &in.Content, &out.Content
*out = new(string)
**out = **in
}
diff --git a/pkg/build/api/types.go b/pkg/build/api/types.go
index 892e526..b94a9e7 100644
--- a/pkg/build/api/types.go
+++ b/pkg/build/api/types.go
@@ -20,7 +20,7 @@ package api
// a request to build a specific code
type BuildSource struct {
Identifier BuildIdentifier
- Code string
+ Code Code
}
type BuildIdentifier struct {
@@ -28,6 +28,11 @@ type BuildIdentifier struct {
Digest string
}
+type Code struct {
+ Name string
+ Content string
+}
+
// represents the result of a build
type BuildResult struct {
Source *BuildSource
diff --git a/pkg/build/build_manager_integration_test.go
b/pkg/build/build_manager_integration_test.go
index 932b315..11deca7 100644
--- a/pkg/build/build_manager_integration_test.go
+++ b/pkg/build/build_manager_integration_test.go
@@ -21,12 +21,13 @@ package build
import (
"context"
+ "testing"
+ "time"
+
build "github.com/apache/camel-k/pkg/build/api"
"github.com/apache/camel-k/pkg/util/digest"
"github.com/apache/camel-k/pkg/util/test"
"github.com/stretchr/testify/assert"
- "testing"
- "time"
)
func TestBuild(t *testing.T) {
@@ -38,7 +39,9 @@ func TestBuild(t *testing.T) {
}
buildManager.Start(build.BuildSource{
Identifier: identifier,
- Code: code(),
+ Code: build.Code{
+ Content: code(),
+ },
})
deadline := time.Now().Add(5 * time.Minute)
@@ -66,7 +69,9 @@ func TestFailedBuild(t *testing.T) {
}
buildManager.Start(build.BuildSource{
Identifier: identifier,
- Code: code() + "XX",
+ Code: build.Code{
+ Content: code() + "XX",
+ },
})
deadline := time.Now().Add(5 * time.Minute)
diff --git a/pkg/build/local/local_builder.go b/pkg/build/local/local_builder.go
index daa5483..38a9812 100644
--- a/pkg/build/local/local_builder.go
+++ b/pkg/build/local/local_builder.go
@@ -127,12 +127,12 @@ func (b *localBuilder) execute(source build.BuildSource)
(string, error) {
},
},
},
- JavaSources: map[string]string{
- "kamel/Routes.java": source.Code,
+ Resources: map[string]string{
+ source.Code.Name: source.Code.Content,
},
Env: map[string]string{
"JAVA_MAIN_CLASS":
"org.apache.camel.k.jvm.Application",
- "CAMEL_K_ROUTES_URI": "classpath:kamel.Routes",
+ "CAMEL_K_ROUTES_URI": "classpath:" + source.Code.Name,
},
}
diff --git a/pkg/build/local/local_builder_integration_test.go
b/pkg/build/local/local_builder_integration_test.go
index 8ab1460..8c4f4a4 100644
--- a/pkg/build/local/local_builder_integration_test.go
+++ b/pkg/build/local/local_builder_integration_test.go
@@ -21,11 +21,12 @@ package local
import (
"context"
+ "testing"
+
build "github.com/apache/camel-k/pkg/build/api"
"github.com/apache/camel-k/pkg/util/digest"
"github.com/apache/camel-k/pkg/util/test"
"github.com/stretchr/testify/assert"
- "testing"
)
func TestBuild(t *testing.T) {
@@ -38,7 +39,9 @@ func TestBuild(t *testing.T) {
Name: "test0",
Digest: digest.Random(),
},
- Code: code(),
+ Code: build.Code{
+ Content: code(),
+ },
})
res := <-execution
@@ -56,7 +59,9 @@ func TestDoubleBuild(t *testing.T) {
Name: "test1",
Digest: digest.Random(),
},
- Code: code(),
+ Code: build.Code{
+ Content: code(),
+ },
})
execution2 := builder.Build(build.BuildSource{
@@ -64,7 +69,9 @@ func TestDoubleBuild(t *testing.T) {
Name: "test2",
Digest: digest.Random(),
},
- Code: code(),
+ Code: build.Code{
+ Content: code(),
+ },
})
res1 := <-execution1
@@ -84,7 +91,9 @@ func TestFailedBuild(t *testing.T) {
Name: "test3",
Digest: digest.Random(),
},
- Code: code() + "-",
+ Code: build.Code{
+ Content: code() + "-",
+ },
})
res := <-execution
diff --git a/pkg/client/cmd/run.go b/pkg/client/cmd/run.go
index 889b326..5ec40d7 100644
--- a/pkg/client/cmd/run.go
+++ b/pkg/client/cmd/run.go
@@ -23,6 +23,7 @@ import (
"io/ioutil"
"os"
"strconv"
+ "strings"
"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
"github.com/apache/camel-k/pkg/util/kubernetes"
@@ -81,6 +82,11 @@ func (o *RunCmdOptions) run(cmd *cobra.Command, args
[]string) error {
name = "integration"
}
+ codeName := args[0]
+ if idx := strings.LastIndexByte(args[0], os.PathSeparator); idx > -1 {
+ codeName = codeName[idx:]
+ }
+
integration := v1alpha1.Integration{
TypeMeta: v1.TypeMeta{
Kind: "Integration",
@@ -92,7 +98,9 @@ func (o *RunCmdOptions) run(cmd *cobra.Command, args
[]string) error {
},
Spec: v1alpha1.IntegrationSpec{
Source: v1alpha1.SourceSpec{
- Code: &code,
+ Name: &codeName,
+ Content: &code,
+ Language: &o.Language,
},
},
}
diff --git a/pkg/stub/action/integration/build.go
b/pkg/stub/action/integration/build.go
index 98b71d4..25747cc 100644
--- a/pkg/stub/action/integration/build.go
+++ b/pkg/stub/action/integration/build.go
@@ -54,7 +54,10 @@ func (b *BuildAction) Handle(integration
*v1alpha1.Integration) error {
if buildResult.Status == api.BuildStatusNotRequested {
b.buildManager.Start(api.BuildSource{
Identifier: buildIdentifier,
- Code: *integration.Spec.Source.Code, // FIXME
possible panic
+ Code: api.Code{
+ Name: *integration.Spec.Source.Name,
+ Content: *integration.Spec.Source.Content,
+ }, // FIXME possible panic
})
logrus.Info("Build started")
} else if buildResult.Status == api.BuildStatusError {
diff --git a/pkg/util/digest/digest.go b/pkg/util/digest/digest.go
index ad10e6c..09bec1c 100644
--- a/pkg/util/digest/digest.go
+++ b/pkg/util/digest/digest.go
@@ -20,10 +20,11 @@ package digest
import (
"crypto/sha256"
"encoding/base64"
- "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
- "github.com/apache/camel-k/version"
"math/rand"
"strconv"
+
+ "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+ "github.com/apache/camel-k/version"
)
// Compute a digest of the fields that are relevant for the deployment
@@ -33,8 +34,8 @@ func Compute(integration *v1alpha1.Integration) string {
// Operator version is relevant
hash.Write([]byte(version.Version))
// Integration relevant fields
- if integration.Spec.Source.Code != nil {
- hash.Write([]byte(*integration.Spec.Source.Code))
+ if integration.Spec.Source.Content != nil {
+ hash.Write([]byte(*integration.Spec.Source.Content))
}
// Add a letter at the beginning and use URL safe encoding
return "v" + base64.RawURLEncoding.EncodeToString(hash.Sum(nil))
diff --git a/pkg/util/maven/maven.go b/pkg/util/maven/maven.go
index 262f275..f474f58 100644
--- a/pkg/util/maven/maven.go
+++ b/pkg/util/maven/maven.go
@@ -26,6 +26,8 @@ import (
"os"
"os/exec"
"path"
+ "regexp"
+ "strings"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -246,3 +248,28 @@ func pomFileContent(project Project) (string, error) {
return w.String(), nil
}
+
+func ParseGAV(gav string) (Dependency, error) {
+ //
<groupId>:<artifactId>[:<packagingType>[:<classifier>]]:(<version>|'?')
+ dep := Dependency{}
+ rex := regexp.MustCompile("([^: ]+):([^: ]+)(:([^: ]*)(:([^:
]+))?)?(:([^: ]+))?")
+ res := rex.FindStringSubmatch(gav)
+
+ dep.GroupId = res[1]
+ dep.ArtifactId = res[2]
+ dep.Type = "jar"
+
+ cnt := strings.Count(gav, ":")
+ if cnt == 2 {
+ dep.Version = res[4]
+ } else if cnt == 3 {
+ dep.Type = res[4]
+ dep.Version = res[6]
+ } else {
+ dep.Type = res[4]
+ dep.Classifier = res[6]
+ dep.Version = res[8]
+ }
+
+ return dep, nil
+}
diff --git a/pkg/util/maven/mavent_test.go b/pkg/util/maven/mavent_test.go
index 8a84910..3092e4a 100644
--- a/pkg/util/maven/mavent_test.go
+++ b/pkg/util/maven/mavent_test.go
@@ -67,3 +67,36 @@ func TestPomGeneration(t *testing.T) {
assert.Equal(t, pom, expectedPom)
}
+
+func TestParseSimpleGAV(t *testing.T) {
+ dep, err := ParseGAV("org.apache.camel:camel-core:2.21.1")
+
+ assert.Nil(t, err)
+ assert.Equal(t, dep.GroupId, "org.apache.camel")
+ assert.Equal(t, dep.ArtifactId, "camel-core")
+ assert.Equal(t, dep.Version, "2.21.1")
+ assert.Equal(t, dep.Type, "jar")
+ assert.Equal(t, dep.Classifier, "")
+}
+
+func TestParseGAVWithType(t *testing.T) {
+ dep, err := ParseGAV("org.apache.camel:camel-core:war:2.21.1")
+
+ assert.Nil(t, err)
+ assert.Equal(t, dep.GroupId, "org.apache.camel")
+ assert.Equal(t, dep.ArtifactId, "camel-core")
+ assert.Equal(t, dep.Version, "2.21.1")
+ assert.Equal(t, dep.Type, "war")
+ assert.Equal(t, dep.Classifier, "")
+}
+
+func TestParseGAVWithClassifierAndType(t *testing.T) {
+ dep, err := ParseGAV("org.apache.camel:camel-core:war:test:2.21.1")
+
+ assert.Nil(t, err)
+ assert.Equal(t, dep.GroupId, "org.apache.camel")
+ assert.Equal(t, dep.ArtifactId, "camel-core")
+ assert.Equal(t, dep.Version, "2.21.1")
+ assert.Equal(t, dep.Type, "war")
+ assert.Equal(t, dep.Classifier, "test")
+}
diff --git a/pkg/util/maven/types.go b/pkg/util/maven/types.go
index 68796aa..1ebebe0 100644
--- a/pkg/util/maven/types.go
+++ b/pkg/util/maven/types.go
@@ -17,7 +17,9 @@ limitations under the License.
package maven
-import "encoding/xml"
+import (
+ "encoding/xml"
+)
type ProjectDefinition struct {
Project Project
@@ -45,5 +47,17 @@ type Dependencies struct {
type Dependency struct {
GroupId string `xml:"groupId"`
ArtifactId string `xml:"artifactId"`
- Version string `xml:"version"`
+ Version string `xml:"version,omitempty"`
+ Type string `xml:"type,omitempty"`
+ Classifier string `xml:"classifier,omitempty"`
+}
+
+func NewDependency(groupId string, artifactId string, version string)
Dependency {
+ return Dependency{
+ GroupId: groupId,
+ ArtifactId: artifactId,
+ Version: version,
+ Type: "jar",
+ Classifier: "",
+ }
}
diff --git a/Sample.java b/runtime/examples/Sample.java
similarity index 83%
rename from Sample.java
rename to runtime/examples/Sample.java
index 4ba8c88..cf1be6a 100644
--- a/Sample.java
+++ b/runtime/examples/Sample.java
@@ -1,14 +1,10 @@
-package kamel;
-
import org.apache.camel.builder.RouteBuilder;
-public class Routes extends RouteBuilder {
-
+public class Sample extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:tick")
.setBody(constant("-\n r\n o\n
c\nHello! Camel K\n s\n !\n"))
.to("log:info?skipBodyLineSeparator=false");
}
-
}
\ No newline at end of file
diff --git a/runtime/examples/routes.js b/runtime/examples/routes.js
new file mode 100644
index 0000000..a020511
--- /dev/null
+++ b/runtime/examples/routes.js
@@ -0,0 +1,34 @@
+
+// ****************
+//
+// Setup
+//
+// ****************
+
+l = components.get('log')
+l.exchangeFormatter = function(e) {
+ return "log - body=" + e.in.body + ", headers=" + e.in.headers
+}
+
+// ****************
+//
+// Functions
+//
+// ****************
+
+function proc(e) {
+ e.getIn().setHeader('RandomValue', Math.floor((Math.random() * 100) + 1))
+}
+
+// ****************
+//
+// Route
+//
+// ****************
+
+from('timer:js?period=1s')
+ .routeId('js')
+ .setBody()
+ .constant('Hello Camel K')
+ .process(proc)
+ .to('log:info')
\ No newline at end of file
diff --git a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
index 77cd3bc..48a3fb6 100644
--- a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
+++ b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
@@ -95,7 +95,7 @@ public enum RouteLoaders implements RoutesLoader {
// Exposed to the underlying script, but maybe better to
have
// a nice dsl
bindings.put("context", context);
- bindings.put("components", context);
+ bindings.put("components", new Components(context));
bindings.put("from", (Function<String, RouteDefinition>)
uri -> from(uri));
try (InputStream is = is(resource)) {
@@ -166,9 +166,12 @@ public enum RouteLoaders implements RoutesLoader {
private static InputStream is(String resource) throws IOException {
if (resource.startsWith(Application.SCHEME_CLASSPATH)) {
- return Application.class.getResourceAsStream(
- resource.substring(Application.SCHEME_CLASSPATH.length())
- );
+ String location = StringUtils.removeStart(resource,
Application.SCHEME_CLASSPATH);
+ if (!location.startsWith("/")) {
+ location = "/" + location;
+ }
+
+ return Application.class.getResourceAsStream(location);
} else {
return Files.newInputStream(
Paths.get(resource.substring(Application.SCHEME_FILE.length()))
diff --git
a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
index 4dcea3b..8701558 100644
--- a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
+++ b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
@@ -46,7 +46,7 @@ public class RouteLoadersTest {
@Test
public void testLoadJava() throws Exception {
- String resource = "classpath:/MyRoutes.java";
+ String resource = "classpath:MyRoutes.java";
RoutesLoader loader = RouteLoaders.loaderFor(resource);
RouteBuilder builder = loader.load(resource);
@@ -63,7 +63,7 @@ public class RouteLoadersTest {
@Test
public void testLoadJavaScript() throws Exception {
- String resource = "classpath:/routes.js";
+ String resource = "classpath:routes.js";
RoutesLoader loader = RouteLoaders.loaderFor(resource);
RouteBuilder builder = loader.load(resource);
@@ -80,7 +80,7 @@ public class RouteLoadersTest {
@Test
public void testLoadGroovy() throws Exception {
- String resource = "classpath:/routes.groovy";
+ String resource = "classpath:routes.groovy";
RoutesLoader loader = RouteLoaders.loaderFor(resource);
RouteBuilder builder = loader.load(resource);