Skip to content

Commit

Permalink
Register all envoy extension to MessageMarshaller (#1008)
Browse files Browse the repository at this point in the history
  • Loading branch information
minwoox authored Aug 16, 2024
1 parent 93f839b commit 69bf18f
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 26 deletions.
12 changes: 12 additions & 0 deletions dependencies.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ proguard = "7.4.2"
protobuf = "3.25.1"
protobuf-gradle-plugin = "0.8.19"
quartz = "2.3.2"
reflections = "0.9.11"
shadow-gradle-plugin = "7.1.2"
shiro = "1.3.2"
slf4j1 = { strictly = "1.7.36" }
Expand Down Expand Up @@ -298,6 +299,9 @@ module = "ch.qos.logback:logback-classic"
version.ref = "logback15"
javadocs = "https://www.javadoc.io/doc/ch.qos.logback/logback-classic/1.5.4/"

[libraries.controlplane-api]
module = "io.envoyproxy.controlplane:api"
version.ref = "controlplane"
[libraries.controlplane-cache]
module = "io.envoyproxy.controlplane:cache"
version.ref = "controlplane"
Expand Down Expand Up @@ -343,6 +347,14 @@ version.ref = "protobuf-gradle-plugin"
module = "org.quartz-scheduler:quartz"
version.ref = "quartz"

[libraries.reflections]
module = "org.reflections:reflections"
version.ref = "reflections"
exclusions = [
"com.google.errorprone:error_prone_annotations",
"com.google.j2objc:j2objc-annotations",
"org.codehaus.mojo:animal-sniffer-annotations"]

[libraries.shadow-gradle-plugin]
module = "gradle.plugin.com.github.johnrengelman:shadow"
version.ref = "shadow-gradle-plugin"
Expand Down
2 changes: 2 additions & 0 deletions xds/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ dependencies {
implementation project(':server')

implementation libs.armeria.grpc
implementation libs.controlplane.api
implementation libs.controlplane.cache
implementation libs.controlplane.server
implementation libs.reflections

testImplementation libs.armeria.junit5
testImplementation libs.armeria.xds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,6 @@
import io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment;
import io.envoyproxy.envoy.config.listener.v3.Listener;
import io.envoyproxy.envoy.config.route.v3.RouteConfiguration;
import io.envoyproxy.envoy.extensions.filters.http.router.v3.Router;
import io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext;
import io.envoyproxy.envoy.service.discovery.v3.DeltaDiscoveryRequest;
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest;
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse;
Expand Down Expand Up @@ -174,13 +170,7 @@ private void init0(PluginInitContext pluginInitContext) {
.jsonMarshallerFactory(
serviceDescriptor -> GrpcJsonMarshaller
.builder()
//TODO(minwoox): Automate the registration of the extension messages.
.jsonMarshallerCustomizer(builder -> {
builder.register(HttpConnectionManager.getDefaultInstance())
.register(Router.getDefaultInstance())
.register(UpstreamTlsContext.getDefaultInstance())
.register(DownstreamTlsContext.getDefaultInstance());
})
.jsonMarshallerCustomizer(XdsResourceManager::registerEnvoyExtension)
.build(serviceDescriptor))
.enableHttpJsonTranscoding(true).build();
sb.service(xdsApplicationService, pluginInitContext.authService());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,18 @@
import static java.util.Objects.requireNonNull;

import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.regex.Pattern;

import org.curioswitch.common.protobuf.json.MessageMarshaller;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;

import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.Empty;
import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.Message;

import com.linecorp.centraldogma.common.Author;
Expand All @@ -44,10 +49,7 @@
import io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment;
import io.envoyproxy.envoy.config.listener.v3.Listener;
import io.envoyproxy.envoy.config.route.v3.RouteConfiguration;
import io.envoyproxy.envoy.extensions.filters.http.router.v3.Router;
import io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext;
import io.envoyproxy.envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext;
import io.grpc.Status;
import io.grpc.stub.StreamObserver;

Expand All @@ -56,19 +58,35 @@ public final class XdsResourceManager {
public static final String RESOURCE_ID_PATTERN_STRING = "[a-z](?:[a-z0-9-_/]*[a-z0-9])?";
public static final Pattern RESOURCE_ID_PATTERN = Pattern.compile('^' + RESOURCE_ID_PATTERN_STRING + '$');

//TODO(minwoox): Automate the registration of the extension message types.
public static final MessageMarshaller JSON_MESSAGE_MARSHALLER =
MessageMarshaller.builder().omittingInsignificantWhitespace(true)
.register(Listener.getDefaultInstance())
.register(Cluster.getDefaultInstance())
.register(ClusterLoadAssignment.getDefaultInstance())
.register(Router.getDefaultInstance())
// extensions
.register(RouteConfiguration.getDefaultInstance())
.register(HttpConnectionManager.getDefaultInstance())
.register(UpstreamTlsContext.getDefaultInstance())
.register(DownstreamTlsContext.getDefaultInstance())
.build();
registerEnvoyExtension(
MessageMarshaller.builder().omittingInsignificantWhitespace(true)
.register(Listener.getDefaultInstance())
.register(Cluster.getDefaultInstance())
.register(ClusterLoadAssignment.getDefaultInstance())
.register(RouteConfiguration.getDefaultInstance()))
.build();

public static MessageMarshaller.Builder registerEnvoyExtension(MessageMarshaller.Builder builder) {
final Reflections reflections = new Reflections(
"io.envoyproxy.envoy.extensions", HttpConnectionManager.class.getClassLoader(),
new SubTypesScanner(true));
reflections.getSubTypesOf(GeneratedMessageV3.class)
.stream()
.filter(c -> !c.getName().contains("$")) // exclude subclasses
.filter(XdsResourceManager::hasGetDefaultInstanceMethod)
.forEach(builder::register);
return builder;
}

private static boolean hasGetDefaultInstanceMethod(Class<?> clazz) {
try {
final Method method = clazz.getMethod("getDefaultInstance");
return method.getParameterCount() == 0 && Modifier.isStatic(method.getModifiers());
} catch (NoSuchMethodException ignored) {
return false;
}
}

public static String removePrefix(String prefix, String name) {
if (!name.startsWith(prefix)) {
Expand Down

0 comments on commit 69bf18f

Please sign in to comment.