You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/06/05 15:59:57 UTC
[camel-k] branch master updated (d179ded -> 6b09af9)
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git.
from d179ded Fix #722: filter allowed env variables in Knative
new 645e1d3 Allow to provide custom settings.xml #715
new 6b09af9 fix typos
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
README.adoc | 56 ++++-
pkg/apis/camel/v1alpha1/build_types.go | 1 -
pkg/apis/camel/v1alpha1/common_types.go | 14 ++
.../camel/v1alpha1/integrationplatform_types.go | 2 +-
pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go | 55 ++++-
pkg/builder/builder_steps.go | 96 ++++----
pkg/builder/builder_steps_test.go | 243 +++++++++++----------
pkg/builder/builder_types.go | 7 +-
pkg/builder/builder_utils.go | 42 +---
pkg/builder/builder_utils_test.go | 8 +-
pkg/builder/kaniko/kaniko.go | 2 +
pkg/builder/s2i/s2i.go | 2 +
pkg/cmd/install.go | 178 +++++++++++----
pkg/cmd/install_test.go | 69 ++++++
pkg/controller/integrationcontext/build.go | 12 +-
pkg/controller/integrationplatform/initialize.go | 8 -
pkg/trait/builder_test.go | 4 +-
pkg/trait/rest-dsl.go | 86 +++-----
pkg/util/kubernetes/util.go | 44 ++++
pkg/util/maven/maven.go | 84 ++++---
pkg/util/maven/maven_project.go | 39 ++++
.../maven/{maven_test.go => maven_project_test.go} | 88 ++++----
.../maven/maven_settings.go} | 18 +-
pkg/util/maven/maven_settings_test.go | 86 ++++++++
.../{maven_project_types.go => maven_types.go} | 173 +++++++++++----
pkg/util/util.go | 75 ++++---
26 files changed, 1000 insertions(+), 492 deletions(-)
create mode 100644 pkg/cmd/install_test.go
rename pkg/util/maven/{maven_test.go => maven_project_test.go} (78%)
copy pkg/{apis/camel/v1alpha1/camelcatalog_types_support.go => util/maven/maven_settings.go} (66%)
create mode 100644 pkg/util/maven/maven_settings_test.go
rename pkg/util/maven/{maven_project_types.go => maven_types.go} (63%)
[camel-k] 02/02: fix typos
Posted by lb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 6b09af9d214cbdb69d3783a979104b3093c56142
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Tue Jun 4 11:11:16 2019 +0200
fix typos
---
pkg/cmd/install.go | 46 +++++++++++++++++++++++-----------------------
1 file changed, 23 insertions(+), 23 deletions(-)
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index bb93c09..ab91a9e 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -80,7 +80,7 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
// maven settings
cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
cmd.Flags().StringVar(&impl.mavenSettings, "maven-settings", "", "Configure the source of the maven settings (configmap|secret:name[/key])")
- cmd.Flags().StringSliceVar(&impl.mavenRpositories, "maven-repository", nil, "Add a maven repository")
+ cmd.Flags().StringSliceVar(&impl.mavenRepositories, "maven-repository", nil, "Add a maven repository")
// completion support
configureBashAnnotationForFlag(
@@ -96,23 +96,23 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
type installCmdOptions struct {
*RootCmdOptions
- wait bool
- clusterSetupOnly bool
- skipClusterSetup bool
- exampleSetup bool
- outputFormat string
- camelVersion string
- runtimeVersion string
- baseImage string
- operatorImage string
- localRepository string
- buildStrategy string
- buildTimeout string
- mavenRpositories []string
- mavenSettings string
- properties []string
- contexts []string
- registry v1alpha1.IntegrationPlatformRegistrySpec
+ wait bool
+ clusterSetupOnly bool
+ skipClusterSetup bool
+ exampleSetup bool
+ outputFormat string
+ camelVersion string
+ runtimeVersion string
+ baseImage string
+ operatorImage string
+ localRepository string
+ buildStrategy string
+ buildTimeout string
+ mavenRepositories []string
+ mavenSettings string
+ properties []string
+ contexts []string
+ registry v1alpha1.IntegrationPlatformRegistrySpec
}
// nolint: gocyclo
@@ -201,13 +201,13 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
platform.Spec.Build.Timeout.Duration = d
}
- if len(o.mavenRpositories) > 0 {
+ if len(o.mavenRepositories) > 0 {
o.mavenSettings = fmt.Sprintf("configmap:%s-maven-settings/settings.xml", platform.Name)
settings := maven.NewSettings()
- repositories := make([]maven.Repository, 0, len(o.mavenRpositories))
+ repositories := make([]maven.Repository, 0, len(o.mavenRepositories))
- for i, r := range o.mavenRpositories {
+ for i, r := range o.mavenRepositories {
repository := maven.NewRepository(r)
if repository.ID == "" {
repository.ID = fmt.Sprintf("repository-%03d", i)
@@ -356,8 +356,8 @@ func (o *installCmdOptions) validate(_ *cobra.Command, _ []string) error {
result = multierr.Append(result, err)
}
- if len(o.mavenRpositories) > 0 && o.mavenSettings != "" {
- result = fmt.Errorf("incompatible options combinations: you canno set both mavenRpository and mavenSettings")
+ if len(o.mavenRepositories) > 0 && o.mavenSettings != "" {
+ result = fmt.Errorf("incompatible options combinations: you cannot set both mavenRepository and mavenSettings")
}
return result
[camel-k] 01/02: Allow to provide custom settings.xml #715
Posted by lb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 645e1d399aec41c9d93aee68454a8a913e298ae3
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Fri May 31 14:45:55 2019 +0200
Allow to provide custom settings.xml #715
---
README.adoc | 56 ++++-
pkg/apis/camel/v1alpha1/build_types.go | 1 -
pkg/apis/camel/v1alpha1/common_types.go | 14 ++
.../camel/v1alpha1/integrationplatform_types.go | 2 +-
pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go | 55 ++++-
pkg/builder/builder_steps.go | 96 ++++----
pkg/builder/builder_steps_test.go | 243 +++++++++++----------
pkg/builder/builder_types.go | 7 +-
pkg/builder/builder_utils.go | 42 +---
pkg/builder/builder_utils_test.go | 8 +-
pkg/builder/kaniko/kaniko.go | 2 +
pkg/builder/s2i/s2i.go | 2 +
pkg/cmd/install.go | 178 +++++++++++----
pkg/cmd/install_test.go | 69 ++++++
pkg/controller/integrationcontext/build.go | 12 +-
pkg/controller/integrationplatform/initialize.go | 8 -
pkg/trait/builder_test.go | 4 +-
pkg/trait/rest-dsl.go | 86 +++-----
pkg/util/kubernetes/util.go | 44 ++++
pkg/util/maven/maven.go | 84 ++++---
pkg/util/maven/maven_project.go | 39 ++++
.../maven/{maven_test.go => maven_project_test.go} | 88 ++++----
.../kaniko.go => util/maven/maven_settings.go} | 44 +---
pkg/util/maven/maven_settings_test.go | 86 ++++++++
.../{maven_project_types.go => maven_types.go} | 173 +++++++++++----
pkg/util/util.go | 75 ++++---
26 files changed, 1003 insertions(+), 515 deletions(-)
diff --git a/README.adoc b/README.adoc
index 0ab236a..7783f7d 100644
--- a/README.adoc
+++ b/README.adoc
@@ -156,14 +156,58 @@ As example if you want to change the queue size of the seda component, you can u
camel.component.seda.queueSize = 10
```
-==== Configure additional maven repositories
+==== Configure Maven settings
-Additional maven repositories can be defined at platform installation time or at integration/context build time:
+Maven settings can be configured by providing a custom settings.xml through a ConfigMap or secret.
+The source for maven settings can be configured using either the `kamel` CLI at installation time or by editing Camel K's IntegrationPlatform:
+
+- cli:
++
+.Syntax
+[source]
+----
+kamel install --maven-settings=configmap|secret:name[/key]
+----
++
+.Example
+[source]
+----
+kamel cmd --maven-settings=configmap:maven-settings/settings.xml
+----
+
+- IntegrationPlatform:
++
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: IntegrationPlatform
+metadata:
+ labels:
+ app: camel-k
+ name: camel-k
+spec:
+ build:
+ maven:
+ settings:
+ configMapKeyRef:
+ key: settings.xml
+ name: maven-settings
+----
+
+To quickly create a config map you can use the following command:
+
+[source]
+----
+kubectl create configmap maven-settings --from-file=settings.xml
+----
+
+
+As an installation shortcut, additional maven repositories can be alternatively added using the `--maven-repository` option
[source]
----
-kamel cmd --repository http://repo1.my-company.com --repository http://repo2.my-company.com
+kamel cmd --maven-repository http://repo1.my-company.com --maven-repository http://repo2.my-company.com
----
A repository url follow conventions used to configure additional repositories in https://karaf.apache.org[_Apache Karaf_] so it can be appended with zero or more of the following flags:
@@ -174,7 +218,7 @@ A repository url follow conventions used to configure additional repositories in
[source]
----
-kamel install --repository http://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases
+kamel install --maven-repository http://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases
----
This results in:
@@ -195,9 +239,9 @@ This results in:
</repositories>
----
-[NOTE]
+IMPORTANT
====
-The final repositories list is the sum of the repositories defined on the resource (integration/context) and the platform ones
+the options `--maven-settings` and `--maven-repository` are mutually exclusive
====
==== Configure Integration Volumes
diff --git a/pkg/apis/camel/v1alpha1/build_types.go b/pkg/apis/camel/v1alpha1/build_types.go
index f06f1ca..7a511d5 100644
--- a/pkg/apis/camel/v1alpha1/build_types.go
+++ b/pkg/apis/camel/v1alpha1/build_types.go
@@ -20,7 +20,6 @@ type BuildSpec struct {
Sources []SourceSpec `json:"sources,omitempty"`
Resources []ResourceSpec `json:"resources,omitempty"`
Dependencies []string `json:"dependencies,omitempty"`
- Repositories []string `json:"repositories,omitempty"`
BuildDir string `json:"buildDir,omitempty"`
}
diff --git a/pkg/apis/camel/v1alpha1/common_types.go b/pkg/apis/camel/v1alpha1/common_types.go
index c16aca6..4a927dd 100644
--- a/pkg/apis/camel/v1alpha1/common_types.go
+++ b/pkg/apis/camel/v1alpha1/common_types.go
@@ -18,6 +18,7 @@ limitations under the License.
package v1alpha1
import (
+ corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
@@ -71,3 +72,16 @@ type TraitSpec struct {
type Configurable interface {
Configurations() []ConfigurationSpec
}
+
+// MavenSpec --
+type MavenSpec struct {
+ Settings ValueSource `json:"settings,omitempty"`
+}
+
+// ValueSource --
+type ValueSource struct {
+ // Selects a key of a ConfigMap.
+ ConfigMapKeyRef *corev1.ConfigMapKeySelector `json:"configMapKeyRef,omitempty"`
+ // Selects a key of a secret.
+ SecretKeyRef *corev1.SecretKeySelector `json:"secretKeyRef,omitempty" `
+}
diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index a07b69e..653a63d 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -80,10 +80,10 @@ type IntegrationPlatformBuildSpec struct {
BaseImage string `json:"baseImage,omitempty"`
Properties map[string]string `json:"properties,omitempty"`
LocalRepository string `json:"localRepository,omitempty"`
- Repositories []string `json:"repositories,omitempty"`
Registry IntegrationPlatformRegistrySpec `json:"registry,omitempty"`
Timeout metav1.Duration `json:"timeout,omitempty"`
PersistentVolumeClaim string `json:"persistentVolumeClaim,omitempty"`
+ Maven MavenSpec `json:"maven,omitempty"`
}
// IntegrationPlatformRegistrySpec --
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index 1233a9e..fab12d9 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -5,6 +5,7 @@
package v1alpha1
import (
+ v1 "k8s.io/api/core/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
)
@@ -110,11 +111,6 @@ func (in *BuildSpec) DeepCopyInto(out *BuildSpec) {
*out = make([]string, len(*in))
copy(*out, *in)
}
- if in.Repositories != nil {
- in, out := &in.Repositories, &out.Repositories
- *out = make([]string, len(*in))
- copy(*out, *in)
- }
return
}
@@ -681,13 +677,9 @@ func (in *IntegrationPlatformBuildSpec) DeepCopyInto(out *IntegrationPlatformBui
(*out)[key] = val
}
}
- if in.Repositories != nil {
- in, out := &in.Repositories, &out.Repositories
- *out = make([]string, len(*in))
- copy(*out, *in)
- }
out.Registry = in.Registry
out.Timeout = in.Timeout
+ in.Maven.DeepCopyInto(&out.Maven)
return
}
@@ -907,6 +899,23 @@ func (in *IntegrationStatus) DeepCopy() *IntegrationStatus {
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MavenSpec) DeepCopyInto(out *MavenSpec) {
+ *out = *in
+ in.Settings.DeepCopyInto(&out.Settings)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MavenSpec.
+func (in *MavenSpec) DeepCopy() *MavenSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(MavenSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ResourceSpec) DeepCopyInto(out *ResourceSpec) {
*out = *in
out.DataSpec = in.DataSpec
@@ -978,3 +987,29 @@ func (in *TraitSpec) DeepCopy() *TraitSpec {
in.DeepCopyInto(out)
return out
}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ValueSource) DeepCopyInto(out *ValueSource) {
+ *out = *in
+ if in.ConfigMapKeyRef != nil {
+ in, out := &in.ConfigMapKeyRef, &out.ConfigMapKeyRef
+ *out = new(v1.ConfigMapKeySelector)
+ (*in).DeepCopyInto(*out)
+ }
+ if in.SecretKeyRef != nil {
+ in, out := &in.SecretKeyRef, &out.SecretKeyRef
+ *out = new(v1.SecretKeySelector)
+ (*in).DeepCopyInto(*out)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValueSource.
+func (in *ValueSource) DeepCopy() *ValueSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ValueSource)
+ in.DeepCopyInto(out)
+ return out
+}
diff --git a/pkg/builder/builder_steps.go b/pkg/builder/builder_steps.go
index d9494ab..0b50b15 100644
--- a/pkg/builder/builder_steps.go
+++ b/pkg/builder/builder_steps.go
@@ -25,6 +25,8 @@ import (
"reflect"
"strings"
+ "github.com/apache/camel-k/pkg/util/kubernetes"
+
k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
"github.com/scylladb/go-set/strset"
@@ -45,25 +47,31 @@ func init() {
}
type steps struct {
- GenerateProject Step
- InjectDependencies Step
- SanitizeDependencies Step
- ComputeDependencies Step
- StandardPackager Step
- IncrementalPackager Step
+ GenerateProject Step
+ GenerateProjectSettings Step
+ InjectDependencies Step
+ SanitizeDependencies Step
+ ComputeDependencies Step
+ StandardPackager Step
+ IncrementalPackager Step
}
+// Steps --
var Steps = steps{
GenerateProject: NewStep(
ProjectGenerationPhase,
generateProject,
),
- InjectDependencies: NewStep(
+ GenerateProjectSettings: NewStep(
ProjectGenerationPhase+1,
+ generateProjectSettings,
+ ),
+ InjectDependencies: NewStep(
+ ProjectGenerationPhase+2,
injectDependencies,
),
SanitizeDependencies: NewStep(
- ProjectGenerationPhase+2,
+ ProjectGenerationPhase+3,
sanitizeDependencies,
),
ComputeDependencies: NewStep(
@@ -80,6 +88,7 @@ var Steps = steps{
),
}
+// RegisterSteps --
func RegisterSteps(steps interface{}) {
v := reflect.ValueOf(steps)
t := reflect.TypeOf(steps)
@@ -107,16 +116,16 @@ func registerStep(steps ...Step) {
// generateProject --
func generateProject(ctx *Context) error {
- p, err := NewProject(ctx)
+ p, err := NewMavenProject(ctx)
if err != nil {
return err
}
- ctx.Project = p
+ ctx.Maven.Project = p
//
// set-up dependencies
//
- ctx.Project.AddDependencyGAV("org.apache.camel.k", "camel-k-runtime-jvm", ctx.Build.RuntimeVersion)
+ ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", "camel-k-runtime-jvm", ctx.Build.RuntimeVersion)
for _, d := range ctx.Build.Dependencies {
switch {
@@ -127,7 +136,7 @@ func generateProject(ctx *Context) error {
artifactID = "camel-" + artifactID
}
- ctx.Project.AddDependencyGAV("org.apache.camel", artifactID, "")
+ ctx.Maven.Project.AddDependencyGAV("org.apache.camel", artifactID, "")
case strings.HasPrefix(d, "camel-k:"):
artifactID := strings.TrimPrefix(d, "camel-k:")
@@ -135,16 +144,16 @@ func generateProject(ctx *Context) error {
artifactID = "camel-" + artifactID
}
- ctx.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
+ ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
case strings.HasPrefix(d, "mvn:"):
mid := strings.TrimPrefix(d, "mvn:")
gav := strings.Replace(mid, "/", ":", -1)
- ctx.Project.AddEncodedDependencyGAV(gav)
+ ctx.Maven.Project.AddEncodedDependencyGAV(gav)
case strings.HasPrefix(d, "runtime:"):
artifactID := strings.Replace(d, "runtime:", "camel-k-runtime-", 1)
- ctx.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
+ ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
case strings.HasPrefix(d, "bom:"):
// no-op
default:
@@ -153,7 +162,7 @@ func generateProject(ctx *Context) error {
}
// Add Log4j 2 SLF4J binding as default logging impl
- ctx.Project.AddDependency(maven.Dependency{
+ ctx.Maven.Project.AddDependency(maven.Dependency{
GroupID: "org.apache.logging.log4j",
ArtifactID: "log4j-slf4j-impl",
Version: "2.11.2",
@@ -163,12 +172,25 @@ func generateProject(ctx *Context) error {
return nil
}
+// generateProjectSettings --
+func generateProjectSettings(ctx *Context) error {
+ val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &ctx.Build.Platform.Build.Maven.Settings)
+ if err != nil {
+ return err
+ }
+ if val != "" {
+ ctx.Maven.SettingsData = []byte(val)
+ }
+
+ return nil
+}
+
func injectDependencies(ctx *Context) error {
//
// Add dependencies from catalog
//
- deps := make([]maven.Dependency, len(ctx.Project.Dependencies))
- copy(deps, ctx.Project.Dependencies)
+ deps := make([]maven.Dependency, len(ctx.Maven.Project.Dependencies))
+ copy(deps, ctx.Maven.Project.Dependencies)
for _, d := range deps {
if a, ok := ctx.Catalog.Artifacts[d.ArtifactID]; ok {
@@ -178,7 +200,7 @@ func injectDependencies(ctx *Context) error {
ArtifactID: dep.ArtifactID,
}
- ctx.Project.AddDependency(md)
+ ctx.Maven.Project.AddDependency(md)
for _, e := range dep.Exclusions {
me := maven.Exclusion{
@@ -186,7 +208,7 @@ func injectDependencies(ctx *Context) error {
ArtifactID: e.ArtifactID,
}
- ctx.Project.AddDependencyExclusion(md, me)
+ ctx.Maven.Project.AddDependencyExclusion(md, me)
}
}
}
@@ -194,8 +216,8 @@ func injectDependencies(ctx *Context) error {
//
// post process dependencies
//
- deps = make([]maven.Dependency, len(ctx.Project.Dependencies))
- copy(deps, ctx.Project.Dependencies)
+ deps = make([]maven.Dependency, len(ctx.Maven.Project.Dependencies))
+ copy(deps, ctx.Maven.Project.Dependencies)
for _, d := range deps {
if a, ok := ctx.Catalog.Artifacts[d.ArtifactID]; ok {
@@ -210,7 +232,7 @@ func injectDependencies(ctx *Context) error {
ArtifactID: e.ArtifactID,
}
- ctx.Project.AddDependencyExclusion(md, me)
+ ctx.Maven.Project.AddDependencyExclusion(md, me)
}
}
}
@@ -219,21 +241,21 @@ func injectDependencies(ctx *Context) error {
}
func sanitizeDependencies(ctx *Context) error {
- for i := 0; i < len(ctx.Project.Dependencies); i++ {
- dep := ctx.Project.Dependencies[i]
+ for i := 0; i < len(ctx.Maven.Project.Dependencies); i++ {
+ dep := ctx.Maven.Project.Dependencies[i]
switch dep.GroupID {
case "org.apache.camel":
//
// Remove the version so we force using the one configured by the bom
//
- ctx.Project.Dependencies[i].Version = ""
+ ctx.Maven.Project.Dependencies[i].Version = ""
case "org.apache.camel.k":
//
// Force every runtime dependency to have the required version discardin
// any version eventually set on the catalog
//
- ctx.Project.Dependencies[i].Version = ctx.Build.RuntimeVersion
+ ctx.Maven.Project.Dependencies[i].Version = ctx.Build.RuntimeVersion
}
}
@@ -241,23 +263,17 @@ func sanitizeDependencies(ctx *Context) error {
}
func computeDependencies(ctx *Context) error {
- p := path.Join(ctx.Path, "maven")
-
- err := maven.CreateStructure(p, ctx.Project)
- if err != nil {
- return err
- }
+ mc := maven.NewContext(path.Join(ctx.Path, "maven"), ctx.Maven.Project)
+ mc.Settings = ctx.Maven.Settings
+ mc.SettingsData = ctx.Maven.SettingsData
+ mc.AddArguments(maven.ExtraOptions(ctx.Build.Platform.Build.LocalRepository)...)
+ mc.AddArgumentf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list", ctx.Build.RuntimeVersion)
- opts := make([]string, 0, 2)
- opts = append(opts, maven.ExtraOptions(ctx.Build.Platform.Build.LocalRepository)...)
- opts = append(opts, fmt.Sprintf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list", ctx.Build.RuntimeVersion))
-
- err = maven.Run(p, opts...)
- if err != nil {
+ if err := maven.Run(mc); err != nil {
return errors.Wrap(err, "failure while determining classpath")
}
- dependencies := path.Join(p, "target", "dependencies.yaml")
+ dependencies := path.Join(mc.Path, "target", "dependencies.yaml")
content, err := ioutil.ReadFile(dependencies)
if err != nil {
return err
diff --git a/pkg/builder/builder_steps_test.go b/pkg/builder/builder_steps_test.go
index dcdfd12..b576f8d 100644
--- a/pkg/builder/builder_steps_test.go
+++ b/pkg/builder/builder_steps_test.go
@@ -20,6 +20,7 @@ package builder
import (
"testing"
+ corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -50,7 +51,7 @@ func TestRegisterDuplicatedSteps(t *testing.T) {
})
}
-func TestMavenRepositories(t *testing.T) {
+func TestGenerateJvmProject(t *testing.T) {
catalog, err := test.DefaultCatalog()
assert.Nil(t, err)
@@ -66,10 +67,6 @@ func TestMavenRepositories(t *testing.T) {
Dependencies: []string{
"runtime:jvm",
},
- Repositories: []string{
- "https://repository.apache.org/content/repositories/snapshots@id=apache.snapshots@snapshots@noreleases",
- "https://oss.sonatype.org/content/repositories/snapshots/@id=sonatype.snapshots@snapshots",
- },
},
}
@@ -78,90 +75,134 @@ func TestMavenRepositories(t *testing.T) {
err = injectDependencies(&ctx)
assert.Nil(t, err)
- assert.Equal(t, 2, len(ctx.Project.Repositories))
- assert.Equal(t, 2, len(ctx.Project.PluginRepositories))
+ assert.Equal(t, 1, len(ctx.Maven.Project.DependencyManagement.Dependencies))
+ assert.Equal(t, "org.apache.camel", ctx.Maven.Project.DependencyManagement.Dependencies[0].GroupID)
+ assert.Equal(t, "camel-bom", ctx.Maven.Project.DependencyManagement.Dependencies[0].ArtifactID)
+ assert.Equal(t, catalog.Version, ctx.Maven.Project.DependencyManagement.Dependencies[0].Version)
+ assert.Equal(t, "pom", ctx.Maven.Project.DependencyManagement.Dependencies[0].Type)
+ assert.Equal(t, "import", ctx.Maven.Project.DependencyManagement.Dependencies[0].Scope)
- assert.Contains(t, ctx.Project.Repositories, maven.Repository{
- ID: "apache.snapshots",
- URL: "https://repository.apache.org/content/repositories/snapshots",
- Snapshots: maven.RepositoryPolicy{Enabled: true},
- Releases: maven.RepositoryPolicy{Enabled: false},
+ assert.Equal(t, 4, len(ctx.Maven.Project.Dependencies))
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+ GroupID: "org.apache.camel.k",
+ ArtifactID: "camel-k-runtime-jvm",
+ Version: defaults.RuntimeVersion,
+ Type: "jar",
})
-
- assert.Contains(t, ctx.Project.Repositories, maven.Repository{
- ID: "sonatype.snapshots",
- URL: "https://oss.sonatype.org/content/repositories/snapshots/",
- Snapshots: maven.RepositoryPolicy{Enabled: true},
- Releases: maven.RepositoryPolicy{Enabled: true},
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+ GroupID: "org.apache.camel",
+ ArtifactID: "camel-core",
})
-
- assert.Contains(t, ctx.Project.PluginRepositories, maven.Repository{
- ID: "apache.snapshots",
- URL: "https://repository.apache.org/content/repositories/snapshots",
- Snapshots: maven.RepositoryPolicy{Enabled: true},
- Releases: maven.RepositoryPolicy{Enabled: false},
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+ GroupID: "org.apache.camel.k",
+ ArtifactID: "camel-k-adapter-camel-2",
})
-
- assert.Contains(t, ctx.Project.PluginRepositories, maven.Repository{
- ID: "sonatype.snapshots",
- URL: "https://oss.sonatype.org/content/repositories/snapshots/",
- Snapshots: maven.RepositoryPolicy{Enabled: true},
- Releases: maven.RepositoryPolicy{Enabled: true},
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+ GroupID: "org.apache.logging.log4j",
+ ArtifactID: "log4j-slf4j-impl",
+ Version: "2.11.2",
+ Scope: "runtime",
})
}
-func TestGenerateJvmProject(t *testing.T) {
+func TestMavenSettingsFromConfigMap(t *testing.T) {
catalog, err := test.DefaultCatalog()
assert.Nil(t, err)
+ c, err := test.NewFakeClient(
+ &corev1.ConfigMap{
+ TypeMeta: metav1.TypeMeta{
+ APIVersion: "v1",
+ Kind: "ConfigMap",
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Namespace: "ns",
+ Name: "maven-settings",
+ },
+ Data: map[string]string{
+ "settings.xml": "setting-data",
+ },
+ },
+ )
+
ctx := Context{
- Catalog: catalog,
+ Catalog: catalog,
+ Client: c,
+ Namespace: "ns",
Build: v1alpha1.BuildSpec{
RuntimeVersion: defaults.RuntimeVersion,
Platform: v1alpha1.IntegrationPlatformSpec{
Build: v1alpha1.IntegrationPlatformBuildSpec{
CamelVersion: catalog.Version,
+ Maven: v1alpha1.MavenSpec{
+ Settings: v1alpha1.ValueSource{
+ ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "maven-settings",
+ },
+ Key: "settings.xml",
+ },
+ },
+ },
},
},
- Dependencies: []string{
- "runtime:jvm",
- },
},
}
- err = generateProject(&ctx)
+ err = generateProjectSettings(&ctx)
assert.Nil(t, err)
- err = injectDependencies(&ctx)
+
+ assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
+}
+
+func TestMavenSettingsFromSecret(t *testing.T) {
+ catalog, err := test.DefaultCatalog()
assert.Nil(t, err)
- assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
- assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
- assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
- assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
- assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
- assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
+ c, err := test.NewFakeClient(
+ &corev1.Secret{
+ TypeMeta: metav1.TypeMeta{
+ APIVersion: "v1",
+ Kind: "Secret",
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Namespace: "ns",
+ Name: "maven-settings",
+ },
+ Data: map[string][]byte{
+ "settings.xml": []byte("setting-data"),
+ },
+ },
+ )
- assert.Equal(t, 4, len(ctx.Project.Dependencies))
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
- GroupID: "org.apache.camel.k",
- ArtifactID: "camel-k-runtime-jvm",
- Version: defaults.RuntimeVersion,
- Type: "jar",
- })
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
- GroupID: "org.apache.camel",
- ArtifactID: "camel-core",
- })
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
- GroupID: "org.apache.camel.k",
- ArtifactID: "camel-k-adapter-camel-2",
- })
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
- GroupID: "org.apache.logging.log4j",
- ArtifactID: "log4j-slf4j-impl",
- Version: "2.11.2",
- Scope: "runtime",
- })
+ ctx := Context{
+ Catalog: catalog,
+ Client: c,
+ Namespace: "ns",
+ Build: v1alpha1.BuildSpec{
+ RuntimeVersion: defaults.RuntimeVersion,
+ Platform: v1alpha1.IntegrationPlatformSpec{
+ Build: v1alpha1.IntegrationPlatformBuildSpec{
+ CamelVersion: catalog.Version,
+ Maven: v1alpha1.MavenSpec{
+ Settings: v1alpha1.ValueSource{
+ SecretKeyRef: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "maven-settings",
+ },
+ Key: "settings.xml",
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ err = generateProjectSettings(&ctx)
+ assert.Nil(t, err)
+
+ assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
}
func TestGenerateGroovyProject(t *testing.T) {
@@ -188,40 +229,40 @@ func TestGenerateGroovyProject(t *testing.T) {
err = injectDependencies(&ctx)
assert.Nil(t, err)
- assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
- assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
- assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
- assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
- assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
- assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
+ assert.Equal(t, 1, len(ctx.Maven.Project.DependencyManagement.Dependencies))
+ assert.Equal(t, "org.apache.camel", ctx.Maven.Project.DependencyManagement.Dependencies[0].GroupID)
+ assert.Equal(t, "camel-bom", ctx.Maven.Project.DependencyManagement.Dependencies[0].ArtifactID)
+ assert.Equal(t, catalog.Version, ctx.Maven.Project.DependencyManagement.Dependencies[0].Version)
+ assert.Equal(t, "pom", ctx.Maven.Project.DependencyManagement.Dependencies[0].Type)
+ assert.Equal(t, "import", ctx.Maven.Project.DependencyManagement.Dependencies[0].Scope)
- assert.Equal(t, 6, len(ctx.Project.Dependencies))
+ assert.Equal(t, 6, len(ctx.Maven.Project.Dependencies))
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel.k",
ArtifactID: "camel-k-runtime-jvm",
Version: defaults.RuntimeVersion,
Type: "jar",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel.k",
ArtifactID: "camel-k-runtime-groovy",
Version: defaults.RuntimeVersion,
Type: "jar",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel",
ArtifactID: "camel-core",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel.k",
ArtifactID: "camel-k-adapter-camel-2",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel",
ArtifactID: "camel-groovy",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.logging.log4j",
ArtifactID: "log4j-slf4j-impl",
Version: "2.11.2",
@@ -229,46 +270,6 @@ func TestGenerateGroovyProject(t *testing.T) {
})
}
-func TestGenerateProjectWithRepositories(t *testing.T) {
- catalog, err := test.DefaultCatalog()
- assert.Nil(t, err)
-
- ctx := Context{
- Catalog: catalog,
- Build: v1alpha1.BuildSpec{
- Platform: v1alpha1.IntegrationPlatformSpec{
- Build: v1alpha1.IntegrationPlatformBuildSpec{
- CamelVersion: catalog.Version,
- },
- },
- Repositories: []string{
- "https://repository.apache.org/content/groups/snapshots-group@id=apache-snapshots@snapshots@noreleases",
- "https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j-snapshots@snapshots@noreleases",
- },
- },
- }
-
- err = generateProject(&ctx)
- assert.Nil(t, err)
- err = injectDependencies(&ctx)
- assert.Nil(t, err)
-
- assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
- assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
- assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
- assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
- assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
- assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
-
- assert.Equal(t, 2, len(ctx.Project.Repositories))
- assert.Equal(t, "apache-snapshots", ctx.Project.Repositories[0].ID)
- assert.False(t, ctx.Project.Repositories[0].Releases.Enabled)
- assert.True(t, ctx.Project.Repositories[0].Snapshots.Enabled)
- assert.Equal(t, "ops4j-snapshots", ctx.Project.Repositories[1].ID)
- assert.False(t, ctx.Project.Repositories[1].Releases.Enabled)
- assert.True(t, ctx.Project.Repositories[1].Snapshots.Enabled)
-}
-
func TestSanitizeDependencies(t *testing.T) {
catalog, err := test.DefaultCatalog()
assert.Nil(t, err)
@@ -298,23 +299,23 @@ func TestSanitizeDependencies(t *testing.T) {
err = sanitizeDependencies(&ctx)
assert.Nil(t, err)
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel.k",
ArtifactID: "camel-k-runtime-jvm",
Version: defaults.RuntimeVersion,
Type: "jar",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel",
ArtifactID: "camel-core",
Type: "jar",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "org.apache.camel",
ArtifactID: "camel-undertow",
Type: "jar",
})
- assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
GroupID: "com.mycompany",
ArtifactID: "my-dep",
Version: "1.2.3",
diff --git a/pkg/builder/builder_types.go b/pkg/builder/builder_types.go
index 9cf17d1..549e9aa 100644
--- a/pkg/builder/builder_types.go
+++ b/pkg/builder/builder_types.go
@@ -107,13 +107,18 @@ type Context struct {
PublicImage string
Error error
Namespace string
- Project maven.Project
Path string
Artifacts []v1alpha1.Artifact
SelectedArtifacts []v1alpha1.Artifact
Archive string
ContextFilter func(integrationContext *v1alpha1.IntegrationContext) bool
Resources []Resource
+
+ Maven struct {
+ Project maven.Project
+ Settings *maven.Settings
+ SettingsData []byte
+ }
}
// HasRequiredImage --
diff --git a/pkg/builder/builder_utils.go b/pkg/builder/builder_utils.go
index 2093566..571bece 100644
--- a/pkg/builder/builder_utils.go
+++ b/pkg/builder/builder_utils.go
@@ -18,8 +18,6 @@ limitations under the License.
package builder
import (
- "encoding/xml"
- "fmt"
"strings"
"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -28,6 +26,7 @@ import (
"github.com/apache/camel-k/pkg/util/maven"
)
+// StepIDsFor --
func StepIDsFor(steps ...Step) []string {
IDs := make([]string, 0)
for _, step := range steps {
@@ -46,8 +45,8 @@ func artifactIDs(artifacts []v1alpha1.Artifact) []string {
return result
}
-// NewProject --
-func NewProject(ctx *Context) (maven.Project, error) {
+// NewMavenProject --
+func NewMavenProject(ctx *Context) (maven.Project, error) {
//
// Catalog
//
@@ -60,19 +59,11 @@ func NewProject(ctx *Context) (maven.Project, error) {
ctx.Catalog = c
}
- p := maven.Project{
- XMLName: xml.Name{Local: "project"},
- XMLNs: "http://maven.apache.org/POM/4.0.0",
- XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance",
- XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
- ModelVersion: "4.0.0",
- GroupID: "org.apache.camel.k.integration",
- ArtifactID: "camel-k-integration",
- Version: defaults.Version,
- Properties: ctx.Build.Platform.Build.Properties,
- DependencyManagement: maven.DependencyManagement{Dependencies: make([]maven.Dependency, 0)},
- Dependencies: make([]maven.Dependency, 0),
- }
+ p := maven.NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-integration", defaults.Version)
+ p.Properties = ctx.Build.Platform.Build.Properties
+ p.DependencyManagement = maven.DependencyManagement{Dependencies: make([]maven.Dependency, 0)}
+ p.Dependencies = make([]maven.Dependency, 0)
+
//
// DependencyManagement
//
@@ -103,23 +94,6 @@ func NewProject(ctx *Context) (maven.Project, error) {
})
}
}
- //p.DependencyManagement.Dependencies = dm
-
- //
- // Repositories
- //
- p.Repositories = make([]maven.Repository, 0, len(ctx.Build.Repositories))
- p.PluginRepositories = make([]maven.Repository, 0, len(ctx.Build.Repositories))
-
- for i, r := range ctx.Build.Repositories {
- repo := maven.NewRepository(r)
- if repo.ID == "" {
- repo.ID = fmt.Sprintf("repo-%03d", i)
- }
-
- p.Repositories = append(p.Repositories, repo)
- p.PluginRepositories = append(p.PluginRepositories, repo)
- }
return p, nil
}
diff --git a/pkg/builder/builder_utils_test.go b/pkg/builder/builder_utils_test.go
index 1491d51..5bd0075 100644
--- a/pkg/builder/builder_utils_test.go
+++ b/pkg/builder/builder_utils_test.go
@@ -52,22 +52,22 @@ func TestNewProject(t *testing.T) {
err = generateProject(&ctx)
assert.Nil(t, err)
- assert.Len(t, ctx.Project.DependencyManagement.Dependencies, 3)
- assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+ assert.Len(t, ctx.Maven.Project.DependencyManagement.Dependencies, 3)
+ assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
GroupID: "org.apache.camel",
ArtifactID: "camel-bom",
Version: ctx.Catalog.Version,
Type: "pom",
Scope: "import",
})
- assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
GroupID: "my.company",
ArtifactID: "my-artifact-1",
Version: "1.0.0",
Type: "pom",
Scope: "import",
})
- assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+ assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
GroupID: "my.company",
ArtifactID: "my-artifact-2",
Version: "2.0.0",
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/builder/kaniko/kaniko.go
index 858799e..f5e53cb 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/builder/kaniko/kaniko.go
@@ -29,6 +29,7 @@ type steps struct {
Publisher builder.Step
}
+// Steps --
var Steps = steps{
Publisher: builder.NewStep(
builder.ApplicationPublishPhase,
@@ -39,6 +40,7 @@ var Steps = steps{
// DefaultSteps --
var DefaultSteps = []builder.Step{
builder.Steps.GenerateProject,
+ builder.Steps.GenerateProjectSettings,
builder.Steps.InjectDependencies,
builder.Steps.SanitizeDependencies,
builder.Steps.ComputeDependencies,
diff --git a/pkg/builder/s2i/s2i.go b/pkg/builder/s2i/s2i.go
index 3089a21..d323233 100644
--- a/pkg/builder/s2i/s2i.go
+++ b/pkg/builder/s2i/s2i.go
@@ -30,6 +30,7 @@ type steps struct {
ReplaceHost builder.Step
}
+// Steps --
var Steps = steps{
Publisher: builder.NewStep(
builder.ApplicationPublishPhase,
@@ -44,6 +45,7 @@ var Steps = steps{
// DefaultSteps --
var DefaultSteps = []builder.Step{
builder.Steps.GenerateProject,
+ builder.Steps.GenerateProjectSettings,
builder.Steps.InjectDependencies,
builder.Steps.SanitizeDependencies,
builder.Steps.ComputeDependencies,
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 1a9a9fe..bb93c09 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -19,9 +19,14 @@ package cmd
import (
"fmt"
+ "regexp"
"strings"
"time"
+ "github.com/apache/camel-k/pkg/util"
+
+ "github.com/apache/camel-k/pkg/util/maven"
+
"github.com/apache/camel-k/deploy"
"github.com/apache/camel-k/pkg/apis"
"go.uber.org/multierr"
@@ -36,7 +41,9 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
+ corev1 "k8s.io/api/core/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
@@ -61,9 +68,6 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
cmd.Flags().StringVar(&impl.registry.Address, "registry", "", "A Docker registry that can be used to publish images")
cmd.Flags().StringVar(&impl.registry.Secret, "registry-secret", "", "A secret used to push/pull images to the Docker registry")
cmd.Flags().BoolVar(&impl.registry.Insecure, "registry-insecure", false, "Configure to configure registry access in insecure mode or not")
- cmd.Flags().StringSliceVar(&impl.repositories, "repository", nil, "Add a maven repository")
- cmd.Flags().BoolVar(&impl.snapshotRepositories, "snapshot-repositories", false, "Automatically include known snapshot repositories")
- cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
cmd.Flags().StringSliceVarP(&impl.properties, "property", "p", nil, "Add a camel property")
cmd.Flags().StringVar(&impl.camelVersion, "camel-version", "", "Set the camel version")
cmd.Flags().StringVar(&impl.runtimeVersion, "runtime-version", "", "Set the camel-k runtime version")
@@ -73,6 +77,11 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
cmd.Flags().StringVar(&impl.buildStrategy, "build-strategy", "", "Set the build strategy")
cmd.Flags().StringVar(&impl.buildTimeout, "build-timeout", "", "Set how long the build process can last")
+ // maven settings
+ cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
+ cmd.Flags().StringVar(&impl.mavenSettings, "maven-settings", "", "Configure the source of the maven settings (configmap|secret:name[/key])")
+ cmd.Flags().StringSliceVar(&impl.mavenRpositories, "maven-repository", nil, "Add a maven repository")
+
// completion support
configureBashAnnotationForFlag(
&cmd,
@@ -87,23 +96,23 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
type installCmdOptions struct {
*RootCmdOptions
- wait bool
- clusterSetupOnly bool
- skipClusterSetup bool
- exampleSetup bool
- snapshotRepositories bool
- outputFormat string
- camelVersion string
- runtimeVersion string
- baseImage string
- operatorImage string
- localRepository string
- buildStrategy string
- buildTimeout string
- repositories []string
- properties []string
- contexts []string
- registry v1alpha1.IntegrationPlatformRegistrySpec
+ wait bool
+ clusterSetupOnly bool
+ skipClusterSetup bool
+ exampleSetup bool
+ outputFormat string
+ camelVersion string
+ runtimeVersion string
+ baseImage string
+ operatorImage string
+ localRepository string
+ buildStrategy string
+ buildTimeout string
+ mavenRpositories []string
+ mavenSettings string
+ properties []string
+ contexts []string
+ registry v1alpha1.IntegrationPlatformRegistrySpec
}
// nolint: gocyclo
@@ -164,23 +173,6 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
if o.localRepository != "" {
platform.Spec.Build.LocalRepository = o.localRepository
}
- if len(o.repositories) > 0 {
- platform.Spec.Build.Repositories = o.repositories
- }
- if o.snapshotRepositories {
- if platform.Spec.Build.Repositories == nil {
- platform.Spec.Build.Repositories = make([]string, 0)
- }
-
- platform.Spec.Build.Repositories = append(
- platform.Spec.Build.Repositories,
- "https://repository.apache.org/content/repositories/snapshots@id=apache.snapshots@snapshots",
- )
- platform.Spec.Build.Repositories = append(
- platform.Spec.Build.Repositories,
- "https://oss.sonatype.org/content/repositories/snapshots/@id=sonatype.snapshots@snapshots",
- )
- }
if o.camelVersion != "" {
platform.Spec.Build.CamelVersion = o.camelVersion
}
@@ -209,6 +201,68 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
platform.Spec.Build.Timeout.Duration = d
}
+ if len(o.mavenRpositories) > 0 {
+ o.mavenSettings = fmt.Sprintf("configmap:%s-maven-settings/settings.xml", platform.Name)
+
+ settings := maven.NewSettings()
+ repositories := make([]maven.Repository, 0, len(o.mavenRpositories))
+
+ for i, r := range o.mavenRpositories {
+ repository := maven.NewRepository(r)
+ if repository.ID == "" {
+ repository.ID = fmt.Sprintf("repository-%03d", i)
+ }
+
+ repositories = append(repositories, repository)
+ }
+
+ settings.Profiles = []maven.Profile{
+ {
+ ID: "maven-settings",
+ Activation: maven.Activation{
+ ActiveByDefault: true,
+ },
+ Repositories: repositories,
+ },
+ }
+
+ data, err := util.EncodeXML(settings)
+ if err != nil {
+ return err
+ }
+
+ cm := corev1.ConfigMap{
+ TypeMeta: metav1.TypeMeta{
+ Kind: "ConfigMap",
+ APIVersion: "v1",
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: platform.Name + "-maven-settings",
+ Namespace: namespace,
+ Labels: map[string]string{
+ "app": "camel-k",
+ },
+ },
+ Data: map[string]string{
+ "settings.xml": string(data),
+ },
+ }
+
+ err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, &cm)
+ if err != nil {
+ return err
+ }
+ }
+
+ if o.mavenSettings != "" {
+ mavenSettings, err := decodeMavenSettings(o.mavenSettings)
+ if err != nil {
+ return err
+ }
+
+ platform.Spec.Build.Maven.Settings = mavenSettings
+ }
+
platform.Spec.Resources.Contexts = o.contexts
err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, platform)
@@ -301,6 +355,11 @@ func (o *installCmdOptions) validate(_ *cobra.Command, _ []string) error {
err := errorIfContextIsNotAvailable(schema, context)
result = multierr.Append(result, err)
}
+
+ if len(o.mavenRpositories) > 0 && o.mavenSettings != "" {
+ result = fmt.Errorf("incompatible options combinations: you canno set both mavenRpository and mavenSettings")
+ }
+
return result
}
@@ -322,3 +381,48 @@ func errorIfContextIsNotAvailable(schema *runtime.Scheme, context string) error
}
return errors.Errorf("Unknown context '%s'", context)
}
+
+func decodeMavenSettings(mavenSettings string) (v1alpha1.ValueSource, error) {
+ sub := make([]string, 0)
+ rex := regexp.MustCompile(`^(configmap|secret):([a-zA-Z0-9][a-zA-Z0-9-]*)(/([a-zA-Z0-9].*))?$`)
+ hits := rex.FindAllStringSubmatch(mavenSettings, -1)
+
+ for _, hit := range hits {
+ if len(hit) > 1 {
+ for _, match := range hit[1:] {
+ sub = append(sub, match)
+ }
+ }
+ }
+
+ if len(sub) >= 2 {
+ key := "settings.xml"
+
+ if len(sub) == 4 {
+ key = sub[3]
+ }
+
+ if sub[0] == "configmap" {
+ return v1alpha1.ValueSource{
+ ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: sub[1],
+ },
+ Key: key,
+ },
+ }, nil
+ }
+ if sub[0] == "secret" {
+ return v1alpha1.ValueSource{
+ SecretKeyRef: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: sub[1],
+ },
+ Key: key,
+ },
+ }, nil
+ }
+ }
+
+ return v1alpha1.ValueSource{}, fmt.Errorf("illegal maven setting definition, syntax: configmap|secret:resource-name[/settings path]")
+}
diff --git a/pkg/cmd/install_test.go b/pkg/cmd/install_test.go
new file mode 100644
index 0000000..27a8473
--- /dev/null
+++ b/pkg/cmd/install_test.go
@@ -0,0 +1,69 @@
+/*
+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 cmd
+
+import (
+ "testing"
+
+ "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestDecodeMavenSettings(t *testing.T) {
+ var err error
+ var val v1alpha1.ValueSource
+
+ //
+ // ConfigMap
+ //
+ val, err = decodeMavenSettings("configmap:maven-settings/s.xml")
+ assert.Nil(t, err)
+ assert.Nil(t, val.SecretKeyRef)
+ assert.Equal(t, "maven-settings", val.ConfigMapKeyRef.Name)
+ assert.Equal(t, "s.xml", val.ConfigMapKeyRef.Key)
+
+ val, err = decodeMavenSettings("configmap:maven-settings")
+ assert.Nil(t, err)
+ assert.Nil(t, val.SecretKeyRef)
+ assert.Equal(t, "maven-settings", val.ConfigMapKeyRef.Name)
+ assert.Empty(t, val.ConfigMapKeyRef.Key)
+
+ //
+ // Secrets
+ //
+ val, err = decodeMavenSettings("secret:maven-settings-secret/s.xml")
+ assert.Nil(t, err)
+ assert.Nil(t, val.ConfigMapKeyRef)
+ assert.Equal(t, "maven-settings-secret", val.SecretKeyRef.Name)
+ assert.Equal(t, "s.xml", val.SecretKeyRef.Key)
+
+ val, err = decodeMavenSettings("secret:maven-settings-secret")
+ assert.Nil(t, err)
+ assert.Nil(t, val.ConfigMapKeyRef)
+ assert.Equal(t, "maven-settings-secret", val.SecretKeyRef.Name)
+ assert.Empty(t, val.SecretKeyRef.Key)
+
+ //
+ // Errors
+ //
+ _, err = decodeMavenSettings("something:maven-settings-secret/s.xml")
+ assert.NotNil(t, err)
+ _, err = decodeMavenSettings("secret")
+ assert.NotNil(t, err)
+}
diff --git a/pkg/controller/integrationcontext/build.go b/pkg/controller/integrationcontext/build.go
index 37051bd..65d3b36 100644
--- a/pkg/controller/integrationcontext/build.go
+++ b/pkg/controller/integrationcontext/build.go
@@ -32,7 +32,6 @@ import (
"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
"github.com/apache/camel-k/pkg/builder"
- "github.com/apache/camel-k/pkg/platform"
"github.com/apache/camel-k/pkg/trait"
)
@@ -75,20 +74,12 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, ictx *v1alp
build.Status.Phase == v1alpha1.BuildPhaseError ||
build.Status.Phase == v1alpha1.BuildPhaseInterrupted ||
build.Status.Phase == v1alpha1.BuildPhaseSucceeded {
- p, err := platform.GetCurrentPlatform(ctx, action.client, ictx.Namespace)
- if err != nil {
- return err
- }
+
env, err := trait.Apply(ctx, action.client, nil, ictx)
if err != nil {
return err
}
- // assume there's no duplication nor conflict for now
- repositories := make([]string, 0, len(ictx.Spec.Repositories)+len(p.Spec.Build.Repositories))
- repositories = append(repositories, ictx.Spec.Repositories...)
- repositories = append(repositories, p.Spec.Build.Repositories...)
-
if env.CamelCatalog == nil {
return errors.New("undefined camel catalog")
}
@@ -108,7 +99,6 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, ictx *v1alp
RuntimeVersion: env.RuntimeVersion,
Platform: env.Platform.Spec,
Dependencies: ictx.Spec.Dependencies,
- Repositories: repositories,
Steps: builder.StepIDsFor(env.Steps...),
BuildDir: env.BuildDir,
},
diff --git a/pkg/controller/integrationplatform/initialize.go b/pkg/controller/integrationplatform/initialize.go
index 4c93551..f8c2f9b 100644
--- a/pkg/controller/integrationplatform/initialize.go
+++ b/pkg/controller/integrationplatform/initialize.go
@@ -133,14 +133,6 @@ func (action *initializeAction) Handle(ctx context.Context, ip *v1alpha1.Integra
action.L.Infof("LocalRepository set to %s", target.Spec.Build.LocalRepository)
action.L.Infof("Timeout set to %s", target.Spec.Build.Timeout)
- for i, r := range target.Spec.Build.Repositories {
- if i == 0 {
- action.L.Info("Repositories:")
- }
-
- action.L.Infof("%d - %s", i, r)
- }
-
err = action.client.Update(ctx, target)
if err != nil {
return err
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 9f62dca..52bf4ab 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -87,7 +87,7 @@ func TestS2IBuilderTrait(t *testing.T) {
assert.NotEmpty(t, env.ExecutedTraits)
assert.NotNil(t, env.GetTrait(ID("builder")))
assert.NotEmpty(t, env.Steps)
- assert.Len(t, env.Steps, 6)
+ assert.Len(t, env.Steps, 7)
assert.Condition(t, func() bool {
for _, s := range env.Steps {
if s == s2i.Steps.Publisher && s.Phase() == builder.ApplicationPublishPhase {
@@ -107,7 +107,7 @@ func TestKanikoBuilderTrait(t *testing.T) {
assert.NotEmpty(t, env.ExecutedTraits)
assert.NotNil(t, env.GetTrait(ID("builder")))
assert.NotEmpty(t, env.Steps)
- assert.Len(t, env.Steps, 6)
+ assert.Len(t, env.Steps, 7)
assert.Condition(t, func() bool {
for _, s := range env.Steps {
if s == kaniko.Steps.Publisher && s.Phase() == builder.ApplicationPublishPhase {
diff --git a/pkg/trait/rest-dsl.go b/pkg/trait/rest-dsl.go
index 41a32bb..71cd6b7 100644
--- a/pkg/trait/rest-dsl.go
+++ b/pkg/trait/rest-dsl.go
@@ -18,7 +18,6 @@ limitations under the License.
package trait
import (
- "encoding/xml"
"errors"
"fmt"
"io/ioutil"
@@ -28,6 +27,8 @@ import (
"strconv"
"strings"
+ "github.com/apache/camel-k/pkg/util/kubernetes"
+
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -106,22 +107,25 @@ func (t *restDslTrait) Apply(e *Environment) error {
return err
}
- opts := make([]string, 0, 4)
- opts = append(opts, maven.ExtraOptions(e.Platform.Spec.Build.LocalRepository)...)
- opts = append(opts, "-Dopenapi.spec="+in)
- opts = append(opts, "-Ddsl.out="+out)
-
- project, err := t.generateProject(e)
+ project, err := t.generateMavenProject(e)
if err != nil {
return err
}
- err = maven.CreateStructure(tmpDir, project)
+ mc := maven.NewContext(tmpDir, project)
+ mc.AddArguments(maven.ExtraOptions(e.Platform.Spec.Build.LocalRepository)...)
+ mc.AddArgument("-Dopenapi.spec=" + in)
+ mc.AddArgument("-Ddsl.out=" + out)
+
+ settings, err := kubernetes.ResolveValueSource(e.C, e.Client, e.Integration.Namespace, &e.Platform.Spec.Build.Maven.Settings)
if err != nil {
return err
}
+ if settings != "" {
+ mc.SettingsData = []byte(settings)
+ }
- err = maven.Run(tmpDir, opts...)
+ err = maven.Run(mc)
if err != nil {
return err
}
@@ -202,61 +206,35 @@ func (t *restDslTrait) Apply(e *Environment) error {
return nil
}
-func (t *restDslTrait) generateProject(e *Environment) (maven.Project, error) {
+func (t *restDslTrait) generateMavenProject(e *Environment) (maven.Project, error) {
if e.CamelCatalog == nil {
return maven.Project{}, errors.New("unknown camel catalog")
}
- p := maven.Project{
- XMLName: xml.Name{Local: "project"},
- XMLNs: "http://maven.apache.org/POM/4.0.0",
- XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance",
- XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
- ModelVersion: "4.0.0",
- GroupID: "org.apache.camel.k.integration",
- ArtifactID: "camel-k-red-dsl-generator",
- Version: defaults.Version,
- Build: maven.Build{
- DefaultGoal: "generate-resources",
- Plugins: []maven.Plugin{
+ p := maven.NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-rest-dsl-generator", defaults.Version)
+ p.Build.DefaultGoal = "generate-resources"
+ p.Build.Plugins = []maven.Plugin{
+ {
+ GroupID: "org.apache.camel.k",
+ ArtifactID: "camel-k-maven-plugin",
+ Version: e.RuntimeVersion,
+ Executions: []maven.Execution{
{
- GroupID: "org.apache.camel.k",
- ArtifactID: "camel-k-maven-plugin",
- Version: e.RuntimeVersion,
- Executions: []maven.Execution{
- {
- Phase: "generate-resources",
- Goals: []string{
- "generate-rest-xml",
- },
- },
- },
- Dependencies: []maven.Dependency{
- {
- GroupID: "org.apache.camel",
- ArtifactID: "camel-swagger-rest-dsl-generator",
- Version: e.CamelCatalog.Version,
- },
+ Phase: "generate-resources",
+ Goals: []string{
+ "generate-rest-xml",
},
},
},
+ Dependencies: []maven.Dependency{
+ {
+ GroupID: "org.apache.camel",
+ ArtifactID: "camel-swagger-rest-dsl-generator",
+ Version: e.CamelCatalog.Version,
+ },
+ },
},
}
- //
- // Repositories
- //
-
- p.Repositories = make([]maven.Repository, 0, len(e.Platform.Spec.Build.Repositories))
-
- for i, r := range e.Platform.Spec.Build.Repositories {
- repo := maven.NewRepository(r)
- if repo.ID == "" {
- repo.ID = fmt.Sprintf("repo-%03d", i)
- }
-
- p.Repositories = append(p.Repositories, repo)
- }
-
return p, nil
}
diff --git a/pkg/util/kubernetes/util.go b/pkg/util/kubernetes/util.go
index 2ecb761..45b8a59 100644
--- a/pkg/util/kubernetes/util.go
+++ b/pkg/util/kubernetes/util.go
@@ -237,3 +237,47 @@ func LookUpResources(ctx context.Context, client client.Client, namespace string
}
return res, nil
}
+
+// GetSecretRefValue returns the value of a secret in the supplied namespace --
+func GetSecretRefValue(ctx context.Context, client client.Client, namespace string, selector *corev1.SecretKeySelector) (string, error) {
+ secret, err := GetSecret(ctx, client, selector.Name, namespace)
+ if err != nil {
+ return "", err
+ }
+
+ if data, ok := secret.Data[selector.Key]; ok {
+ return string(data), nil
+ }
+
+ return "", fmt.Errorf("key %s not found in secret %s", selector.Key, selector.Name)
+
+}
+
+// GetConfigMapRefValue returns the value of a configmap in the supplied namespace
+func GetConfigMapRefValue(ctx context.Context, client client.Client, namespace string, selector *corev1.ConfigMapKeySelector) (string, error) {
+ cm, err := GetConfigMap(ctx, client, selector.Name, namespace)
+ if err != nil {
+ return "", err
+ }
+
+ if data, ok := cm.Data[selector.Key]; ok {
+ return data, nil
+ }
+
+ return "", fmt.Errorf("key %s not found in config map %s", selector.Key, selector.Name)
+}
+
+// ResolveValueSource --
+func ResolveValueSource(ctx context.Context, client client.Client, namespace string, valueSource *v1alpha1.ValueSource) (string, error) {
+ if valueSource.ConfigMapKeyRef != nil && valueSource.SecretKeyRef != nil {
+ return "", fmt.Errorf("value source has bot config map and secret configuired")
+ }
+ if valueSource.ConfigMapKeyRef != nil {
+ return GetConfigMapRefValue(ctx, client, namespace, valueSource.ConfigMapKeyRef)
+ }
+ if valueSource.SecretKeyRef != nil {
+ return GetSecretRefValue(ctx, client, namespace, valueSource.SecretKeyRef)
+ }
+
+ return "", nil
+}
diff --git a/pkg/util/maven/maven.go b/pkg/util/maven/maven.go
index 485d074..3e28d18 100644
--- a/pkg/util/maven/maven.go
+++ b/pkg/util/maven/maven.go
@@ -18,11 +18,12 @@ limitations under the License.
package maven
import (
- "bytes"
- "encoding/xml"
"fmt"
+ "io"
+ "io/ioutil"
"os"
"os/exec"
+ "path"
"regexp"
"strings"
@@ -35,50 +36,75 @@ import (
// Log --
var Log = log.WithName("maven")
-// GeneratePomContent generate a pom.xml file from the given project definition
-func GeneratePomContent(project Project) (string, error) {
- w := &bytes.Buffer{}
- w.WriteString(xml.Header)
-
- e := xml.NewEncoder(w)
- e.Indent("", " ")
-
- err := e.Encode(project)
- if err != nil {
- return "", err
+// GenerateProjectStructure --
+func GenerateProjectStructure(context Context) error {
+ if err := util.WriteFileWithBytesMarshallerContent(context.Path, "pom.xml", context.Project); err != nil {
+ return err
}
- return w.String(), nil
-}
-
-// CreateStructure --
-func CreateStructure(buildDir string, project Project) error {
- Log.Infof("write project: %+v", project)
-
- pom, err := GeneratePomContent(project)
- if err != nil {
- return err
+ if context.SettingsData != nil {
+ if err := util.WriteFileWithContent(context.Path, "settings.xml", context.SettingsData); err != nil {
+ return err
+ }
+ } else if context.Settings != nil {
+ if err := util.WriteFileWithBytesMarshallerContent(context.Path, "settings.xml", context.Settings); err != nil {
+ return err
+ }
}
- err = util.WriteFileWithContent(buildDir, "pom.xml", pom)
- if err != nil {
- return err
+ for k, v := range context.AdditionalEntries {
+ var bytes []byte
+ var err error
+
+ if dc, ok := v.([]byte); ok {
+ bytes = dc
+ } else if dc, ok := v.(io.Reader); ok {
+ bytes, err = ioutil.ReadAll(dc)
+ if err != nil {
+ return err
+ }
+ } else {
+ return fmt.Errorf("unknown content type: name=%s, content=%+v", k, v)
+ }
+
+ if len(bytes) > 0 {
+ Log.Infof("write entry: %s (%d bytes)", k, len(bytes))
+
+ err = util.WriteFileWithContent(context.Path, k, bytes)
+ if err != nil {
+ return err
+ }
+ }
}
return nil
}
// Run --
-func Run(buildDir string, args ...string) error {
+func Run(context Context) error {
+ if err := GenerateProjectStructure(context); err != nil {
+ return err
+ }
+
mvnCmd := "mvn"
if c, ok := os.LookupEnv("MAVEN_CMD"); ok {
mvnCmd = c
}
- args = append(args, "--batch-mode")
+ args := append(context.AdditionalArguments, "--batch-mode")
+
+ settingsPath := path.Join(context.Path, "settings.xml")
+ settingsExists, err := util.FileExists(settingsPath)
+ if err != nil {
+ return err
+ }
+
+ if settingsExists {
+ args = append(args, "--settings", settingsPath)
+ }
cmd := exec.Command(mvnCmd, args...)
- cmd.Dir = buildDir
+ cmd.Dir = context.Path
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
diff --git a/pkg/util/maven/maven_project.go b/pkg/util/maven/maven_project.go
index 7c536cb..541414f 100644
--- a/pkg/util/maven/maven_project.go
+++ b/pkg/util/maven/maven_project.go
@@ -18,9 +18,48 @@ limitations under the License.
package maven
import (
+ "bytes"
+ "encoding/xml"
"strings"
)
+// NewProject --
+func NewProject() Project {
+ return Project{
+ XMLName: xml.Name{Local: "project"},
+ XMLNs: "http://maven.apache.org/POM/4.0.0",
+ XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance",
+ XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
+ ModelVersion: "4.0.0",
+ }
+}
+
+// NewProjectWithGAV --
+func NewProjectWithGAV(group string, artifact string, version string) Project {
+ p := NewProject()
+ p.GroupID = group
+ p.ArtifactID = artifact
+ p.Version = version
+
+ return p
+}
+
+// MarshalBytes --
+func (p Project) MarshalBytes() ([]byte, error) {
+ w := &bytes.Buffer{}
+ w.WriteString(xml.Header)
+
+ e := xml.NewEncoder(w)
+ e.Indent("", " ")
+
+ err := e.Encode(p)
+ if err != nil {
+ return []byte{}, err
+ }
+
+ return w.Bytes(), nil
+}
+
// LookupDependency --
func (p *Project) LookupDependency(dep Dependency) *Dependency {
for i := range p.Dependencies {
diff --git a/pkg/util/maven/maven_test.go b/pkg/util/maven/maven_project_test.go
similarity index 78%
rename from pkg/util/maven/maven_test.go
rename to pkg/util/maven/maven_project_test.go
index 3115f9e..cbb7daa 100644
--- a/pkg/util/maven/maven_test.go
+++ b/pkg/util/maven/maven_project_test.go
@@ -18,9 +18,10 @@ limitations under the License.
package maven
import (
- "encoding/xml"
"testing"
+ "github.com/apache/camel-k/pkg/util"
+
"github.com/stretchr/testify/assert"
)
@@ -81,67 +82,58 @@ const expectedPom = `<?xml version="1.0" encoding="UTF-8"?>
</project>`
func TestPomGeneration(t *testing.T) {
- project := Project{
- XMLName: xml.Name{Local: "project"},
- XMLNs: "http://maven.apache.org/POM/4.0.0",
- XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance",
- XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
- ModelVersion: "4.0.0",
- GroupID: "org.apache.camel.k.integration",
- ArtifactID: "camel-k-integration",
- Version: "1.0.0",
- DependencyManagement: DependencyManagement{
- Dependencies: []Dependency{
- {
- GroupID: "org.apache.camel",
- ArtifactID: "camel-bom",
- Version: "2.22.1",
- Type: "pom",
- Scope: "import",
- },
- },
- },
+ project := NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-integration", "1.0.0")
+ project.DependencyManagement = DependencyManagement{
Dependencies: []Dependency{
{
- GroupID: "org.apache.camel.k",
- ArtifactID: "camel-k-runtime-jvm",
- Version: "1.0.0",
+ GroupID: "org.apache.camel",
+ ArtifactID: "camel-bom",
+ Version: "2.22.1",
+ Type: "pom",
+ Scope: "import",
},
},
- Repositories: []Repository{
- {
- ID: "central",
- URL: "https://repo.maven.apache.org/maven2",
- Snapshots: RepositoryPolicy{
- Enabled: false,
- },
- Releases: RepositoryPolicy{
- Enabled: true,
- UpdatePolicy: "never",
- },
+ }
+ project.Dependencies = []Dependency{
+ {
+ GroupID: "org.apache.camel.k",
+ ArtifactID: "camel-k-runtime-jvm",
+ Version: "1.0.0",
+ },
+ }
+ project.Repositories = []Repository{
+ {
+ ID: "central",
+ URL: "https://repo.maven.apache.org/maven2",
+ Snapshots: RepositoryPolicy{
+ Enabled: false,
+ },
+ Releases: RepositoryPolicy{
+ Enabled: true,
+ UpdatePolicy: "never",
},
},
- PluginRepositories: []Repository{
- {
- ID: "central",
- URL: "https://repo.maven.apache.org/maven2",
- Snapshots: RepositoryPolicy{
- Enabled: false,
- },
- Releases: RepositoryPolicy{
- Enabled: true,
- UpdatePolicy: "never",
- },
+ }
+ project.PluginRepositories = []Repository{
+ {
+ ID: "central",
+ URL: "https://repo.maven.apache.org/maven2",
+ Snapshots: RepositoryPolicy{
+ Enabled: false,
+ },
+ Releases: RepositoryPolicy{
+ Enabled: true,
+ UpdatePolicy: "never",
},
},
}
- pom, err := GeneratePomContent(project)
+ pom, err := util.EncodeXML(project)
assert.Nil(t, err)
assert.NotNil(t, pom)
- assert.Equal(t, expectedPom, pom)
+ assert.Equal(t, expectedPom, string(pom))
}
func TestParseSimpleGAV(t *testing.T) {
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/util/maven/maven_settings.go
similarity index 55%
copy from pkg/builder/kaniko/kaniko.go
copy to pkg/util/maven/maven_settings.go
index 858799e..16f96b7 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/util/maven/maven_settings.go
@@ -15,36 +15,16 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-package kaniko
-
-import (
- "github.com/apache/camel-k/pkg/builder"
-)
-
-func init() {
- builder.RegisterSteps(Steps)
+package maven
+
+import "encoding/xml"
+
+// NewSettings --
+func NewSettings() Settings {
+ return Settings{
+ XMLName: xml.Name{Local: "settings"},
+ XMLNs: "http://maven.apache.org/SETTINGS/1.0.0",
+ XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance",
+ XsiSchemaLocation: "http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd",
+ }
}
-
-type steps struct {
- Publisher builder.Step
-}
-
-var Steps = steps{
- Publisher: builder.NewStep(
- builder.ApplicationPublishPhase,
- publisher,
- ),
-}
-
-// DefaultSteps --
-var DefaultSteps = []builder.Step{
- builder.Steps.GenerateProject,
- builder.Steps.InjectDependencies,
- builder.Steps.SanitizeDependencies,
- builder.Steps.ComputeDependencies,
- builder.Steps.IncrementalPackager,
- Steps.Publisher,
-}
-
-// BuildDir is the directory where to build artifacts (shared with the Kaniko pod)
-var BuildDir = "/workspace"
diff --git a/pkg/util/maven/maven_settings_test.go b/pkg/util/maven/maven_settings_test.go
new file mode 100644
index 0000000..8bd25a3
--- /dev/null
+++ b/pkg/util/maven/maven_settings_test.go
@@ -0,0 +1,86 @@
+/*
+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 maven
+
+import (
+ "testing"
+
+ "github.com/apache/camel-k/pkg/util"
+ "github.com/stretchr/testify/assert"
+)
+
+const expectedSettings = `<?xml version="1.0" encoding="UTF-8"?>
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ` +
+ `xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
+ <localRepository>/tmp/artifacts/m2</localRepository>
+ <profiles>
+ <profile>
+ <id>my-profile</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <repositories>
+ <repository>
+ <id>central</id>
+ <url>https://repo.maven.apache.org/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ </repository>
+ </repositories>
+ <pluginRepositories></pluginRepositories>
+ </profile>
+ </profiles>
+</settings>`
+
+func TestSettingsGeneration(t *testing.T) {
+ settings := NewSettings()
+ settings.LocalRepository = "/tmp/artifacts/m2"
+ settings.Profiles = []Profile{
+ {
+ ID: "my-profile",
+ Activation: Activation{
+ ActiveByDefault: true,
+ },
+ Repositories: []Repository{
+ {
+ ID: "central",
+ URL: "https://repo.maven.apache.org/maven2",
+ Snapshots: RepositoryPolicy{
+ Enabled: false,
+ },
+ Releases: RepositoryPolicy{
+ Enabled: true,
+ UpdatePolicy: "never",
+ },
+ },
+ },
+ },
+ }
+
+ content, err := util.EncodeXML(settings)
+
+ assert.Nil(t, err)
+ assert.NotNil(t, settings)
+
+ assert.Equal(t, expectedSettings, string(content))
+}
diff --git a/pkg/util/maven/maven_project_types.go b/pkg/util/maven/maven_types.go
similarity index 63%
rename from pkg/util/maven/maven_project_types.go
rename to pkg/util/maven/maven_types.go
index e95b484..24ff0a3 100644
--- a/pkg/util/maven/maven_project_types.go
+++ b/pkg/util/maven/maven_types.go
@@ -18,49 +18,11 @@ limitations under the License.
package maven
import (
+ "bytes"
"encoding/xml"
+ "fmt"
)
-// Project represent a maven project
-type Project struct {
- XMLName xml.Name
- XMLNs string `xml:"xmlns,attr"`
- XMLNsXsi string `xml:"xmlns:xsi,attr"`
- XsiSchemaLocation string `xml:"xsi:schemaLocation,attr"`
- ModelVersion string `xml:"modelVersion"`
- GroupID string `xml:"groupId"`
- ArtifactID string `xml:"artifactId"`
- Version string `xml:"version"`
- Properties Properties `xml:"properties,omitempty"`
- DependencyManagement DependencyManagement `xml:"dependencyManagement"`
- Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
- Repositories []Repository `xml:"repositories>repository,omitempty"`
- PluginRepositories []Repository `xml:"pluginRepositories>pluginRepository,omitempty"`
- Build Build `xml:"build,omitempty"`
-}
-
-// Exclusion represent a maven's dependency exlucsion
-type Exclusion struct {
- GroupID string `xml:"groupId" yaml:"groupId"`
- ArtifactID string `xml:"artifactId" yaml:"artifactId"`
-}
-
-// DependencyManagement represent maven's dependency management block
-type DependencyManagement struct {
- Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
-}
-
-// Dependency represent a maven's dependency
-type Dependency struct {
- GroupID string `xml:"groupId" yaml:"groupId"`
- ArtifactID string `xml:"artifactId" yaml:"artifactId"`
- Version string `xml:"version,omitempty" yaml:"version,omitempty"`
- Type string `xml:"type,omitempty" yaml:"type,omitempty"`
- Classifier string `xml:"classifier,omitempty" yaml:"classifier,omitempty"`
- Scope string `xml:"scope,omitempty" yaml:"scope,omitempty"`
- Exclusions *[]Exclusion `xml:"exclusions>exclusion,omitempty" yaml:"exclusions,omitempty"`
-}
-
// Repository --
type Repository struct {
ID string `xml:"id"`
@@ -125,3 +87,134 @@ func (m Properties) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
return e.EncodeToken(start.End())
}
+
+// NewContext --
+func NewContext(buildDir string, project Project) Context {
+ return Context{
+ Path: buildDir,
+ Project: project,
+ AdditionalArguments: make([]string, 0),
+ AdditionalEntries: make(map[string]interface{}),
+ }
+}
+
+// Context --
+type Context struct {
+ Path string
+ Project Project
+ Settings *Settings
+ SettingsData []byte
+ AdditionalArguments []string
+ AdditionalEntries map[string]interface{}
+}
+
+// AddEntry --
+func (c *Context) AddEntry(id string, entry interface{}) {
+ if c.AdditionalEntries == nil {
+ c.AdditionalEntries = make(map[string]interface{})
+ }
+
+ c.AdditionalEntries[id] = entry
+}
+
+// AddArgument --
+func (c *Context) AddArgument(argument string) {
+ c.AdditionalArguments = append(c.AdditionalArguments, argument)
+}
+
+// AddArgumentf --
+func (c *Context) AddArgumentf(format string, args ...interface{}) {
+ c.AdditionalArguments = append(c.AdditionalArguments, fmt.Sprintf(format, args...))
+}
+
+// AddArguments --
+func (c *Context) AddArguments(arguments ...string) {
+ c.AdditionalArguments = append(c.AdditionalArguments, arguments...)
+}
+
+// Settings represent a maven settings
+type Settings struct {
+ XMLName xml.Name
+ XMLNs string `xml:"xmlns,attr"`
+ XMLNsXsi string `xml:"xmlns:xsi,attr"`
+ XsiSchemaLocation string `xml:"xsi:schemaLocation,attr"`
+ LocalRepository string `xml:"localRepository"`
+ Profiles []Profile `xml:"profiles>profile,omitempty"`
+}
+
+// MarshalBytes --
+func (s Settings) MarshalBytes() ([]byte, error) {
+ w := &bytes.Buffer{}
+ w.WriteString(xml.Header)
+
+ e := xml.NewEncoder(w)
+ e.Indent("", " ")
+
+ err := e.Encode(s)
+ if err != nil {
+ return []byte{}, err
+ }
+
+ return w.Bytes(), nil
+}
+
+// Project represent a maven project
+type Project struct {
+ XMLName xml.Name
+ XMLNs string `xml:"xmlns,attr"`
+ XMLNsXsi string `xml:"xmlns:xsi,attr"`
+ XsiSchemaLocation string `xml:"xsi:schemaLocation,attr"`
+ ModelVersion string `xml:"modelVersion"`
+ GroupID string `xml:"groupId"`
+ ArtifactID string `xml:"artifactId"`
+ Version string `xml:"version"`
+ Properties Properties `xml:"properties,omitempty"`
+ DependencyManagement DependencyManagement `xml:"dependencyManagement"`
+ Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
+ Repositories []Repository `xml:"repositories>repository,omitempty"`
+ PluginRepositories []Repository `xml:"pluginRepositories>pluginRepository,omitempty"`
+ Build Build `xml:"build,omitempty"`
+}
+
+// Exclusion represent a maven's dependency exlucsion
+type Exclusion struct {
+ GroupID string `xml:"groupId" yaml:"groupId"`
+ ArtifactID string `xml:"artifactId" yaml:"artifactId"`
+}
+
+// DependencyManagement represent maven's dependency management block
+type DependencyManagement struct {
+ Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
+}
+
+// Dependency represent a maven's dependency
+type Dependency struct {
+ GroupID string `xml:"groupId" yaml:"groupId"`
+ ArtifactID string `xml:"artifactId" yaml:"artifactId"`
+ Version string `xml:"version,omitempty" yaml:"version,omitempty"`
+ Type string `xml:"type,omitempty" yaml:"type,omitempty"`
+ Classifier string `xml:"classifier,omitempty" yaml:"classifier,omitempty"`
+ Scope string `xml:"scope,omitempty" yaml:"scope,omitempty"`
+ Exclusions *[]Exclusion `xml:"exclusions>exclusion,omitempty" yaml:"exclusions,omitempty"`
+}
+
+// Profile --
+type Profile struct {
+ ID string `xml:"id"`
+ Activation Activation `xml:"activation,omitempty"`
+ Properties Properties `xml:"properties,omitempty"`
+ Repositories []Repository `xml:"repositories>repository,omitempty"`
+ PluginRepositories []Repository `xml:"pluginRepositories>pluginRepository,omitempty"`
+}
+
+// Activation --
+type Activation struct {
+ ActiveByDefault bool `xml:"activeByDefault"`
+ Property *PropertyActivation `xml:"property,omitempty"`
+}
+
+// PropertyActivation --
+type PropertyActivation struct {
+ Name string `xml:"name"`
+ Value string `xml:"value"`
+}
diff --git a/pkg/util/util.go b/pkg/util/util.go
index 4ab515f..542e7cf 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -18,14 +18,14 @@ limitations under the License.
package util
import (
+ "bytes"
+ "encoding/xml"
"os"
"os/signal"
"path"
"regexp"
"syscall"
- "github.com/magiconair/properties"
-
"github.com/scylladb/go-set/strset"
corev1 "k8s.io/api/core/v1"
@@ -104,8 +104,24 @@ func WaitForSignal(sig chan os.Signal, exit func(int)) {
}()
}
+// EncodeXML --
+func EncodeXML(content interface{}) ([]byte, error) {
+ w := &bytes.Buffer{}
+ w.WriteString(xml.Header)
+
+ e := xml.NewEncoder(w)
+ e.Indent("", " ")
+
+ err := e.Encode(content)
+ if err != nil {
+ return []byte{}, err
+ }
+
+ return w.Bytes(), nil
+}
+
// WriteFileWithContent --
-func WriteFileWithContent(buildDir string, relativePath string, content string) error {
+func WriteFileWithContent(buildDir string, relativePath string, content []byte) error {
filePath := path.Join(buildDir, relativePath)
fileDir := path.Dir(filePath)
// Create dir if not present
@@ -120,13 +136,23 @@ func WriteFileWithContent(buildDir string, relativePath string, content string)
}
defer file.Close()
- _, err = file.WriteString(content)
+ _, err = file.Write(content)
if err != nil {
return errors.Wrap(err, "could not write to file "+relativePath)
}
return nil
}
+// WriteFileWithBytesMarshallerContent --
+func WriteFileWithBytesMarshallerContent(buildDir string, relativePath string, content BytesMarshaller) error {
+ data, err := content.MarshalBytes()
+ if err != nil {
+ return err
+ }
+
+ return WriteFileWithContent(buildDir, relativePath, data)
+}
+
// LookupEnvVar --
func LookupEnvVar(vars []corev1.EnvVar, name string) *corev1.EnvVar {
for _, e := range vars {
@@ -156,40 +182,17 @@ func FindAllDistinctStringSubmatch(data string, regexps ...*regexp.Regexp) []str
return submatchs.List()
}
-// ExtractApplicationPropertiesString --
-func ExtractApplicationPropertiesString(data map[string]string, consumer func(string, string)) error {
- pstr, ok := data["application.properties"]
- if !ok {
- return nil
- }
-
- p, err := properties.LoadString(pstr)
- if err != nil {
- return err
- }
-
- for _, k := range p.Keys() {
- consumer(k, p.MustGet(k))
+// FileExists --
+func FileExists(name string) (bool, error) {
+ info, err := os.Stat(name)
+ if os.IsNotExist(err) {
+ return false, nil
}
- return nil
+ return !info.IsDir(), err
}
-// ExtractApplicationPropertiesBytes --
-func ExtractApplicationPropertiesBytes(data map[string][]byte, consumer func(string, string)) error {
- pstr, ok := data["application.properties"]
- if !ok {
- return nil
- }
-
- p, err := properties.Load(pstr, properties.UTF8)
- if err != nil {
- return err
- }
-
- for _, k := range p.Keys() {
- consumer(k, p.MustGet(k))
- }
-
- return nil
+// MarshalBytes --
+type BytesMarshaller interface {
+ MarshalBytes() ([]byte, error)
}