diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc index f1cc0545e8..edb8c14087 100644 --- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc +++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc @@ -1322,6 +1322,37 @@ map[string]string the metadata of the loader +|=== + +[#_camel_apache_org_v1_CamelProperty] +=== CamelProperty + +*Appears on:* + +* <<#_camel_apache_org_v1_Capability, Capability>> + +CamelProperty represents a Camel property that may end up in an application.properties file. + +[cols="2,2a",options="header"] +|=== +|Field +|Description + +|`key` + +string +| + + + + +|`value` + +string +| + + + + + |=== [#_camel_apache_org_v1_CamelScheme] @@ -1423,14 +1454,14 @@ which are specified in the runtime catalog. List of required Maven dependencies |`runtimeProperties` + -map[string]string +*xref:#_camel_apache_org_v1_CamelProperty[[\]CamelProperty]* | Set of required Camel runtime properties |`buildTimeProperties` + -map[string]string +*xref:#_camel_apache_org_v1_CamelProperty[[\]CamelProperty]* | diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml index 9ccd0da7af..31635f79dd 100644 --- a/helm/camel-k/crds/crd-build.yaml +++ b/helm/camel-k/crds/crd-build.yaml @@ -660,11 +660,21 @@ spec: properties which are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -697,10 +707,20 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object @@ -1514,11 +1534,21 @@ spec: properties which are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -1551,10 +1581,20 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object diff --git a/helm/camel-k/crds/crd-camel-catalog.yaml b/helm/camel-k/crds/crd-camel-catalog.yaml index 99458fd96f..e76c6bb594 100644 --- a/helm/camel-k/crds/crd-camel-catalog.yaml +++ b/helm/camel-k/crds/crd-camel-catalog.yaml @@ -376,10 +376,19 @@ spec: are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel property + that may end up in an application.properties file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -412,10 +421,19 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel property + that may end up in an application.properties file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object diff --git a/pkg/apis/camel/v1/common_types.go b/pkg/apis/camel/v1/common_types.go index f441ec918e..d5af69100f 100644 --- a/pkg/apis/camel/v1/common_types.go +++ b/pkg/apis/camel/v1/common_types.go @@ -350,11 +350,17 @@ type Capability struct { // List of required Maven dependencies Dependencies []MavenArtifact `json:"dependencies,omitempty" yaml:"dependencies,omitempty"` // Set of required Camel runtime properties - RuntimeProperties map[string]string `json:"runtimeProperties,omitempty" yaml:"runtimeProperties,omitempty"` + RuntimeProperties []CamelProperty `json:"runtimeProperties,omitempty" yaml:"runtimeProperties,omitempty"` // Set of required Camel build time properties - BuildTimeProperties map[string]string `json:"buildTimeProperties,omitempty" yaml:"buildTimeProperties,omitempty"` + BuildTimeProperties []CamelProperty `json:"buildTimeProperties,omitempty" yaml:"buildTimeProperties,omitempty"` // Set of generic metadata - Metadata map[string]string `json:"metadata,omitempty" yaml:"Metadata,omitempty"` + Metadata map[string]string `json:"metadata,omitempty" yaml:"metadata,omitempty"` +} + +// CamelProperty represents a Camel property that may end up in an application.properties file. +type CamelProperty struct { + Key string `json:"key" yaml:"key"` + Value string `json:"value,omitempty" yaml:"value,omitempty"` } const ( diff --git a/pkg/apis/camel/v1/integrationkit_types_support.go b/pkg/apis/camel/v1/integrationkit_types_support.go index 6bcde2c037..c1c8d2a5f0 100644 --- a/pkg/apis/camel/v1/integrationkit_types_support.go +++ b/pkg/apis/camel/v1/integrationkit_types_support.go @@ -106,6 +106,17 @@ func (in *IntegrationKit) IsExternal() bool { return in.Labels[IntegrationKitTypeLabel] == IntegrationKitTypeExternal } +// HasCapability returns true if the Kit is enabled with such a capability. +func (in *IntegrationKit) HasCapability(capability string) bool { + for _, cap := range in.Spec.Capabilities { + if cap == capability { + return true + } + } + + return false +} + // GetCondition returns the condition with the provided type. func (in *IntegrationKitStatus) GetCondition(condType IntegrationKitConditionType) *IntegrationKitCondition { for i := range in.Conditions { diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go index 9113c57dfd..8d1e9dc134 100644 --- a/pkg/apis/camel/v1/zz_generated.deepcopy.go +++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go @@ -568,6 +568,21 @@ func (in *CamelLoader) DeepCopy() *CamelLoader { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CamelProperty) DeepCopyInto(out *CamelProperty) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CamelProperty. +func (in *CamelProperty) DeepCopy() *CamelProperty { + if in == nil { + return nil + } + out := new(CamelProperty) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CamelScheme) DeepCopyInto(out *CamelScheme) { *out = *in @@ -617,17 +632,13 @@ func (in *Capability) DeepCopyInto(out *Capability) { } if in.RuntimeProperties != nil { in, out := &in.RuntimeProperties, &out.RuntimeProperties - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } + *out = make([]CamelProperty, len(*in)) + copy(*out, *in) } if in.BuildTimeProperties != nil { in, out := &in.BuildTimeProperties, &out.BuildTimeProperties - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } + *out = make([]CamelProperty, len(*in)) + copy(*out, *in) } if in.Metadata != nil { in, out := &in.Metadata, &out.Metadata diff --git a/pkg/client/camel/applyconfiguration/camel/v1/camelproperty.go b/pkg/client/camel/applyconfiguration/camel/v1/camelproperty.go new file mode 100644 index 0000000000..a93d9ab6cc --- /dev/null +++ b/pkg/client/camel/applyconfiguration/camel/v1/camelproperty.go @@ -0,0 +1,49 @@ +/* +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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CamelPropertyApplyConfiguration represents an declarative configuration of the CamelProperty type for use +// with apply. +type CamelPropertyApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Value *string `json:"value,omitempty"` +} + +// CamelPropertyApplyConfiguration constructs an declarative configuration of the CamelProperty type for use with +// apply. +func CamelProperty() *CamelPropertyApplyConfiguration { + return &CamelPropertyApplyConfiguration{} +} + +// WithKey sets the Key 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 Key field is set to the value of the last call. +func (b *CamelPropertyApplyConfiguration) WithKey(value string) *CamelPropertyApplyConfiguration { + b.Key = &value + return b +} + +// WithValue sets the Value 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 Value field is set to the value of the last call. +func (b *CamelPropertyApplyConfiguration) WithValue(value string) *CamelPropertyApplyConfiguration { + b.Value = &value + return b +} diff --git a/pkg/client/camel/applyconfiguration/camel/v1/capability.go b/pkg/client/camel/applyconfiguration/camel/v1/capability.go index d6d3073b23..28b155f38b 100644 --- a/pkg/client/camel/applyconfiguration/camel/v1/capability.go +++ b/pkg/client/camel/applyconfiguration/camel/v1/capability.go @@ -23,8 +23,8 @@ package v1 // with apply. type CapabilityApplyConfiguration struct { Dependencies []MavenArtifactApplyConfiguration `json:"dependencies,omitempty"` - RuntimeProperties map[string]string `json:"runtimeProperties,omitempty"` - BuildTimeProperties map[string]string `json:"buildTimeProperties,omitempty"` + RuntimeProperties []CamelPropertyApplyConfiguration `json:"runtimeProperties,omitempty"` + BuildTimeProperties []CamelPropertyApplyConfiguration `json:"buildTimeProperties,omitempty"` Metadata map[string]string `json:"metadata,omitempty"` } @@ -47,30 +47,28 @@ func (b *CapabilityApplyConfiguration) WithDependencies(values ...*MavenArtifact return b } -// WithRuntimeProperties puts the entries into the RuntimeProperties field in the declarative configuration +// WithRuntimeProperties adds the given value to the RuntimeProperties field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the RuntimeProperties field, -// overwriting an existing map entries in RuntimeProperties field with the same key. -func (b *CapabilityApplyConfiguration) WithRuntimeProperties(entries map[string]string) *CapabilityApplyConfiguration { - if b.RuntimeProperties == nil && len(entries) > 0 { - b.RuntimeProperties = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.RuntimeProperties[k] = v +// If called multiple times, values provided by each call will be appended to the RuntimeProperties field. +func (b *CapabilityApplyConfiguration) WithRuntimeProperties(values ...*CamelPropertyApplyConfiguration) *CapabilityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRuntimeProperties") + } + b.RuntimeProperties = append(b.RuntimeProperties, *values[i]) } return b } -// WithBuildTimeProperties puts the entries into the BuildTimeProperties field in the declarative configuration +// WithBuildTimeProperties adds the given value to the BuildTimeProperties field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. -// If called multiple times, the entries provided by each call will be put on the BuildTimeProperties field, -// overwriting an existing map entries in BuildTimeProperties field with the same key. -func (b *CapabilityApplyConfiguration) WithBuildTimeProperties(entries map[string]string) *CapabilityApplyConfiguration { - if b.BuildTimeProperties == nil && len(entries) > 0 { - b.BuildTimeProperties = make(map[string]string, len(entries)) - } - for k, v := range entries { - b.BuildTimeProperties[k] = v +// If called multiple times, values provided by each call will be appended to the BuildTimeProperties field. +func (b *CapabilityApplyConfiguration) WithBuildTimeProperties(values ...*CamelPropertyApplyConfiguration) *CapabilityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithBuildTimeProperties") + } + b.BuildTimeProperties = append(b.BuildTimeProperties, *values[i]) } return b } diff --git a/pkg/client/camel/applyconfiguration/utils.go b/pkg/client/camel/applyconfiguration/utils.go index 737a3d5ebc..6632cd8230 100644 --- a/pkg/client/camel/applyconfiguration/utils.go +++ b/pkg/client/camel/applyconfiguration/utils.go @@ -68,6 +68,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &camelv1.CamelCatalogStatusApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("CamelLoader"): return &camelv1.CamelLoaderApplyConfiguration{} + case v1.SchemeGroupVersion.WithKind("CamelProperty"): + return &camelv1.CamelPropertyApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("CamelScheme"): return &camelv1.CamelSchemeApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("CamelSchemeScope"): diff --git a/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml b/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml index 9ccd0da7af..31635f79dd 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml @@ -660,11 +660,21 @@ spec: properties which are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -697,10 +707,20 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object @@ -1514,11 +1534,21 @@ spec: properties which are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -1551,10 +1581,20 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel + property that may end up in an application.properties + file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object diff --git a/pkg/resources/config/crd/bases/camel.apache.org_camelcatalogs.yaml b/pkg/resources/config/crd/bases/camel.apache.org_camelcatalogs.yaml index 99458fd96f..e76c6bb594 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_camelcatalogs.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_camelcatalogs.yaml @@ -376,10 +376,19 @@ spec: are specified in the runtime catalog. properties: buildTimeProperties: - additionalProperties: - type: string description: Set of required Camel build time properties - type: object + items: + description: CamelProperty represents a Camel property + that may end up in an application.properties file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array dependencies: description: List of required Maven dependencies items: @@ -412,10 +421,19 @@ spec: description: Set of generic metadata type: object runtimeProperties: - additionalProperties: - type: string description: Set of required Camel runtime properties - type: object + items: + description: CamelProperty represents a Camel property + that may end up in an application.properties file. + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array type: object description: features offered by this runtime type: object diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go index 85d152e47a..46690b28b2 100644 --- a/pkg/trait/trait_types.go +++ b/pkg/trait/trait_types.go @@ -22,6 +22,7 @@ import ( "fmt" "path" "path/filepath" + "regexp" "sort" "strings" @@ -51,6 +52,8 @@ const ( sourceCompressionAnnotation = "camel.apache.org/source.compression" ) +var capabilityDynamicProperty = regexp.MustCompile(`(\$\{([^}]*)\})`) + // Identifiable represent an identifiable type. type Identifiable interface { ID() ID @@ -727,3 +730,17 @@ func (e *Environment) getIntegrationContainerPort() *corev1.ContainerPort { return nil } + +// CapabilityPropertyKey returns the key or expand any variable provided in it. vars variable contain the +// possible dynamic values to use. +func CapabilityPropertyKey(camelPropertyKey string, vars map[string]string) string { + if capabilityDynamicProperty.MatchString(camelPropertyKey) && vars != nil { + match := capabilityDynamicProperty.FindStringSubmatch(camelPropertyKey) + if len(match) < 2 { + // Should not happen, but fallback to the key not expanded instead of panic if it comes to happen + return camelPropertyKey + } + return strings.ReplaceAll(camelPropertyKey, match[1], vars[match[2]]) + } + return camelPropertyKey +} diff --git a/pkg/trait/trait_types_test.go b/pkg/trait/trait_types_test.go index 75f5384f90..978487b741 100644 --- a/pkg/trait/trait_types_test.go +++ b/pkg/trait/trait_types_test.go @@ -154,3 +154,13 @@ func TestVolumeWithKeyOnly(t *testing.T) { assert.Equal(t, "SomeKey", items[0].Key) assert.Equal(t, "SomeKey", items[0].Path) } + +func TestCapabilityPropertyKey(t *testing.T) { + camelPropertyKeyStatic := CapabilityPropertyKey("quarkus.camel.cluster.kubernetes.resource-name", nil) + assert.Equal(t, "quarkus.camel.cluster.kubernetes.resource-name", camelPropertyKeyStatic) + vars := map[string]string{ + "camel.k.master.labelKey": "org.apache.camel/integration", + } + camelPropertyKeyDynamic := CapabilityPropertyKey(`quarkus.camel.cluster.kubernetes.labels."${camel.k.master.labelKey}"`, vars) + assert.Equal(t, `quarkus.camel.cluster.kubernetes.labels."org.apache.camel/integration"`, camelPropertyKeyDynamic) +}