This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit b209832bf4e3c4df45ed917c44d654b51489519b Author: Claus Ibsen <[email protected]> AuthorDate: Sun Jun 26 15:10:38 2022 +0200 CAMEL-18171: camel-kubernetes - Add secret/configmap property placeholder function. Use configurer to avoid reflection. --- components/camel-kubernetes/pom.xml | 49 +++ .../client/ConfigFluentImplConfigurer.java | 370 +++++++++++++++++++++ .../io.fabric8.kubernetes.client.ConfigBuilder | 2 + .../properties/BasePropertiesFunction.java | 28 +- .../properties/KubernetesClientConfigureTest.java | 8 +- 5 files changed, 453 insertions(+), 4 deletions(-) diff --git a/components/camel-kubernetes/pom.xml b/components/camel-kubernetes/pom.xml index eeb56522e43..0bf54b52e92 100644 --- a/components/camel-kubernetes/pom.xml +++ b/components/camel-kubernetes/pom.xml @@ -147,4 +147,53 @@ <scope>test</scope> </dependency> </dependencies> + + <build> + <plugins> + <plugin> + <!-- we need to generate additional configurer classes --> + <groupId>org.apache.camel</groupId> + <artifactId>camel-package-maven-plugin</artifactId> + <executions> + <execution> + <id>generate-configurer</id> + <phase>process-classes</phase> + <goals> + <goal>generate-configurer</goal> + </goals> + <configuration> + <discoverClasses>false</discoverClasses> + <allowBuilderPattern>true</allowBuilderPattern> + <skipDeprecated>true</skipDeprecated> + <classes>io.fabric8.kubernetes.client.ConfigBuilder=io.fabric8.kubernetes.client.ConfigFluentImpl</classes> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + <goal>add-resource</goal> + </goals> + <configuration> + <sources> + <source>src/generated/java</source> + </sources> + <resources> + <resource> + <directory>src/generated/resources</directory> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </project> diff --git a/components/camel-kubernetes/src/generated/java/io/fabric8/kubernetes/client/ConfigFluentImplConfigurer.java b/components/camel-kubernetes/src/generated/java/io/fabric8/kubernetes/client/ConfigFluentImplConfigurer.java new file mode 100644 index 00000000000..28da60102d1 --- /dev/null +++ b/components/camel-kubernetes/src/generated/java/io/fabric8/kubernetes/client/ConfigFluentImplConfigurer.java @@ -0,0 +1,370 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package io.fabric8.kubernetes.client; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import io.fabric8.kubernetes.client.ConfigBuilder; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class ConfigFluentImplConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + io.fabric8.kubernetes.client.ConfigBuilder target = (io.fabric8.kubernetes.client.ConfigBuilder) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiversion": + case "ApiVersion": target.withApiVersion(property(camelContext, java.lang.String.class, value)); return true; + case "authprovider": + case "AuthProvider": target.withAuthProvider(property(camelContext, io.fabric8.kubernetes.api.model.AuthProviderConfig.class, value)); return true; + case "cacertdata": + case "CaCertData": target.withCaCertData(property(camelContext, java.lang.String.class, value)); return true; + case "cacertfile": + case "CaCertFile": target.withCaCertFile(property(camelContext, java.lang.String.class, value)); return true; + case "clientcertdata": + case "ClientCertData": target.withClientCertData(property(camelContext, java.lang.String.class, value)); return true; + case "clientcertfile": + case "ClientCertFile": target.withClientCertFile(property(camelContext, java.lang.String.class, value)); return true; + case "clientkeyalgo": + case "ClientKeyAlgo": target.withClientKeyAlgo(property(camelContext, java.lang.String.class, value)); return true; + case "clientkeydata": + case "ClientKeyData": target.withClientKeyData(property(camelContext, java.lang.String.class, value)); return true; + case "clientkeyfile": + case "ClientKeyFile": target.withClientKeyFile(property(camelContext, java.lang.String.class, value)); return true; + case "clientkeypassphrase": + case "ClientKeyPassphrase": target.withClientKeyPassphrase(property(camelContext, java.lang.String.class, value)); return true; + case "connectiontimeout": + case "ConnectionTimeout": target.withConnectionTimeout(property(camelContext, int.class, value)); return true; + case "contexts": + case "Contexts": target.withContexts(property(camelContext, java.util.List.class, value)); return true; + case "currentcontext": + case "CurrentContext": target.withCurrentContext(property(camelContext, io.fabric8.kubernetes.api.model.NamedContext.class, value)); return true; + case "customheaders": + case "CustomHeaders": target.withCustomHeaders(property(camelContext, java.util.Map.class, value)); return true; + case "disablehostnameverification": + case "DisableHostnameVerification": target.withDisableHostnameVerification(property(camelContext, boolean.class, value)); return true; + case "errormessages": + case "ErrorMessages": target.withErrorMessages(property(camelContext, java.util.Map.class, value)); return true; + case "http2disable": + case "Http2Disable": target.withHttp2Disable(property(camelContext, boolean.class, value)); return true; + case "httpproxy": + case "HttpProxy": target.withHttpProxy(property(camelContext, java.lang.String.class, value)); return true; + case "httpsproxy": + case "HttpsProxy": target.withHttpsProxy(property(camelContext, java.lang.String.class, value)); return true; + case "impersonateextras": + case "ImpersonateExtras": target.withImpersonateExtras(property(camelContext, java.util.Map.class, value)); return true; + case "impersonategroup": + case "ImpersonateGroup": target.withImpersonateGroup(property(camelContext, java.lang.String.class, value)); return true; + case "impersonategroups": + case "ImpersonateGroups": target.withImpersonateGroups(property(camelContext, java.lang.String[].class, value)); return true; + case "impersonateusername": + case "ImpersonateUsername": target.withImpersonateUsername(property(camelContext, java.lang.String.class, value)); return true; + case "keystorefile": + case "KeyStoreFile": target.withKeyStoreFile(property(camelContext, java.lang.String.class, value)); return true; + case "keystorepassphrase": + case "KeyStorePassphrase": target.withKeyStorePassphrase(property(camelContext, java.lang.String.class, value)); return true; + case "logginginterval": + case "LoggingInterval": target.withLoggingInterval(property(camelContext, int.class, value)); return true; + case "masterurl": + case "MasterUrl": target.withMasterUrl(property(camelContext, java.lang.String.class, value)); return true; + case "maxconcurrentrequests": + case "MaxConcurrentRequests": target.withMaxConcurrentRequests(property(camelContext, int.class, value)); return true; + case "maxconcurrentrequestsperhost": + case "MaxConcurrentRequestsPerHost": target.withMaxConcurrentRequestsPerHost(property(camelContext, int.class, value)); return true; + case "namespace": + case "Namespace": target.withNamespace(property(camelContext, java.lang.String.class, value)); return true; + case "noproxy": + case "NoProxy": target.withNoProxy(property(camelContext, java.lang.String[].class, value)); return true; + case "oauthtoken": + case "OauthToken": target.withOauthToken(property(camelContext, java.lang.String.class, value)); return true; + case "oauthtokenprovider": + case "OauthTokenProvider": target.withOauthTokenProvider(property(camelContext, io.fabric8.kubernetes.client.OAuthTokenProvider.class, value)); return true; + case "password": + case "Password": target.withPassword(property(camelContext, java.lang.String.class, value)); return true; + case "proxypassword": + case "ProxyPassword": target.withProxyPassword(property(camelContext, java.lang.String.class, value)); return true; + case "proxyusername": + case "ProxyUsername": target.withProxyUsername(property(camelContext, java.lang.String.class, value)); return true; + case "requestretrybackoffinterval": + case "RequestRetryBackoffInterval": target.withRequestRetryBackoffInterval(property(camelContext, int.class, value)); return true; + case "requestretrybackofflimit": + case "RequestRetryBackoffLimit": target.withRequestRetryBackoffLimit(property(camelContext, int.class, value)); return true; + case "requesttimeout": + case "RequestTimeout": target.withRequestTimeout(property(camelContext, int.class, value)); return true; + case "rollingtimeout": + case "RollingTimeout": target.withRollingTimeout(property(camelContext, long.class, value)); return true; + case "scaletimeout": + case "ScaleTimeout": target.withScaleTimeout(property(camelContext, long.class, value)); return true; + case "tlsversions": + case "TlsVersions": target.withTlsVersions(property(camelContext, io.fabric8.kubernetes.client.http.TlsVersion[].class, value)); return true; + case "trustcerts": + case "TrustCerts": target.withTrustCerts(property(camelContext, boolean.class, value)); return true; + case "truststorefile": + case "TrustStoreFile": target.withTrustStoreFile(property(camelContext, java.lang.String.class, value)); return true; + case "truststorepassphrase": + case "TrustStorePassphrase": target.withTrustStorePassphrase(property(camelContext, java.lang.String.class, value)); return true; + case "uploadconnectiontimeout": + case "UploadConnectionTimeout": target.withUploadConnectionTimeout(property(camelContext, int.class, value)); return true; + case "uploadrequesttimeout": + case "UploadRequestTimeout": target.withUploadRequestTimeout(property(camelContext, int.class, value)); return true; + case "useragent": + case "UserAgent": target.withUserAgent(property(camelContext, java.lang.String.class, value)); return true; + case "username": + case "Username": target.withUsername(property(camelContext, java.lang.String.class, value)); return true; + case "watchreconnectinterval": + case "WatchReconnectInterval": target.withWatchReconnectInterval(property(camelContext, int.class, value)); return true; + case "watchreconnectlimit": + case "WatchReconnectLimit": target.withWatchReconnectLimit(property(camelContext, int.class, value)); return true; + case "websocketpinginterval": + case "WebsocketPingInterval": target.withWebsocketPingInterval(property(camelContext, long.class, value)); return true; + case "websockettimeout": + case "WebsocketTimeout": target.withWebsocketTimeout(property(camelContext, long.class, value)); return true; + default: return false; + } + } + + @Override + public Class<?> getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiversion": + case "ApiVersion": return java.lang.String.class; + case "authprovider": + case "AuthProvider": return io.fabric8.kubernetes.api.model.AuthProviderConfig.class; + case "cacertdata": + case "CaCertData": return java.lang.String.class; + case "cacertfile": + case "CaCertFile": return java.lang.String.class; + case "clientcertdata": + case "ClientCertData": return java.lang.String.class; + case "clientcertfile": + case "ClientCertFile": return java.lang.String.class; + case "clientkeyalgo": + case "ClientKeyAlgo": return java.lang.String.class; + case "clientkeydata": + case "ClientKeyData": return java.lang.String.class; + case "clientkeyfile": + case "ClientKeyFile": return java.lang.String.class; + case "clientkeypassphrase": + case "ClientKeyPassphrase": return java.lang.String.class; + case "connectiontimeout": + case "ConnectionTimeout": return int.class; + case "contexts": + case "Contexts": return java.util.List.class; + case "currentcontext": + case "CurrentContext": return io.fabric8.kubernetes.api.model.NamedContext.class; + case "customheaders": + case "CustomHeaders": return java.util.Map.class; + case "disablehostnameverification": + case "DisableHostnameVerification": return boolean.class; + case "errormessages": + case "ErrorMessages": return java.util.Map.class; + case "http2disable": + case "Http2Disable": return boolean.class; + case "httpproxy": + case "HttpProxy": return java.lang.String.class; + case "httpsproxy": + case "HttpsProxy": return java.lang.String.class; + case "impersonateextras": + case "ImpersonateExtras": return java.util.Map.class; + case "impersonategroup": + case "ImpersonateGroup": return java.lang.String.class; + case "impersonategroups": + case "ImpersonateGroups": return java.lang.String[].class; + case "impersonateusername": + case "ImpersonateUsername": return java.lang.String.class; + case "keystorefile": + case "KeyStoreFile": return java.lang.String.class; + case "keystorepassphrase": + case "KeyStorePassphrase": return java.lang.String.class; + case "logginginterval": + case "LoggingInterval": return int.class; + case "masterurl": + case "MasterUrl": return java.lang.String.class; + case "maxconcurrentrequests": + case "MaxConcurrentRequests": return int.class; + case "maxconcurrentrequestsperhost": + case "MaxConcurrentRequestsPerHost": return int.class; + case "namespace": + case "Namespace": return java.lang.String.class; + case "noproxy": + case "NoProxy": return java.lang.String[].class; + case "oauthtoken": + case "OauthToken": return java.lang.String.class; + case "oauthtokenprovider": + case "OauthTokenProvider": return io.fabric8.kubernetes.client.OAuthTokenProvider.class; + case "password": + case "Password": return java.lang.String.class; + case "proxypassword": + case "ProxyPassword": return java.lang.String.class; + case "proxyusername": + case "ProxyUsername": return java.lang.String.class; + case "requestretrybackoffinterval": + case "RequestRetryBackoffInterval": return int.class; + case "requestretrybackofflimit": + case "RequestRetryBackoffLimit": return int.class; + case "requesttimeout": + case "RequestTimeout": return int.class; + case "rollingtimeout": + case "RollingTimeout": return long.class; + case "scaletimeout": + case "ScaleTimeout": return long.class; + case "tlsversions": + case "TlsVersions": return io.fabric8.kubernetes.client.http.TlsVersion[].class; + case "trustcerts": + case "TrustCerts": return boolean.class; + case "truststorefile": + case "TrustStoreFile": return java.lang.String.class; + case "truststorepassphrase": + case "TrustStorePassphrase": return java.lang.String.class; + case "uploadconnectiontimeout": + case "UploadConnectionTimeout": return int.class; + case "uploadrequesttimeout": + case "UploadRequestTimeout": return int.class; + case "useragent": + case "UserAgent": return java.lang.String.class; + case "username": + case "Username": return java.lang.String.class; + case "watchreconnectinterval": + case "WatchReconnectInterval": return int.class; + case "watchreconnectlimit": + case "WatchReconnectLimit": return int.class; + case "websocketpinginterval": + case "WebsocketPingInterval": return long.class; + case "websockettimeout": + case "WebsocketTimeout": return long.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + io.fabric8.kubernetes.client.ConfigBuilder target = (io.fabric8.kubernetes.client.ConfigBuilder) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiversion": + case "ApiVersion": return target.getApiVersion(); + case "authprovider": + case "AuthProvider": return target.getAuthProvider(); + case "cacertdata": + case "CaCertData": return target.getCaCertData(); + case "cacertfile": + case "CaCertFile": return target.getCaCertFile(); + case "clientcertdata": + case "ClientCertData": return target.getClientCertData(); + case "clientcertfile": + case "ClientCertFile": return target.getClientCertFile(); + case "clientkeyalgo": + case "ClientKeyAlgo": return target.getClientKeyAlgo(); + case "clientkeydata": + case "ClientKeyData": return target.getClientKeyData(); + case "clientkeyfile": + case "ClientKeyFile": return target.getClientKeyFile(); + case "clientkeypassphrase": + case "ClientKeyPassphrase": return target.getClientKeyPassphrase(); + case "connectiontimeout": + case "ConnectionTimeout": return target.getConnectionTimeout(); + case "contexts": + case "Contexts": return target.getContexts(); + case "currentcontext": + case "CurrentContext": return target.getCurrentContext(); + case "customheaders": + case "CustomHeaders": return target.getCustomHeaders(); + case "disablehostnameverification": + case "DisableHostnameVerification": return target.isDisableHostnameVerification(); + case "errormessages": + case "ErrorMessages": return target.getErrorMessages(); + case "http2disable": + case "Http2Disable": return target.isHttp2Disable(); + case "httpproxy": + case "HttpProxy": return target.getHttpProxy(); + case "httpsproxy": + case "HttpsProxy": return target.getHttpsProxy(); + case "impersonateextras": + case "ImpersonateExtras": return target.getImpersonateExtras(); + case "impersonategroup": + case "ImpersonateGroup": return target.getImpersonateGroup(); + case "impersonategroups": + case "ImpersonateGroups": return target.getImpersonateGroups(); + case "impersonateusername": + case "ImpersonateUsername": return target.getImpersonateUsername(); + case "keystorefile": + case "KeyStoreFile": return target.getKeyStoreFile(); + case "keystorepassphrase": + case "KeyStorePassphrase": return target.getKeyStorePassphrase(); + case "logginginterval": + case "LoggingInterval": return target.getLoggingInterval(); + case "masterurl": + case "MasterUrl": return target.getMasterUrl(); + case "maxconcurrentrequests": + case "MaxConcurrentRequests": return target.getMaxConcurrentRequests(); + case "maxconcurrentrequestsperhost": + case "MaxConcurrentRequestsPerHost": return target.getMaxConcurrentRequestsPerHost(); + case "namespace": + case "Namespace": return target.getNamespace(); + case "noproxy": + case "NoProxy": return target.getNoProxy(); + case "oauthtoken": + case "OauthToken": return target.getOauthToken(); + case "oauthtokenprovider": + case "OauthTokenProvider": return target.getOauthTokenProvider(); + case "password": + case "Password": return target.getPassword(); + case "proxypassword": + case "ProxyPassword": return target.getProxyPassword(); + case "proxyusername": + case "ProxyUsername": return target.getProxyUsername(); + case "requestretrybackoffinterval": + case "RequestRetryBackoffInterval": return target.getRequestRetryBackoffInterval(); + case "requestretrybackofflimit": + case "RequestRetryBackoffLimit": return target.getRequestRetryBackoffLimit(); + case "requesttimeout": + case "RequestTimeout": return target.getRequestTimeout(); + case "rollingtimeout": + case "RollingTimeout": return target.getRollingTimeout(); + case "scaletimeout": + case "ScaleTimeout": return target.getScaleTimeout(); + case "tlsversions": + case "TlsVersions": return target.getTlsVersions(); + case "trustcerts": + case "TrustCerts": return target.isTrustCerts(); + case "truststorefile": + case "TrustStoreFile": return target.getTrustStoreFile(); + case "truststorepassphrase": + case "TrustStorePassphrase": return target.getTrustStorePassphrase(); + case "uploadconnectiontimeout": + case "UploadConnectionTimeout": return target.getUploadConnectionTimeout(); + case "uploadrequesttimeout": + case "UploadRequestTimeout": return target.getUploadRequestTimeout(); + case "useragent": + case "UserAgent": return target.getUserAgent(); + case "username": + case "Username": return target.getUsername(); + case "watchreconnectinterval": + case "WatchReconnectInterval": return target.getWatchReconnectInterval(); + case "watchreconnectlimit": + case "WatchReconnectLimit": return target.getWatchReconnectLimit(); + case "websocketpinginterval": + case "WebsocketPingInterval": return target.getWebsocketPingInterval(); + case "websockettimeout": + case "WebsocketTimeout": return target.getWebsocketTimeout(); + default: return null; + } + } + + @Override + public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "contexts": + case "Contexts": return io.fabric8.kubernetes.api.model.NamedContext.class; + default: return null; + } + } +} + diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/io.fabric8.kubernetes.client.ConfigBuilder b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/io.fabric8.kubernetes.client.ConfigBuilder new file mode 100644 index 00000000000..4126dfff367 --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/io.fabric8.kubernetes.client.ConfigBuilder @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=io.fabric8.kubernetes.client.ConfigFluentImplConfigurer diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java index 9b670086ec6..227ae01ed49 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/properties/BasePropertiesFunction.java @@ -29,8 +29,10 @@ import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.ExtendedCamelContext; import org.apache.camel.spi.PropertiesComponent; import org.apache.camel.spi.PropertiesFunction; +import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.PropertyBindingSupport; import org.apache.camel.support.service.ServiceSupport; @@ -87,15 +89,30 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti k -> k.replace("camel.kubernetes-client.", "").replace("camel.kubernetesClient.", "")); if (!properties.isEmpty()) { ConfigBuilder config = new ConfigBuilder(); + + PropertyConfigurer configurer = camelContext.adapt(ExtendedCamelContext.class) + .getConfigurerResolver().resolvePropertyConfigurer(ConfigBuilder.class.getName(), camelContext); + + // use copy to keep track of which options was configureed or not + OrderedLocationProperties copy = new OrderedLocationProperties(); + copy.putAll(properties); + PropertyBindingSupport.build() - .withProperties((Map) properties) + .withProperties((Map) copy) .withFluentBuilder(true) .withIgnoreCase(true) - .withReflection(true) + .withReflection(false) + .withConfigurer(configurer) .withTarget(config) .withCamelContext(camelContext) - .withRemoveParameters(false) + .withRemoveParameters(true) .bind(); + if (!copy.isEmpty()) { + // some options were not possible to configure + for (var e : copy.entrySet()) { + properties.remove(e.getKey()); + } + } client = new DefaultKubernetesClient(config.build()); LOG.info("Auto-configuration KubernetesClient summary"); for (var entry : properties.entrySet()) { @@ -108,6 +125,11 @@ abstract class BasePropertiesFunction extends ServiceSupport implements Properti LOG.info(" {} {}={}", loc, k, v); } } + if (!copy.isEmpty()) { + for (var e : copy.entrySet()) { + LOG.warn("Property not auto-configured: camel.kubernetes-client.{}={}", e.getKey(), e.getValue()); + }; + } } else { // create a default client to use client = new DefaultKubernetesClient(); diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/KubernetesClientConfigureTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/KubernetesClientConfigureTest.java index 664a3d14c11..0c6efad34af 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/KubernetesClientConfigureTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/properties/KubernetesClientConfigureTest.java @@ -20,7 +20,9 @@ import java.util.Map; import io.fabric8.kubernetes.client.ConfigBuilder; import org.apache.camel.CamelContext; +import org.apache.camel.ExtendedCamelContext; import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.support.PropertyBindingSupport; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -33,11 +35,15 @@ public class KubernetesClientConfigureTest { context.start(); ConfigBuilder config = new ConfigBuilder(); + + PropertyConfigurer configurer = context.adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(ConfigBuilder.class.getName(), context); + Assertions.assertNotNull(configurer, "Cannot find generated configurer"); + PropertyBindingSupport.build() .withProperties(Map.of("masterUrl", "http://localhost:1234")) .withFluentBuilder(true) .withIgnoreCase(true) - .withReflection(true) + .withConfigurer(configurer) .withTarget(config) .withCamelContext(context) .withRemoveParameters(false)
