From 8f7b1a650047c029a9425e27a264ea3bb561259d Mon Sep 17 00:00:00 2001 From: Gaelle Fournier Date: Wed, 23 Aug 2023 17:38:49 +0200 Subject: [PATCH] Set builder profiles trait as a mutiple value --- config/crd/bases/camel.apache.org_builds.yaml | 87 ++++---- .../camel.apache.org_integrationkits.yaml | 22 +- ...camel.apache.org_integrationplatforms.yaml | 210 +++++++++--------- .../bases/camel.apache.org_integrations.yaml | 22 +- .../camel.apache.org_kameletbindings.yaml | 8 +- config/crd/bases/camel.apache.org_pipes.yaml | 8 +- .../ROOT/partials/apis/camel-k-crds.adoc | 10 +- docs/modules/traits/pages/builder.adoc | 6 +- e2e/common/traits/builder_test.go | 17 +- helm/camel-k/crds/crd-build.yaml | 87 ++++---- helm/camel-k/crds/crd-integration-kit.yaml | 22 +- .../crds/crd-integration-platform.yaml | 210 +++++++++--------- helm/camel-k/crds/crd-integration.yaml | 22 +- helm/camel-k/crds/crd-kamelet-binding.yaml | 8 +- helm/camel-k/crds/crd-pipe.yaml | 8 +- pkg/apis/camel/v1/maven_types.go | 2 +- pkg/apis/camel/v1/trait/builder.go | 4 +- .../camel/v1/trait/zz_generated.deepcopy.go | 5 + pkg/apis/camel/v1/zz_generated.deepcopy.go | 8 +- pkg/builder/project.go | 26 ++- .../camel/v1/mavenbuildspec.go | 15 +- .../applyconfiguration/camel/v1/mavenspec.go | 17 +- pkg/trait/builder.go | 23 +- pkg/trait/builder_test.go | 25 ++- pkg/util/maven/maven_project.go | 4 +- resources/traits.yaml | 8 +- 26 files changed, 494 insertions(+), 390 deletions(-) diff --git a/config/crd/bases/camel.apache.org_builds.yaml b/config/crd/bases/camel.apache.org_builds.yaml index dea33d7179..d5fff8964e 100644 --- a/config/crd/bases/camel.apache.org_builds.yaml +++ b/config/crd/bases/camel.apache.org_builds.yaml @@ -310,50 +310,53 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml index d34ca382cb..d286bf52f1 100644 --- a/config/crd/bases/camel.apache.org_integrationkits.yaml +++ b/config/crd/bases/camel.apache.org_integrationkits.yaml @@ -211,16 +211,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml index 15b266e547..9bd66b9174 100644 --- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml +++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml @@ -202,48 +202,51 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string @@ -511,16 +514,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) @@ -1914,48 +1919,51 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string @@ -2271,16 +2279,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml index efdff886e1..c9ff396736 100644 --- a/config/crd/bases/camel.apache.org_integrations.yaml +++ b/config/crd/bases/camel.apache.org_integrations.yaml @@ -6194,16 +6194,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml index fc14f54afc..69c4fecb81 100644 --- a/config/crd/bases/camel.apache.org_kameletbindings.yaml +++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml @@ -6469,8 +6469,8 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with @@ -6479,7 +6479,9 @@ spec: name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).' - type: string + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml index 9ceecf4736..165d7dcd01 100644 --- a/config/crd/bases/camel.apache.org_pipes.yaml +++ b/config/crd/bases/camel.apache.org_pipes.yaml @@ -6466,8 +6466,8 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with @@ -6476,7 +6476,9 @@ spec: name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).' - type: string + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc index 5eb016eec0..1db2f63eab 100644 --- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc +++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc @@ -3837,8 +3837,8 @@ map[string]string The Maven properties. -|`profile` + -*xref:#_camel_apache_org_v1_ValueSource[ValueSource]* +|`profiles` + +*xref:#_camel_apache_org_v1_ValueSource[[\]ValueSource]* | @@ -5451,12 +5451,12 @@ string When using `pod` strategy, the maximum amount of memory required by the pod builder. -|`mavenProfile` + -string +|`mavenProfiles` + +[]string | -A reference pointing to a configmap/secret that contains a maven profile. +A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with `` that will be integrated as an inline profile in the POM. Syntax: [configmap{vbar}secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml). diff --git a/docs/modules/traits/pages/builder.adoc b/docs/modules/traits/pages/builder.adoc index b9d9edf599..891bd196df 100755 --- a/docs/modules/traits/pages/builder.adoc +++ b/docs/modules/traits/pages/builder.adoc @@ -60,9 +60,9 @@ The following configuration options are available: | string | When using `pod` strategy, the maximum amount of memory required by the pod builder. -| builder.maven-profile -| string -| A reference pointing to a configmap/secret that contains a maven profile. +| builder.maven-profiles +| []string +| A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with `` that will be integrated as an inline profile in the POM. Syntax: [configmap\|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml). diff --git a/e2e/common/traits/builder_test.go b/e2e/common/traits/builder_test.go index c1e9ed492a..795b2abd33 100644 --- a/e2e/common/traits/builder_test.go +++ b/e2e/common/traits/builder_test.go @@ -229,12 +229,15 @@ func TestBuilderTrait(t *testing.T) { t.Run("Run maven profile", func(t *testing.T) { name := "java-maven-profile" - mavenProfileCm := newMavenProfileConfigMap(ns, "maven-profile", "owasp-profile") - Expect(TestClient().Create(TestContext, mavenProfileCm)).To(Succeed()) + mavenProfile1Cm := newMavenProfileConfigMap(ns, "maven-profile-owasp", "owasp-profile") + Expect(TestClient().Create(TestContext, mavenProfile1Cm)).To(Succeed()) + mavenProfile2Cm := newMavenProfileConfigMap(ns, "maven-profile-dependency", "dependency-profile") + Expect(TestClient().Create(TestContext, mavenProfile2Cm)).To(Succeed()) Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name, - "-t", "builder.maven-profile=configmap:maven-profile/owasp-profile", + "-t", "builder.maven-profiles=configmap:maven-profile-owasp/owasp-profile", + "-t", "builder.maven-profiles=configmap:maven-profile-dependency/dependency-profile", "-t", "builder.tasks=custom1;alpine;cat maven/pom.xml", "-t", "builder.strategy=pod", ).Execute()).To(Succeed()) @@ -260,10 +263,12 @@ func TestBuilderTrait(t *testing.T) { TestTimeoutShort).Should(ContainSubstring("")) // Check logs - Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`owasp-dependency-check`)) + Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`owasp-profile`)) + Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`dependency-profile`)) Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed()) - Expect(TestClient().Delete(TestContext, mavenProfileCm)).To(Succeed()) + Expect(TestClient().Delete(TestContext, mavenProfile1Cm)).To(Succeed()) + Expect(TestClient().Delete(TestContext, mavenProfile2Cm)).To(Succeed()) }) } @@ -280,7 +285,7 @@ func newMavenProfileConfigMap(ns, name, key string) *corev1.ConfigMap { Data: map[string]string{ key: fmt.Sprintf(` - owasp-dependency-check + ` + key + ` diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml index dea33d7179..d5fff8964e 100644 --- a/helm/camel-k/crds/crd-build.yaml +++ b/helm/camel-k/crds/crd-build.yaml @@ -310,50 +310,53 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml index d34ca382cb..d286bf52f1 100644 --- a/helm/camel-k/crds/crd-integration-kit.yaml +++ b/helm/camel-k/crds/crd-integration-kit.yaml @@ -211,16 +211,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml index 15b266e547..9bd66b9174 100644 --- a/helm/camel-k/crds/crd-integration-platform.yaml +++ b/helm/camel-k/crds/crd-integration-platform.yaml @@ -202,48 +202,51 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string @@ -511,16 +514,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) @@ -1914,48 +1919,51 @@ spec: localRepository: description: The path of the local Maven repository. type: string - profile: + profiles: description: A reference to the ConfigMap or Secret key that contains the Maven profile. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - secretKeyRef: - description: Selects a key of a secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object + items: + description: ValueSource -- + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + secretKeyRef: + description: Selects a key of a secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + type: object + type: array properties: additionalProperties: type: string @@ -2271,16 +2279,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml index efdff886e1..c9ff396736 100644 --- a/helm/camel-k/crds/crd-integration.yaml +++ b/helm/camel-k/crds/crd-integration.yaml @@ -6194,16 +6194,18 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret that - contains a maven profile. The content of the maven profile - is expected to be a text containing a valid maven profile - starting with `` and ending with `` that - will be integrated as an inline profile in the POM. Syntax: - [configmap|secret]:name[/key], where name represents the - resource name, key optionally represents the resource key - to be filtered (default key value = profile.xml).' - type: string + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets + that contains a maven profile. The content of the maven + profile is expected to be a text containing a valid maven + profile starting with `` and ending with `` + that will be integrated as an inline profile in the POM. + Syntax: [configmap|secret]:name[/key], where name represents + the resource name, key optionally represents the resource + key to be filtered (default key value = profile.xml).' + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml index fc14f54afc..69c4fecb81 100644 --- a/helm/camel-k/crds/crd-kamelet-binding.yaml +++ b/helm/camel-k/crds/crd-kamelet-binding.yaml @@ -6469,8 +6469,8 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with @@ -6479,7 +6479,9 @@ spec: name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).' - type: string + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml index 9ceecf4736..165d7dcd01 100644 --- a/helm/camel-k/crds/crd-pipe.yaml +++ b/helm/camel-k/crds/crd-pipe.yaml @@ -6466,8 +6466,8 @@ spec: description: When using `pod` strategy, the maximum amount of memory required by the pod builder. type: string - mavenProfile: - description: 'A reference pointing to a configmap/secret + mavenProfiles: + description: 'A list of references pointing to configmaps/secrets that contains a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with @@ -6476,7 +6476,9 @@ spec: name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).' - type: string + items: + type: string + type: array orderStrategy: description: The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential) diff --git a/pkg/apis/camel/v1/maven_types.go b/pkg/apis/camel/v1/maven_types.go index 66101d2026..0650279e3e 100644 --- a/pkg/apis/camel/v1/maven_types.go +++ b/pkg/apis/camel/v1/maven_types.go @@ -31,7 +31,7 @@ type MavenSpec struct { Properties map[string]string `json:"properties,omitempty"` // A reference to the ConfigMap or Secret key that contains // the Maven profile. - Profile ValueSource `json:"profile,omitempty"` + Profiles []ValueSource `json:"profiles,omitempty"` // A reference to the ConfigMap or Secret key that contains // the Maven settings. Settings ValueSource `json:"settings,omitempty"` diff --git a/pkg/apis/camel/v1/trait/builder.go b/pkg/apis/camel/v1/trait/builder.go index dd4fa05c7e..166975c3bb 100644 --- a/pkg/apis/camel/v1/trait/builder.go +++ b/pkg/apis/camel/v1/trait/builder.go @@ -39,10 +39,10 @@ type BuilderTrait struct { LimitCPU string `property:"limit-cpu" json:"limitCPU,omitempty"` // When using `pod` strategy, the maximum amount of memory required by the pod builder. LimitMemory string `property:"limit-memory" json:"limitMemory,omitempty"` - // A reference pointing to a configmap/secret that contains a maven profile. + // A list of references pointing to configmaps/secrets that contains a maven profile. // The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with `` that will be integrated as an inline profile in the POM. // Syntax: [configmap|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml). - MavenProfile string `property:"maven-profile" json:"mavenProfile,omitempty"` + MavenProfiles []string `property:"maven-profiles" json:"mavenProfiles,omitempty"` // A list of tasks to be executed (available only when using `pod` strategy) with format ;; Tasks []string `property:"tasks" json:"tasks,omitempty"` } diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go index bad665a54c..0371733701 100644 --- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go +++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go @@ -64,6 +64,11 @@ func (in *BuilderTrait) DeepCopyInto(out *BuilderTrait) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.MavenProfiles != nil { + in, out := &in.MavenProfiles, &out.MavenProfiles + *out = make([]string, len(*in)) + copy(*out, *in) + } if in.Tasks != nil { in, out := &in.Tasks, &out.Tasks *out = make([]string, len(*in)) diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go index e1e5783895..cc0853d904 100644 --- a/pkg/apis/camel/v1/zz_generated.deepcopy.go +++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go @@ -2000,7 +2000,13 @@ func (in *MavenSpec) DeepCopyInto(out *MavenSpec) { (*out)[key] = val } } - in.Profile.DeepCopyInto(&out.Profile) + if in.Profiles != nil { + in, out := &in.Profiles, &out.Profiles + *out = make([]ValueSource, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } in.Settings.DeepCopyInto(&out.Settings) in.SettingsSecurity.DeepCopyInto(&out.SettingsSecurity) if in.CASecrets != nil { diff --git a/pkg/builder/project.go b/pkg/builder/project.go index ab6c8baf78..e31e25a56b 100644 --- a/pkg/builder/project.go +++ b/pkg/builder/project.go @@ -41,7 +41,7 @@ func init() { Project.GenerateProjectSettings, Project.InjectDependencies, Project.SanitizeDependencies, - Project.InjectProfile, + Project.InjectProfiles, } } @@ -51,7 +51,7 @@ type projectSteps struct { GenerateProjectSettings Step InjectDependencies Step SanitizeDependencies Step - InjectProfile Step + InjectProfiles Step CommonSteps []Step } @@ -62,7 +62,7 @@ var Project = projectSteps{ GenerateProjectSettings: NewStep(ProjectGenerationPhase+1, generateProjectSettings), InjectDependencies: NewStep(ProjectGenerationPhase+2, injectDependencies), SanitizeDependencies: NewStep(ProjectGenerationPhase+3, sanitizeDependencies), - InjectProfile: NewStep(ProjectGenerationPhase+4, injectProfile), + InjectProfiles: NewStep(ProjectGenerationPhase+4, injectProfiles), } func cleanUpBuildDir(ctx *builderContext) error { @@ -195,13 +195,19 @@ func sanitizeDependencies(ctx *builderContext) error { return camel.SanitizeIntegrationDependencies(ctx.Maven.Project.Dependencies) } -func injectProfile(ctx *builderContext) error { - val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &ctx.Build.Maven.Profile) - if err != nil { - return err - } - if val != "" { - ctx.Maven.Project.AddProfile(val) +func injectProfiles(ctx *builderContext) error { + if ctx.Build.Maven.Profiles != nil { + profiles := "" + for _, profile := range ctx.Build.Maven.Profiles { + val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &profile) + if err != nil { + return err + } + if val != "" { + profiles += val + } + } + ctx.Maven.Project.AddProfiles(profiles) } return nil } diff --git a/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go b/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go index 52528bcf87..6fec4f0205 100644 --- a/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go +++ b/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go @@ -59,11 +59,16 @@ func (b *MavenBuildSpecApplyConfiguration) WithProperties(entries map[string]str return b } -// WithProfile sets the Profile field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Profile field is set to the value of the last call. -func (b *MavenBuildSpecApplyConfiguration) WithProfile(value *ValueSourceApplyConfiguration) *MavenBuildSpecApplyConfiguration { - b.Profile = value +// WithProfiles adds the given value to the Profiles field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Profiles field. +func (b *MavenBuildSpecApplyConfiguration) WithProfiles(values ...*ValueSourceApplyConfiguration) *MavenBuildSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithProfiles") + } + b.Profiles = append(b.Profiles, *values[i]) + } return b } diff --git a/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go b/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go index b73c97f279..c8e833f5c0 100644 --- a/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go +++ b/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go @@ -28,7 +28,7 @@ import ( type MavenSpecApplyConfiguration struct { LocalRepository *string `json:"localRepository,omitempty"` Properties map[string]string `json:"properties,omitempty"` - Profile *ValueSourceApplyConfiguration `json:"profile,omitempty"` + Profiles []ValueSourceApplyConfiguration `json:"profiles,omitempty"` Settings *ValueSourceApplyConfiguration `json:"settings,omitempty"` SettingsSecurity *ValueSourceApplyConfiguration `json:"settingsSecurity,omitempty"` CASecrets []corev1.SecretKeySelector `json:"caSecrets,omitempty"` @@ -64,11 +64,16 @@ func (b *MavenSpecApplyConfiguration) WithProperties(entries map[string]string) return b } -// WithProfile sets the Profile field in the declarative configuration to the given value -// and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Profile field is set to the value of the last call. -func (b *MavenSpecApplyConfiguration) WithProfile(value *ValueSourceApplyConfiguration) *MavenSpecApplyConfiguration { - b.Profile = value +// WithProfiles adds the given value to the Profiles field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Profiles field. +func (b *MavenSpecApplyConfiguration) WithProfiles(values ...*ValueSourceApplyConfiguration) *MavenSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithProfiles") + } + b.Profiles = append(b.Profiles, *values[i]) + } return b } diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go index c9fc315c2b..16bc17cd54 100644 --- a/pkg/trait/builder.go +++ b/pkg/trait/builder.go @@ -285,14 +285,25 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) { } // User provides a maven profile - if t.MavenProfile != "" { - mavenProfile, err := v1.DecodeValueSource(t.MavenProfile, "profile.xml", - "illegal profile definition, syntax: configmap|secret:resource-name[/profile path]") - if err != nil { - return nil, fmt.Errorf("invalid maven profile: %s: %w. ", t.MavenProfile, err) + if t.MavenProfiles != nil { + mavenProfiles := make([]v1.ValueSource, 0) + for _, v := range t.MavenProfiles { + if v != "" { + // TODO parametrize message with input + mavenProfile, err := v1.DecodeValueSource(v, "profile.xml", + "illegal profile definition, syntax: configmap|secret:resource-name[/profile path]") + if err != nil { + return nil, fmt.Errorf("invalid maven profile: %s: %w. ", v, err) + } + mavenProfiles = append(mavenProfiles, mavenProfile) + } } - task.Maven.Profile = mavenProfile + task.Maven.Profiles = mavenProfiles } + // add jib profile + /*if e.Platform.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyJib { + t.L.Info("GFO - You should add jib profile") + }*/ steps := make([]builder.Step, 0) steps = append(steps, builder.Project.CommonSteps...) diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go index 95702bbc80..4ccd434d68 100644 --- a/pkg/trait/builder_test.go +++ b/pkg/trait/builder_test.go @@ -255,10 +255,10 @@ func findCustomTaskByName(tasks []v1.Task, name string) v1.Task { return v1.Task{} } -func TestMavenProfileBuilderTrait(t *testing.T) { +func TestMavenProfilesBuilderTrait(t *testing.T) { env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine) builderTrait := createNominalBuilderTraitTest() - builderTrait.MavenProfile = "configmap:maven-profile/owasp-profile.xml" + builderTrait.MavenProfiles = []string{"configmap:maven-profile/owasp-profile.xml", "secret:maven-profile-secret"} err := builderTrait.Apply(env) @@ -271,5 +271,24 @@ func TestMavenProfileBuilderTrait(t *testing.T) { }, Key: "owasp-profile.xml", }, - }, env.Pipeline[0].Builder.Maven.MavenSpec.Profile) + }, env.Pipeline[0].Builder.Maven.MavenSpec.Profiles[0]) + assert.Equal(t, v1.ValueSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "maven-profile-secret", + }, + Key: "profile.xml", + }, + }, env.Pipeline[0].Builder.Maven.MavenSpec.Profiles[1]) +} + +func TestInvalidMavenProfilesBuilderTrait(t *testing.T) { + env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine) + builderTrait := createNominalBuilderTraitTest() + builderTrait.MavenProfiles = []string{"fakeprofile"} + + err := builderTrait.Apply(env) + + assert.NotNil(t, err) + } diff --git a/pkg/util/maven/maven_project.go b/pkg/util/maven/maven_project.go index 4a75003f4f..7eba8f0d08 100644 --- a/pkg/util/maven/maven_project.go +++ b/pkg/util/maven/maven_project.go @@ -152,8 +152,8 @@ func (p *Project) AddEncodedDependencyExclusion(gav string, exclusion Exclusion) } } -func (p *Project) AddProfile(profile string) { - p.Profiles = ProfilesContent{InnerXML: profile} +func (p *Project) AddProfiles(profiles string) { + p.Profiles = ProfilesContent{InnerXML: profiles} } // NewDependency creates an new dependency from the given GAV. diff --git a/resources/traits.yaml b/resources/traits.yaml index 6e57c10c65..64b2a0e0e6 100755 --- a/resources/traits.yaml +++ b/resources/traits.yaml @@ -232,10 +232,10 @@ traits: type: string description: When using `pod` strategy, the maximum amount of memory required by the pod builder. - - name: maven-profile - type: string - description: 'A reference pointing to a configmap/secret that contains a maven - profile. The content of the maven profile is expected to be a text containing + - name: maven-profiles + type: '[]string' + description: 'A list of references pointing to configmaps/secrets that contains + a maven profile. The content of the maven profile is expected to be a text containing a valid maven profile starting with `` and ending with `` that will be integrated as an inline profile in the POM. Syntax: [configmap|secret]:name[/key], where name represents the resource name, key optionally represents the resource