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

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


The following commit(s) were added to refs/heads/main by this push:
     new 9c25b06  Alow fixed custom labels in any pod
9c25b06 is described below

commit 9c25b066fdfc9f1dcbc8c7c032e33c0eebb586c1
Author: Claudio Miranda <clau...@claudius.com.br>
AuthorDate: Thu Sep 16 19:34:47 2021 -0300

    Alow fixed custom labels in any pod
    
    Fix for #2642
---
 go.mod                       |  10 ++--
 go.sum                       |  24 +++++++++
 pkg/trait/cron.go            |   5 +-
 pkg/trait/deployment.go      |   5 +-
 pkg/trait/knative_service.go |   5 +-
 pkg/util/label/label.go      |  68 ++++++++++++++++++++++++++
 pkg/util/label/label_test.go | 113 +++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 216 insertions(+), 14 deletions(-)

diff --git a/go.mod b/go.mod
index d221227..e37fd3c 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
        github.com/apache/camel-k/pkg/kamelet/repository v0.0.0
        github.com/container-tools/spectrum v0.3.4
        github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e // 
indirect
-       github.com/evanphx/json-patch v4.9.0+incompatible
+       github.com/evanphx/json-patch v4.11.0+incompatible
        github.com/fatih/structs v1.1.0
        github.com/gertd/go-pluralize v0.1.1
        github.com/go-logr/logr v0.4.0
@@ -40,7 +40,7 @@ require (
        github.com/spf13/pflag v1.0.5
        github.com/spf13/viper v1.7.0
        github.com/stoewer/go-strcase v1.2.0
-       github.com/stretchr/testify v1.6.1
+       github.com/stretchr/testify v1.7.0
        go.uber.org/multierr v1.6.0
        go.uber.org/zap v1.16.0
        golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78
@@ -48,11 +48,11 @@ require (
        gopkg.in/yaml.v2 v2.4.0
        k8s.io/api v0.20.2
        k8s.io/apiextensions-apiserver v0.20.2
-       k8s.io/apimachinery v0.20.2
-       k8s.io/client-go v0.20.2
+       k8s.io/apimachinery v0.22.2
        k8s.io/cli-runtime v0.20.2
+       k8s.io/client-go v0.20.2
        k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027
-       k8s.io/klog/v2 v2.8.0
+       k8s.io/klog/v2 v2.9.0
        k8s.io/utils v0.0.0-20210111153108-fddb29f9d009
        knative.dev/eventing v0.23.2
        knative.dev/pkg v0.0.0-20210510175900-4564797bf3b7
diff --git a/go.sum b/go.sum
index e5a95da..5a27915 100644
--- a/go.sum
+++ b/go.sum
@@ -336,6 +336,8 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLi
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.9.0+incompatible 
h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.11.0+incompatible 
h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs=
+github.com/evanphx/json-patch v4.11.0+incompatible/go.mod 
h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0/go.mod 
h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA=
 github.com/fatih/set v0.2.1/go.mod 
h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI=
@@ -554,6 +556,8 @@ github.com/googleapis/gnostic v0.4.1/go.mod 
h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3i
 github.com/googleapis/gnostic v0.5.1/go.mod 
h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/googleapis/gnostic v0.5.3 
h1:2qsuRm+bzgwSIKikigPASa2GhW8H2Dn4Qq7UxD8K/48=
 github.com/googleapis/gnostic v0.5.3/go.mod 
h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ=
+github.com/googleapis/gnostic v0.5.5 
h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
+github.com/googleapis/gnostic v0.5.5/go.mod 
h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 github.com/gophercloud/gophercloud v0.1.0/go.mod 
h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 
h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod 
h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -645,6 +649,8 @@ github.com/json-iterator/go v1.1.8/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
 github.com/json-iterator/go v1.1.9/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.10 
h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 github.com/json-iterator/go v1.1.10/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 
h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
+github.com/json-iterator/go v1.1.11/go.mod 
h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod 
h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod 
h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible 
h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
@@ -724,6 +730,8 @@ github.com/mitchellh/osext 
v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQ
 github.com/mitchellh/reflectwalk v1.0.0/go.mod 
h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 
h1:cvy4lBOYN3gKfKj8Lzz5Q9TfviP+L7koMHY7SvkyTKs=
 github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309/go.mod 
h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
+github.com/moby/spdystream v0.2.0 
h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
+github.com/moby/spdystream v0.2.0/go.mod 
h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
 github.com/moby/sys/mountinfo v0.4.0/go.mod 
h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
 github.com/moby/sys/symlink v0.1.0/go.mod 
h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
 github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod 
h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
@@ -769,6 +777,7 @@ github.com/onsi/ginkgo v1.10.3/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/ginkgo v1.11.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod 
h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
 github.com/onsi/ginkgo v1.12.1/go.mod 
h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.0/go.mod 
h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
 github.com/onsi/ginkgo v1.14.1/go.mod 
h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
@@ -1002,6 +1011,8 @@ github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
 github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1 
h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0 
h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/subosito/gotenv v1.2.0 
h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod 
h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod 
h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -1207,6 +1218,8 @@ golang.org/x/net 
v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod 
h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d 
h1:BgJvlyh+UqCUaPlscHJ+PN8GcpfrFdr7NHjd1JL0+Gs=
 golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod 
h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 
h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE=
+golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1317,6 +1330,9 @@ golang.org/x/sys 
v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 
h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 
h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf 
h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1626,6 +1642,8 @@ k8s.io/apimachinery v0.19.7/go.mod 
h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6
 k8s.io/apimachinery v0.20.1/go.mod 
h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg=
 k8s.io/apimachinery v0.20.2/go.mod 
h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
+k8s.io/apimachinery v0.22.2 h1:ejz6y/zNma8clPVfNDLnPbleBo6MpoFy/HBiBqCouVk=
+k8s.io/apimachinery v0.22.2/go.mod 
h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
 k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I=
 k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
 k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg=
@@ -1688,6 +1706,8 @@ k8s.io/klog/v2 v2.5.0 
h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI=
 k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts=
 k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
+k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
+k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod 
h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
 k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod 
h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod 
h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
@@ -1697,6 +1717,8 @@ k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f 
h1:ZcWbnalfwIst131Zff7dGd
 k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f/go.mod 
h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 
h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod 
h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
+k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e 
h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM=
+k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod 
h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8=
 k8s.io/kubernetes v1.13.0/go.mod 
h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/legacy-cloud-providers v0.17.4/go.mod 
h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js=
@@ -1749,6 +1771,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.2 
h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhY
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod 
h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0 
h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod 
h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.2 
h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod 
h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/pkg/trait/cron.go b/pkg/trait/cron.go
index c82fe39..9828a58 100644
--- a/pkg/trait/cron.go
+++ b/pkg/trait/cron.go
@@ -32,6 +32,7 @@ import (
        "github.com/apache/camel-k/pkg/metadata"
        "github.com/apache/camel-k/pkg/util"
        "github.com/apache/camel-k/pkg/util/kubernetes"
+       "github.com/apache/camel-k/pkg/util/label"
        "github.com/apache/camel-k/pkg/util/uri"
 )
 
@@ -289,9 +290,7 @@ func (t *cronTrait) getCronJobFor(e *Environment) 
*v1beta1.CronJob {
                                Spec: batchv1.JobSpec{
                                        Template: corev1.PodTemplateSpec{
                                                ObjectMeta: metav1.ObjectMeta{
-                                                       Labels: 
map[string]string{
-                                                               
v1.IntegrationLabel: e.Integration.Name,
-                                                       },
+                                                       Labels:      
label.AddLabels(e.Integration.Name),
                                                        Annotations: 
annotations,
                                                },
                                                Spec: corev1.PodSpec{
diff --git a/pkg/trait/deployment.go b/pkg/trait/deployment.go
index 34369fb..997dd33 100644
--- a/pkg/trait/deployment.go
+++ b/pkg/trait/deployment.go
@@ -25,6 +25,7 @@ import (
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+       "github.com/apache/camel-k/pkg/util/label"
 )
 
 // The Deployment trait is responsible for generating the Kubernetes 
deployment that will make sure
@@ -150,9 +151,7 @@ func (t *deploymentTrait) getDeploymentFor(e *Environment) 
*appsv1.Deployment {
                        },
                        Template: corev1.PodTemplateSpec{
                                ObjectMeta: metav1.ObjectMeta{
-                                       Labels: map[string]string{
-                                               v1.IntegrationLabel: 
e.Integration.Name,
-                                       },
+                                       Labels:      
label.AddLabels(e.Integration.Name),
                                        Annotations: annotations,
                                },
                                Spec: corev1.PodSpec{
diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go
index be620e1..e0b5cfe 100644
--- a/pkg/trait/knative_service.go
+++ b/pkg/trait/knative_service.go
@@ -29,6 +29,7 @@ import (
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/metadata"
        "github.com/apache/camel-k/pkg/util/kubernetes"
+       "github.com/apache/camel-k/pkg/util/label"
 )
 
 const (
@@ -258,9 +259,7 @@ func (t *knativeServiceTrait) getServiceFor(e *Environment) 
(*serving.Service, e
                        ConfigurationSpec: serving.ConfigurationSpec{
                                Template: serving.RevisionTemplateSpec{
                                        ObjectMeta: metav1.ObjectMeta{
-                                               Labels: map[string]string{
-                                                       v1.IntegrationLabel: 
e.Integration.Name,
-                                               },
+                                               Labels:      
label.AddLabels(e.Integration.Name),
                                                Annotations: annotations,
                                        },
                                        Spec: serving.RevisionSpec{
diff --git a/pkg/util/label/label.go b/pkg/util/label/label.go
new file mode 100644
index 0000000..671034e
--- /dev/null
+++ b/pkg/util/label/label.go
@@ -0,0 +1,68 @@
+/*
+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 label
+
+import (
+       "fmt"
+
+       v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+       "k8s.io/apimachinery/pkg/labels"
+)
+
+// The AdditionalLabels is a big string consisting of key=value, set at build 
time
+// when set are to be added to Deployments, CronJob and KNativeService whose 
pods
+// should expose these labels
+
+// AdditionalLabels are labels=values, they MUST be set as key=value separated 
by comma ,
+// example: myKey1=myValue1,myKey2=myValue2
+// Also it supports replacing a value for the integration name at runtime, 
just use the value as "token_integration_name"
+// example: myKey1=myValue1,myKey2=token_integration_name
+var AdditionalLabels = ""
+
+var FixedLabels = map[string]string{}
+
+// parses the labels early on and fail fast if there are errors
+func init() {
+       checkAdditionalLabels()
+}
+
+func checkAdditionalLabels() {
+       if len(AdditionalLabels) > 0 {
+               var err error
+               FixedLabels, err = 
labels.ConvertSelectorToLabelsMap(AdditionalLabels)
+               if err != nil {
+                       // as this should be used only in build time, it's ok 
to fail fast
+                       panic(fmt.Sprintf("Error parsing AdditionalLabels %s, 
Error: %s\n", AdditionalLabels, err))
+               }
+       }
+}
+
+// parses the AdditionalLabels variable and returns as map[string]string
+func AddLabels(integration string) map[string]string {
+       definitiveLabels := labels.Set{
+               v1.IntegrationLabel: integration,
+       }
+       for k, v := range FixedLabels {
+               if v == "token_integration_name" {
+                       definitiveLabels[k] = integration
+               } else {
+                       definitiveLabels[k] = v
+               }
+       }
+       return definitiveLabels
+}
diff --git a/pkg/util/label/label_test.go b/pkg/util/label/label_test.go
new file mode 100644
index 0000000..2169954
--- /dev/null
+++ b/pkg/util/label/label_test.go
@@ -0,0 +1,113 @@
+/*
+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 label
+
+import (
+       "testing"
+
+       v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+       "github.com/stretchr/testify/assert"
+)
+
+func TestParseValidEntries(t *testing.T) {
+       integration := "test1"
+       AdditionalLabels = "k1=v1,k3/k3.k3=v3.v3,k4.k4=v4,k5/k5=v5"
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels := AddLabels(integration)
+       expected := map[string]string{
+               v1.IntegrationLabel: integration,
+               "k1":                "v1",
+               "k3/k3.k3":          "v3.v3",
+               "k4.k4":             "v4",
+               "k5/k5":             "v5",
+       }
+       assert.Equal(t, expected, labels)
+
+       AdditionalLabels = "k1=v1"
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels = AddLabels(integration)
+       expected = map[string]string{
+               v1.IntegrationLabel: integration,
+               "k1":                "v1",
+       }
+       assert.Equal(t, expected, labels)
+}
+
+func TestParseEmptyAdditionalLabels(t *testing.T) {
+       integration := "test1"
+       AdditionalLabels = ""
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels := AddLabels(integration)
+       expected := map[string]string{
+               v1.IntegrationLabel: integration,
+       }
+       assert.Equal(t, expected, labels)
+}
+
+func TestParseInvalidEntry(t *testing.T) {
+       integration := "test1"
+       AdditionalLabels = "k1[=v1,k2)=v2,k@3=v3"
+       FixedLabels = map[string]string{}
+       assert.Panics(t, func() {
+               checkAdditionalLabels()
+               AddLabels(integration)
+       })
+}
+
+func TestParseIntegrationPlaceholder(t *testing.T) {
+       integration := "test1"
+       AdditionalLabels = 
"k1=token_integration_name,k2=v2,k3=v3,k4.k4=v4,k5/k5=v5,rht.subcomp_t=my_subcomp"
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels := AddLabels(integration)
+       expected := map[string]string{
+               v1.IntegrationLabel: integration,
+               "k1":                integration,
+               "k2":                "v2",
+               "k3":                "v3",
+               "k4.k4":             "v4",
+               "k5/k5":             "v5",
+               "rht.subcomp_t":     "my_subcomp",
+       }
+       assert.Equal(t, expected, labels)
+
+       AdditionalLabels = "k1=v1,k2=v2,k3=token_integration_name"
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels = AddLabels(integration)
+       expected = map[string]string{
+               v1.IntegrationLabel: integration,
+               "k1":                "v1",
+               "k2":                "v2",
+               "k3":                integration,
+       }
+       assert.Equal(t, expected, labels)
+
+       AdditionalLabels = "k3=token_integration_name"
+       FixedLabels = map[string]string{}
+       checkAdditionalLabels()
+       labels = AddLabels(integration)
+       expected = map[string]string{
+               v1.IntegrationLabel: integration,
+               "k3":                integration,
+       }
+       assert.Equal(t, expected, labels)
+}

Reply via email to