From bc12a1eb66e00697c6f2d9463ae72019679c150a Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 3 Nov 2021 10:16:29 -0700 Subject: [PATCH 1/2] RELEASING.md: Individual OSSRH account is no longer needed Most of the OSSRH interactions are performed by a robot. --- RELEASING.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index f16cb37c3ad4..f2e37f312b42 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -10,19 +10,6 @@ We deploy GRPC to Maven Central under the following systems: Other systems may also work, but we haven't verified them. -Prerequisites -------------- - -### Set Up OSSRH Account - -If you haven't deployed artifacts to Maven Central before, you need to setup -your OSSRH (OSS Repository Hosting) account. -- Follow the instructions on [this - page](https://central.sonatype.org/pages/ossrh-guide.html) to set up an - account with OSSRH. - - You only need to create the account, not set up a new project - - Contact a gRPC maintainer to add your account after you have created it. - Common Variables ---------------- Many of the following commands expect release-specific variables to be set. Set From 93a77a78a9a1ee889bef4c1fcfb02be343c671d1 Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Wed, 3 Nov 2021 12:13:05 -0700 Subject: [PATCH 2/2] Revert "xds: add xds end to end interop test (#8618)" (#8656) This reverts commit 0000cba665c69958355b639474c7387d98afcc79. --- interop-testing/build.gradle | 8 - .../integration/AbstractXdsInteropTest.java | 337 ------------------ .../testing/integration/XdsInteropTest.java | 57 --- .../XdsTestControlPlaneService.java | 269 -------------- 4 files changed, 671 deletions(-) delete mode 100644 interop-testing/src/main/java/io/grpc/testing/integration/AbstractXdsInteropTest.java delete mode 100644 interop-testing/src/main/java/io/grpc/testing/integration/XdsInteropTest.java delete mode 100644 interop-testing/src/main/java/io/grpc/testing/integration/XdsTestControlPlaneService.java diff --git a/interop-testing/build.gradle b/interop-testing/build.gradle index ef7510c17238..944c0daab811 100644 --- a/interop-testing/build.gradle +++ b/interop-testing/build.gradle @@ -147,13 +147,6 @@ task xds_test_server(type: CreateStartScripts) { classpath = startScripts.classpath } -task xds_e2e_client(type: CreateStartScripts) { - mainClassName = "io.grpc.testing.integration.XdsInteropTest" - applicationName = "xds-e2e-test-client" - outputDir = new File(project.buildDir, 'tmp/scripts/' + name) - classpath = startScripts.classpath -} - applicationDistribution.into("bin") { from(test_client) from(test_server) @@ -164,7 +157,6 @@ applicationDistribution.into("bin") { from(grpclb_fallback_test_client) from(xds_test_client) from(xds_test_server) - from(xds_e2e_client) fileMode = 0755 } diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractXdsInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractXdsInteropTest.java deleted file mode 100644 index 0bd2318b0fc5..000000000000 --- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractXdsInteropTest.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright 2021 The gRPC Authors - * - * Licensed 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 io.grpc.testing.integration; - -import com.google.common.collect.ImmutableMap; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.protobuf.Any; -import com.google.protobuf.UInt32Value; -import io.grpc.Grpc; -import io.grpc.InsecureChannelCredentials; -import io.grpc.InsecureServerCredentials; -import io.grpc.ManagedChannel; -import io.grpc.NameResolverRegistry; -import io.grpc.Server; -import io.grpc.netty.NettyServerBuilder; -import io.grpc.xds.XdsNameResolverProvider; -import io.grpc.xds.XdsServerBuilder; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.cluster.v3.Cluster; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.Address; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.AggregatedConfigSource; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.ConfigSource; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.HealthStatus; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.SocketAddress; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.core.v3.TrafficDirection; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3.Endpoint; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3.LbEndpoint; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3.LocalityLbEndpoints; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.ApiListener; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.Filter; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.FilterChain; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.FilterChainMatch; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.Listener; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.NonForwardingAction; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.Route; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.RouteAction; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.RouteConfiguration; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.RouteMatch; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.VirtualHost; -import io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.http.router.v3.Router; -import io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager; -import io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter; -import io.grpc.xds.shaded.io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.Rds; - -import java.util.Collections; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Abstract base class for end-to-end xds tests. - * A local control plane is implemented in {@link XdsTestControlPlaneService}. - * Test cases can inject xds configs to the control plane for testing. - */ -public abstract class AbstractXdsInteropTest { - private static final Logger logger = Logger.getLogger(AbstractXdsInteropTest.class.getName()); - - protected static final int testServerPort = 8080; - private static final int controlPlaneServicePort = 443; - private Server server; - private Server controlPlane; - protected TestServiceGrpc.TestServiceBlockingStub blockingStub; - private ScheduledExecutorService executor; - private XdsNameResolverProvider nameResolverProvider; - private static final String scheme = "test-xds"; - private static final String serverHostName = "0.0.0.0:" + testServerPort; - private static final String SERVER_LISTENER_TEMPLATE = - "grpc/server?udpa.resource.listening_address=%s"; - private static final String rdsName = "route-config.googleapis.com"; - private static final String clusterName = "cluster0"; - private static final String edsName = "eds-service-0"; - private static final String HTTP_CONNECTION_MANAGER_TYPE_URL = - "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3" - + ".HttpConnectionManager"; - - private static final Map defaultClientBootstrapOverride = ImmutableMap.of( - "node", ImmutableMap.of( - "id", UUID.randomUUID().toString(), - "cluster", "cluster0"), - "xds_servers", Collections.singletonList( - ImmutableMap.of( - "server_uri", "localhost:" + controlPlaneServicePort, - "channel_creds", Collections.singletonList( - ImmutableMap.of("type", "insecure") - ), - "server_features", Collections.singletonList("xds_v3") - ) - ) - ); - - /** - * Provides default client bootstrap. - * A subclass test case should override this method if it tests client bootstrap. - */ - protected Map getClientBootstrapOverride() { - return defaultClientBootstrapOverride; - } - - private static final Map defaultServerBootstrapOverride = ImmutableMap.of( - "node", ImmutableMap.of( - "id", UUID.randomUUID().toString()), - "xds_servers", Collections.singletonList( - ImmutableMap.of( - "server_uri", "localhost:" + controlPlaneServicePort, - "channel_creds", Collections.singletonList( - ImmutableMap.of("type", "insecure") - ), - "server_features", Collections.singletonList("xds_v3") - ) - ), - "server_listener_resource_name_template", SERVER_LISTENER_TEMPLATE - ); - - /** - * Provides default server bootstrap. - * A subclass test case should override this method if it tests server bootstrap. - */ - protected Map getServerBootstrapOverride() { - return defaultServerBootstrapOverride; - } - - protected void setUp() throws Exception { - startControlPlane(); - startServer(); - nameResolverProvider = XdsNameResolverProvider.createForTest(scheme, - getClientBootstrapOverride()); - NameResolverRegistry.getDefaultRegistry().register(nameResolverProvider); - ManagedChannel channel = Grpc.newChannelBuilder(scheme + ":///" + serverHostName, - InsecureChannelCredentials.create()).build(); - blockingStub = TestServiceGrpc.newBlockingStub(channel); - } - - protected void tearDown() throws Exception { - if (server != null) { - server.shutdownNow(); - if (!server.awaitTermination(5, TimeUnit.SECONDS)) { - logger.log(Level.SEVERE, "Timed out waiting for server shutdown"); - } - } - if (controlPlane != null) { - controlPlane.shutdownNow(); - if (!controlPlane.awaitTermination(5, TimeUnit.SECONDS)) { - logger.log(Level.SEVERE, "Timed out waiting for server shutdown"); - } - } - if (executor != null) { - MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); - } - NameResolverRegistry.getDefaultRegistry().deregister(nameResolverProvider); - } - - protected void startServer() throws Exception { - executor = Executors.newSingleThreadScheduledExecutor(); - XdsServerBuilder serverBuilder = XdsServerBuilder.forPort( - testServerPort, InsecureServerCredentials.create()) - .addService(new TestServiceImpl(executor)) - .overrideBootstrapForTest(getServerBootstrapOverride()); - server = serverBuilder.build().start(); - } - - /** - * Provides default control plane xds configs. - * A subclass test case should override this method to inject control plane xds configs to verify - * end-to-end behavior. - */ - protected XdsTestControlPlaneService.XdsTestControlPlaneConfig getControlPlaneConfig() { - String tcpListenerName = SERVER_LISTENER_TEMPLATE.replaceAll("%s", serverHostName); - return new XdsTestControlPlaneService.XdsTestControlPlaneConfig( - Collections.singletonList(serverListener(tcpListenerName, serverHostName)), - Collections.singletonList(clientListener(serverHostName)), - Collections.singletonList(rds(serverHostName)), - Collections.singletonList(cds()), - Collections.singletonList(eds(testServerPort)) - ); - } - - private void startControlPlane() throws Exception { - XdsTestControlPlaneService.XdsTestControlPlaneConfig controlPlaneConfig = - getControlPlaneConfig(); - logger.log(Level.FINER, "Starting control plane with config: {0}", controlPlaneConfig); - XdsTestControlPlaneService controlPlaneService = new XdsTestControlPlaneService( - controlPlaneConfig); - NettyServerBuilder controlPlaneServerBuilder = - NettyServerBuilder.forPort(controlPlaneServicePort) - .addService(controlPlaneService); - controlPlane = controlPlaneServerBuilder.build().start(); - } - - /** - * A subclass test case should override this method to verify end-to-end behaviour. - */ - abstract void run(); - - private static Listener clientListener(String name) { - HttpFilter httpFilter = HttpFilter.newBuilder() - .setName("terminal-filter") - .setTypedConfig(Any.pack(Router.newBuilder().build())) - .setIsOptional(true) - .build(); - ApiListener apiListener = ApiListener.newBuilder().setApiListener(Any.pack( - HttpConnectionManager.newBuilder() - .setRds( - Rds.newBuilder() - .setRouteConfigName(rdsName) - .setConfigSource( - ConfigSource.newBuilder() - .setAds(AggregatedConfigSource.getDefaultInstance()))) - .addAllHttpFilters(Collections.singletonList(httpFilter)) - .build(), - HTTP_CONNECTION_MANAGER_TYPE_URL) - ).build(); - Listener listener = Listener.newBuilder() - .setName(name) - .setApiListener(apiListener).build(); - return listener; - } - - private static Listener serverListener(String name, String authority) { - HttpFilter routerFilter = HttpFilter.newBuilder() - .setName("terminal-filter") - .setTypedConfig( - Any.pack(Router.newBuilder().build())) - .setIsOptional(true) - .build(); - VirtualHost virtualHost = VirtualHost.newBuilder() - .setName("virtual-host-0") - .addDomains(authority) - .addRoutes( - Route.newBuilder() - .setMatch( - RouteMatch.newBuilder().setPrefix("/").build() - ) - .setNonForwardingAction(NonForwardingAction.newBuilder().build()) - .build() - ).build(); - RouteConfiguration routeConfig = RouteConfiguration.newBuilder() - .addVirtualHosts(virtualHost) - .build(); - Filter filter = Filter.newBuilder() - .setName("network-filter-0") - .setTypedConfig( - Any.pack( - HttpConnectionManager.newBuilder() - .setRouteConfig(routeConfig) - .addAllHttpFilters(Collections.singletonList(routerFilter)) - .build() - ) - ).build(); - FilterChainMatch filterChainMatch = FilterChainMatch.newBuilder() - .setSourceType(FilterChainMatch.ConnectionSourceType.ANY) - .build(); - FilterChain filterChain = FilterChain.newBuilder() - .setName("filter-chain-0") - .setFilterChainMatch(filterChainMatch) - .addFilters(filter) - .build(); - return Listener.newBuilder() - .setName(name) - .setTrafficDirection(TrafficDirection.INBOUND) - .addFilterChains(filterChain) - .build(); - } - - private static RouteConfiguration rds(String authority) { - VirtualHost virtualHost = VirtualHost.newBuilder() - .addDomains(authority) - .addRoutes( - Route.newBuilder() - .setMatch( - RouteMatch.newBuilder().setPrefix("/").build() - ) - .setRoute( - RouteAction.newBuilder().setCluster(clusterName).build() - ) - .build()) - .build(); - return RouteConfiguration.newBuilder().setName(rdsName).addVirtualHosts(virtualHost).build(); - } - - private static Cluster cds() { - return Cluster.newBuilder() - .setName(clusterName) - .setType(Cluster.DiscoveryType.EDS) - .setEdsClusterConfig( - Cluster.EdsClusterConfig.newBuilder() - .setServiceName(edsName) - .setEdsConfig( - ConfigSource.newBuilder() - .setAds(AggregatedConfigSource.newBuilder().build()) - .build()) - .build() - ) - .setLbPolicy(Cluster.LbPolicy.ROUND_ROBIN) - .build(); - } - - private static ClusterLoadAssignment eds(int port) { - Address address = Address.newBuilder() - .setSocketAddress( - SocketAddress.newBuilder().setAddress("0.0.0.0").setPortValue(port).build() - ) - .build(); - LocalityLbEndpoints endpoints = LocalityLbEndpoints.newBuilder() - .setLoadBalancingWeight(UInt32Value.of(10)) - .setPriority(0) - .addLbEndpoints( - LbEndpoint.newBuilder() - .setEndpoint( - Endpoint.newBuilder().setAddress(address).build()) - .setHealthStatus(HealthStatus.HEALTHY) - .build() - ) - .build(); - return ClusterLoadAssignment.newBuilder() - .setClusterName(edsName) - .addEndpoints(endpoints) - .build(); - } -} diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/XdsInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/XdsInteropTest.java deleted file mode 100644 index 410b65d37d98..000000000000 --- a/interop-testing/src/main/java/io/grpc/testing/integration/XdsInteropTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2021 The gRPC Authors - * - * Licensed 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 io.grpc.testing.integration; - -import static org.junit.Assert.assertEquals; - -import com.google.protobuf.ByteString; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class XdsInteropTest { - private static final Logger logger = Logger.getLogger(XdsInteropTest.class.getName()); - - /** - * The main application to run test cases. - */ - public static void main(String[] args) throws Exception { - AbstractXdsInteropTest testCase = new PingPong(); - testCase.setUp(); - try { - testCase.run(); - } finally { - testCase.tearDown(); - } - } - - private static class PingPong extends AbstractXdsInteropTest { - @Override - void run() { - Messages.SimpleRequest request = Messages.SimpleRequest.newBuilder() - .setResponseSize(3141) - .setPayload(Messages.Payload.newBuilder() - .setBody(ByteString.copyFrom(new byte[2728]))) - .build(); - Messages.SimpleResponse goldenResponse = Messages.SimpleResponse.newBuilder() - .setPayload(Messages.Payload.newBuilder() - .setBody(ByteString.copyFrom(new byte[3141]))) - .build(); - assertEquals(goldenResponse.getPayload(), blockingStub.unaryCall(request).getPayload()); - logger.log(Level.INFO, "success"); - } - } -} diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestControlPlaneService.java b/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestControlPlaneService.java deleted file mode 100644 index 06a4d2467c94..000000000000 --- a/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestControlPlaneService.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright 2021 The gRPC Authors - * - * Licensed 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 io.grpc.testing.integration; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.protobuf.Any; -import io.grpc.SynchronizationContext; -import io.grpc.stub.StreamObserver; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.cluster.v3.Cluster; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.endpoint.v3.ClusterLoadAssignment; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.listener.v3.Listener; -import io.grpc.xds.shaded.io.envoyproxy.envoy.config.route.v3.RouteConfiguration; -import io.grpc.xds.shaded.io.envoyproxy.envoy.service.discovery.v3.AggregatedDiscoveryServiceGrpc; -import io.grpc.xds.shaded.io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest; -import io.grpc.xds.shaded.io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class XdsTestControlPlaneService extends - AggregatedDiscoveryServiceGrpc.AggregatedDiscoveryServiceImplBase { - private static final Logger logger = Logger.getLogger(XdsInteropTest.class.getName()); - - private final SynchronizationContext syncContext = new SynchronizationContext( - new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - logger.log(Level.SEVERE, "Exception!" + e); - } - }); - - private static final String ADS_TYPE_URL_LDS = - "type.googleapis.com/envoy.config.listener.v3.Listener"; - private static final String ADS_TYPE_URL_RDS = - "type.googleapis.com/envoy.config.route.v3.RouteConfiguration"; - private static final String ADS_TYPE_URL_CDS = - "type.googleapis.com/envoy.config.cluster.v3.Cluster"; - private static final String ADS_TYPE_URL_EDS = - "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment"; - private final ImmutableMap ldsResources; - private final ImmutableMap rdsResources; - private final ImmutableMap cdsResources; - private final ImmutableMap edsResources; - private int ldsVersion = 1; - private int rdsVersion = 1; - private int cdsVersion = 1; - private int edsVersion = 1; - private int ldsNonce = 0; - private int rdsNonce = 0; - private int cdsNonce = 0; - private int edsNonce = 0; - - /** - * Create a control plane service for testing, with static xds configurations. - */ - public XdsTestControlPlaneService(XdsTestControlPlaneConfig config) { - Map ldsMap = new HashMap<>(); - for (Listener apiListener: config.apiListener) { - ldsMap.put(apiListener.getName(), apiListener); - } - for (Listener tcpListener: config.tcpListener) { - ldsMap.put(tcpListener.getName(), tcpListener); - } - this.ldsResources = ImmutableMap.copyOf(ldsMap); - - Map rdsMap = new HashMap<>(); - for (RouteConfiguration rds:config.rds) { - rdsMap.put(rds.getName(), rds); - } - this.rdsResources = ImmutableMap.copyOf(rdsMap); - - Map cdsMap = new HashMap<>(); - for (Cluster cds:config.cds) { - cdsMap.put(cds.getName(), cds); - } - this.cdsResources = ImmutableMap.copyOf(cdsMap); - - Map edsMap = new HashMap<>(); - for (ClusterLoadAssignment eds:config.eds) { - edsMap.put(eds.getClusterName(), eds); - } - this.edsResources = ImmutableMap.copyOf(edsMap); - logger.log(Level.FINER, "control plane config created. " - + "Dumping resources lds:{0},\nrds:{1},\ncds:{2},\neds:{3}", - new Object[]{ldsMap, rdsMap, cdsMap, edsMap}); - } - - public static class XdsTestControlPlaneConfig { - ImmutableList tcpListener; - ImmutableList apiListener; - ImmutableList rds; - ImmutableList cds; - ImmutableList eds; - - /** - * Provides control plane xds configurations. - */ - public XdsTestControlPlaneConfig(List tcpListener, - List apiListener, - List rds, - List cds, - List eds) { - this.tcpListener = ImmutableList.copyOf(tcpListener); - this.apiListener = ImmutableList.copyOf(apiListener); - this.rds = ImmutableList.copyOf(rds); - this.cds = ImmutableList.copyOf(cds); - this.eds = ImmutableList.copyOf(eds); - } - } - - @Override - public StreamObserver streamAggregatedResources( - final StreamObserver responseObserver) { - final StreamObserver requestObserver = - new StreamObserver() { - @Override - public void onNext(final DiscoveryRequest value) { - syncContext.execute(new Runnable() { - @Override - public void run() { - logger.log(Level.FINEST, "control plane received request {0}", value); - if (value.hasErrorDetail()) { - logger.log(Level.FINE, "control plane received nack resource {0}, error {1}", - new Object[]{value.getResourceNamesList(), value.getErrorDetail()}); - return; - } - if (value.getResourceNamesCount() <= 0) { - return; - } - switch (value.getTypeUrl()) { - case ADS_TYPE_URL_LDS: - if (!value.getResponseNonce().isEmpty() - && !String.valueOf(ldsNonce).equals(value.getResponseNonce())) { - logger.log(Level.FINE, "lds resource nonce does not match, ignore."); - return; - } - if (String.valueOf(ldsVersion).equals(value.getVersionInfo())) { - logger.log(Level.FINEST, "control plane received ack for lds resource: {0}", - value.getResourceNamesList()); - return; - } - DiscoveryResponse.Builder responseBuilder = DiscoveryResponse.newBuilder() - .setTypeUrl(ADS_TYPE_URL_LDS) - .setVersionInfo(String.valueOf(ldsVersion++)) - .setNonce(String.valueOf(++ldsNonce)); - for (String ldsName: value.getResourceNamesList()) { - if (ldsResources.containsKey(ldsName)) { - responseBuilder.addResources(Any.pack( - ldsResources.get(ldsName), - ADS_TYPE_URL_LDS - )); - } - } - responseObserver.onNext(responseBuilder.build()); - break; - case ADS_TYPE_URL_RDS: - if (!value.getResponseNonce().isEmpty() - && !String.valueOf(rdsNonce).equals(value.getResponseNonce())) { - logger.log(Level.FINE, "rds resource nonce does not match, ignore."); - return; - } - if (String.valueOf(rdsVersion).equals(value.getVersionInfo())) { - logger.log(Level.FINEST, "control plane received ack for rds resource: {0}", - value.getResourceNamesList()); - return; - } - responseBuilder = DiscoveryResponse.newBuilder() - .setTypeUrl(ADS_TYPE_URL_RDS) - .setVersionInfo(String.valueOf(rdsVersion++)) - .setNonce(String.valueOf(++rdsNonce)); - for (String rdsName: value.getResourceNamesList()) { - if (rdsResources.containsKey(rdsName)) { - responseBuilder.addResources(Any.pack( - rdsResources.get(rdsName), - ADS_TYPE_URL_RDS - )); - } - } - responseObserver.onNext(responseBuilder.build()); - break; - case ADS_TYPE_URL_CDS: - if (!value.getResponseNonce().isEmpty() - && !String.valueOf(cdsNonce).equals(value.getResponseNonce())) { - logger.log(Level.FINE, "cds resource nonce does not match, ignore."); - return; - } - if (String.valueOf(cdsVersion).equals(value.getVersionInfo())) { - logger.log(Level.FINEST, "control plane received ack for cds resource: {0}", - value.getResourceNamesList()); - return; - } - responseBuilder = DiscoveryResponse.newBuilder() - .setTypeUrl(ADS_TYPE_URL_CDS) - .setVersionInfo(String.valueOf(cdsVersion++)) - .setNonce(String.valueOf(++cdsNonce)); - for (String cdsName: value.getResourceNamesList()) { - if (cdsResources.containsKey(cdsName)) { - responseBuilder.addResources(Any.pack( - cdsResources.get(cdsName), - ADS_TYPE_URL_CDS - )); - } - } - responseObserver.onNext(responseBuilder.build()); - break; - case ADS_TYPE_URL_EDS: - if (!value.getResponseNonce().isEmpty() - && !String.valueOf(edsNonce).equals(value.getResponseNonce())) { - logger.log(Level.FINE, "eds resource nonce does not match, ignore."); - return; - } - if (String.valueOf(edsVersion).equals(value.getVersionInfo())) { - logger.log(Level.FINEST, "control plane received ack for eds resource: {0}", - value.getResourceNamesList()); - return; - } - responseBuilder = DiscoveryResponse.newBuilder() - .setTypeUrl(ADS_TYPE_URL_EDS) - .setVersionInfo(String.valueOf(edsVersion++)) - .setNonce(String.valueOf(++edsNonce)); - for (String edsName: value.getResourceNamesList()) { - if (edsResources.containsKey(edsName)) { - responseBuilder.addResources(Any.pack( - edsResources.get(value.getResourceNames(0)), - ADS_TYPE_URL_EDS - )); - } - } - responseObserver.onNext(responseBuilder.build()); - break; - default: - logger.log(Level.WARNING, "unrecognized typeUrl in discoveryRequest: {0}", - value.getTypeUrl()); - } - } - }); - } - - @Override - public void onError(Throwable t) { - logger.log(Level.FINE, "Control plane error: {0} ", t); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - return requestObserver; - } -}