From a1f023706f7d30eb42603cc0711561aefa93c8bc Mon Sep 17 00:00:00 2001 From: Summers Pittman Date: Mon, 8 Nov 2021 19:55:07 -0500 Subject: [PATCH] feat: service binding support for service registry with application services --- .../apicurio-registry-avro/deployment/pom.xml | 6 + ...viceRegistryBindingExtensionProcessor.java | 21 ++++ .../apicurio-registry-avro/runtime/pom.xml | 5 +- .../ServiceRegistryBindingConverter.java | 105 ++++++++++++++++++ ...ce.binding.runtime.ServiceBindingConverter | 1 + 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 extensions/apicurio-registry-avro/deployment/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingExtensionProcessor.java create mode 100644 extensions/apicurio-registry-avro/runtime/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingConverter.java create mode 100644 extensions/apicurio-registry-avro/runtime/src/main/resources/META-INF/services/io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter diff --git a/extensions/apicurio-registry-avro/deployment/pom.xml b/extensions/apicurio-registry-avro/deployment/pom.xml index e8bcbb53b9bc1e..283b2647ad4f65 100644 --- a/extensions/apicurio-registry-avro/deployment/pom.xml +++ b/extensions/apicurio-registry-avro/deployment/pom.xml @@ -23,6 +23,12 @@ io.quarkus quarkus-core-deployment + + + io.quarkus + quarkus-kubernetes-service-binding-deployment + + io.quarkus quarkus-avro-deployment diff --git a/extensions/apicurio-registry-avro/deployment/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingExtensionProcessor.java b/extensions/apicurio-registry-avro/deployment/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingExtensionProcessor.java new file mode 100644 index 00000000000000..c1835061bac21d --- /dev/null +++ b/extensions/apicurio-registry-avro/deployment/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingExtensionProcessor.java @@ -0,0 +1,21 @@ +package io.quarkus.apicurio.registry.avro.binding; + +import io.quarkus.apicurio.registry.binding.ServiceRegistryBindingConverter; +import io.quarkus.deployment.Capabilities; +import io.quarkus.deployment.Capability; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem; + +class ServiceRegistryBindingExtensionProcessor { + + @BuildStep + void registerServiceBinding(Capabilities capabilities, + BuildProducer serviceProvider) { + if (capabilities.isPresent(Capability.KUBERNETES_SERVICE_BINDING)) { + serviceProvider.produce( + new ServiceProviderBuildItem("io.quarkus.apicurio.registry.binding.ServiceRegistryBindingConverter", + ServiceRegistryBindingConverter.class.getName())); + } + } +} diff --git a/extensions/apicurio-registry-avro/runtime/pom.xml b/extensions/apicurio-registry-avro/runtime/pom.xml index a0ad9a498a8fea..55563041c92603 100644 --- a/extensions/apicurio-registry-avro/runtime/pom.xml +++ b/extensions/apicurio-registry-avro/runtime/pom.xml @@ -28,7 +28,10 @@ io.apicurio apicurio-common-rest-client-vertx - + + io.quarkus + quarkus-kubernetes-service-binding + io.quarkus quarkus-core diff --git a/extensions/apicurio-registry-avro/runtime/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingConverter.java b/extensions/apicurio-registry-avro/runtime/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingConverter.java new file mode 100644 index 00000000000000..5adb24f56200ea --- /dev/null +++ b/extensions/apicurio-registry-avro/runtime/src/main/java/io/quarkus/apicurio/registry/binding/ServiceRegistryBindingConverter.java @@ -0,0 +1,105 @@ +package io.quarkus.apicurio.registry.binding; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Logger; + +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.ConfigProvider; + +import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding; +import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource; +import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter; + +public class ServiceRegistryBindingConverter implements ServiceBindingConverter { + + private static Logger LOG = Logger.getLogger(ServiceRegistryBindingConverter.class.getName()); + + private static final String INCOMING_PREFIX = "mp.messaging.incoming."; + private static final String OUTGOING_PREFIX = "mp.messaging.outgoing."; + + @Override + public Optional convert(List serviceBindings) { + var matchingByType = ServiceBinding.singleMatchingByType("serviceregistry", serviceBindings); + Config config = ConfigProvider.getConfig(); + if (matchingByType.isEmpty()) { + return Optional.empty(); + } + + var binding = matchingByType.get(); + + List channels = extractChannels(config); + + Map properties = new HashMap<>(); + + String registryUrl = binding.getProperties().get("registryUrl"); + if (registryUrl == null) { + registryUrl = binding.getProperties().get("registryurl"); + } + if (registryUrl != null) { + properties.put("mp.messaging.connector.smallrye-kafka.apicurio.registry.url", registryUrl); + } + + for (String channel : channels) { + + String prefix = channel; + + String oAuthHost = binding.getProperties().get("oauthServerUrl"); + if (oAuthHost == null) { + oAuthHost = binding.getProperties().get("oauthserverurl"); + } + if (oAuthHost != null) { + properties.put(prefix + "apicurio.auth.service.url", oAuthHost); + } + + String clientId = binding.getProperties().get("clientId"); + if (clientId == null) { + clientId = binding.getProperties().get("clientid"); + } + if (clientId != null) { + properties.put(prefix + "apicurio.auth.client.id", clientId); + } + + String clientSecret = binding.getProperties().get("clientSecret"); + if (clientSecret == null) { + clientSecret = binding.getProperties().get("clientsecret"); + } + if (clientSecret != null) { + properties.put(prefix + "apicurio.auth.client.secret", clientSecret); + } + + String realm = binding.getProperties().get("oauthRealm"); + if (realm == null) { + realm = binding.getProperties().get("oauthRealm"); + } + if (clientSecret != null) { + properties.put(prefix + "apicurio.auth.realm", realm); + } + + if (registryUrl != null) { + properties.put(prefix + "apicurio.registry.url", registryUrl); + } + } + + return Optional.of(new ServiceBindingConfigSource("serviceregistry-k8s-service-binding-source", properties)); + } + + private List extractChannels(Config configIn) { + + var list = new ArrayList(); + + for (String propertyName : configIn.getPropertyNames()) { + if (propertyName.startsWith(INCOMING_PREFIX)) { + var channelName = propertyName.replace(INCOMING_PREFIX, "").split("\\.")[0]; + list.add(INCOMING_PREFIX + channelName + "."); + } else if (propertyName.startsWith(OUTGOING_PREFIX)) { + var channelName = propertyName.replace(OUTGOING_PREFIX, "").split("\\.")[0]; + list.add(OUTGOING_PREFIX + channelName + "."); + } + } + return list; + } +} diff --git a/extensions/apicurio-registry-avro/runtime/src/main/resources/META-INF/services/io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter b/extensions/apicurio-registry-avro/runtime/src/main/resources/META-INF/services/io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter new file mode 100644 index 00000000000000..e9f01713f3fde4 --- /dev/null +++ b/extensions/apicurio-registry-avro/runtime/src/main/resources/META-INF/services/io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter @@ -0,0 +1 @@ +io.quarkus.apicurio.registry.binding.ServiceRegistryBindingConverter \ No newline at end of file