diff --git a/core/src/main/java/org/elasticsearch/client/transport/TransportClient.java b/core/src/main/java/org/elasticsearch/client/transport/TransportClient.java index a50a1e7bbea..e8b8c5043e5 100644 --- a/core/src/main/java/org/elasticsearch/client/transport/TransportClient.java +++ b/core/src/main/java/org/elasticsearch/client/transport/TransportClient.java @@ -108,7 +108,7 @@ public abstract class TransportClient extends AbstractClient { final List resourcesToClose = new ArrayList<>(); final ThreadPool threadPool = new ThreadPool(settings); resourcesToClose.add(() -> ThreadPool.terminate(threadPool, 10, TimeUnit.SECONDS)); - final NetworkService networkService = new NetworkService(settings); + final NetworkService networkService = new NetworkService(settings, Collections.emptyList()); NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry(); try { final List> additionalSettings = new ArrayList<>(); diff --git a/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java b/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java index a91f36ad307..9d3a92a65b9 100644 --- a/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java +++ b/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java @@ -20,7 +20,6 @@ package org.elasticsearch.common.network; import org.elasticsearch.action.support.replication.ReplicationTask; -import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.routing.allocation.command.AllocateEmptyPrimaryAllocationCommand; import org.elasticsearch.cluster.routing.allocation.command.AllocateReplicaAllocationCommand; import org.elasticsearch.cluster.routing.allocation.command.AllocateStalePrimaryAllocationCommand; @@ -75,13 +74,13 @@ public class NetworkModule extends AbstractModule { /** * Creates a network module that custom networking classes can be plugged into. - * - * @param networkService A constructed network service object to bind. + * @param networkService A constructed network service object to bind. * @param settings The settings for the node * @param transportClient True if only transport classes should be allowed to be registered, false otherwise. * @param namedWriteableRegistry registry for named writeables for use during streaming */ - public NetworkModule(NetworkService networkService, Settings settings, boolean transportClient, NamedWriteableRegistry namedWriteableRegistry) { + public NetworkModule(NetworkService networkService, Settings settings, boolean transportClient, + NamedWriteableRegistry namedWriteableRegistry) { this.networkService = networkService; this.settings = settings; this.transportClient = transportClient; diff --git a/core/src/main/java/org/elasticsearch/common/network/NetworkService.java b/core/src/main/java/org/elasticsearch/common/network/NetworkService.java index ff1f3912cc5..2652f9ff646 100644 --- a/core/src/main/java/org/elasticsearch/common/network/NetworkService.java +++ b/core/src/main/java/org/elasticsearch/common/network/NetworkService.java @@ -33,7 +33,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -90,18 +89,12 @@ public class NetworkService extends AbstractComponent { InetAddress[] resolveIfPossible(String value) throws IOException; } - private final List customNameResolvers = new CopyOnWriteArrayList<>(); + private final List customNameResolvers; - public NetworkService(Settings settings) { + public NetworkService(Settings settings, List customNameResolvers) { super(settings); IfConfig.logIfNecessary(); - } - - /** - * Add a custom name resolver. - */ - public void addCustomNameResolver(CustomNameResolver customNameResolver) { - customNameResolvers.add(customNameResolver); + this.customNameResolvers = customNameResolvers; } /** @@ -120,11 +113,13 @@ public class NetworkService extends AbstractComponent { // if we have settings use them (we have a fallback to GLOBAL_NETWORK_HOST_SETTING inline bindHosts = GLOBAL_NETWORK_BINDHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY); } else { - // next check any registered custom resolvers - for (CustomNameResolver customNameResolver : customNameResolvers) { - InetAddress addresses[] = customNameResolver.resolveDefault(); - if (addresses != null) { - return addresses; + // next check any registered custom resolvers if any + if (customNameResolvers != null) { + for (CustomNameResolver customNameResolver : customNameResolvers) { + InetAddress addresses[] = customNameResolver.resolveDefault(); + if (addresses != null) { + return addresses; + } } } // we know it's not here. get the defaults @@ -166,11 +161,13 @@ public class NetworkService extends AbstractComponent { // if we have settings use them (we have a fallback to GLOBAL_NETWORK_HOST_SETTING inline publishHosts = GLOBAL_NETWORK_PUBLISHHOST_SETTING.get(settings).toArray(Strings.EMPTY_ARRAY); } else { - // next check any registered custom resolvers - for (CustomNameResolver customNameResolver : customNameResolvers) { - InetAddress addresses[] = customNameResolver.resolveDefault(); - if (addresses != null) { - return addresses[0]; + // next check any registered custom resolvers if any + if (customNameResolvers != null) { + for (CustomNameResolver customNameResolver : customNameResolvers) { + InetAddress addresses[] = customNameResolver.resolveDefault(); + if (addresses != null) { + return addresses[0]; + } } } // we know it's not here. get the defaults @@ -229,11 +226,13 @@ public class NetworkService extends AbstractComponent { private InetAddress[] resolveInternal(String host) throws IOException { if ((host.startsWith("#") && host.endsWith("#")) || (host.startsWith("_") && host.endsWith("_"))) { host = host.substring(1, host.length() - 1); - // allow custom resolvers to have special names - for (CustomNameResolver customNameResolver : customNameResolvers) { - InetAddress addresses[] = customNameResolver.resolveIfPossible(host); - if (addresses != null) { - return addresses; + // next check any registered custom resolvers if any + if (customNameResolvers != null) { + for (CustomNameResolver customNameResolver : customNameResolvers) { + InetAddress addresses[] = customNameResolver.resolveIfPossible(host); + if (addresses != null) { + return addresses; + } } } switch (host) { diff --git a/core/src/main/java/org/elasticsearch/node/Node.java b/core/src/main/java/org/elasticsearch/node/Node.java index a57492750ad..56bcdcf9c8d 100644 --- a/core/src/main/java/org/elasticsearch/node/Node.java +++ b/core/src/main/java/org/elasticsearch/node/Node.java @@ -92,6 +92,7 @@ import org.elasticsearch.node.internal.InternalSettingsPreparer; import org.elasticsearch.node.service.NodeService; import org.elasticsearch.plugins.ActionPlugin; import org.elasticsearch.plugins.AnalysisPlugin; +import org.elasticsearch.plugins.DiscoveryPlugin; import org.elasticsearch.plugins.IngestPlugin; import org.elasticsearch.plugins.MapperPlugin; import org.elasticsearch.plugins.Plugin; @@ -294,7 +295,8 @@ public class Node implements Closeable { // so we might be late here already final SettingsModule settingsModule = new SettingsModule(this.settings, additionalSettings, additionalSettingsFilter); resourcesToClose.add(resourceWatcherService); - final NetworkService networkService = new NetworkService(settings); + final NetworkService networkService = new NetworkService(settings, + getCustomNameResolvers(pluginsService.filterPlugins(DiscoveryPlugin.class))); final ClusterService clusterService = new ClusterService(settings, settingsModule.getClusterSettings(), threadPool); clusterService.add(scriptModule.getScriptService()); resourcesToClose.add(clusterService); @@ -721,4 +723,19 @@ public class Node implements Closeable { BigArrays createBigArrays(Settings settings, CircuitBreakerService circuitBreakerService) { return new BigArrays(settings, circuitBreakerService); } + + /** + * Get Custom Name Resolvers list based on a Discovery Plugins list + * @param discoveryPlugins Discovery plugins list + */ + private List getCustomNameResolvers(List discoveryPlugins) { + List customNameResolvers = new ArrayList<>(); + for (DiscoveryPlugin discoveryPlugin : discoveryPlugins) { + NetworkService.CustomNameResolver customNameResolver = discoveryPlugin.getCustomNameResolver(settings); + if (customNameResolver != null) { + customNameResolvers.add(customNameResolver); + } + } + return customNameResolvers; + } } diff --git a/core/src/main/java/org/elasticsearch/plugins/DiscoveryPlugin.java b/core/src/main/java/org/elasticsearch/plugins/DiscoveryPlugin.java new file mode 100644 index 00000000000..f6174c08d12 --- /dev/null +++ b/core/src/main/java/org/elasticsearch/plugins/DiscoveryPlugin.java @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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. + */ + +package org.elasticsearch.plugins; + +import org.elasticsearch.common.network.NetworkService; +import org.elasticsearch.common.settings.Settings; + +/** + * An additional extension point for {@link Plugin}s that extends Elasticsearch's discovery functionality. To add an additional + * {@link NetworkService.CustomNameResolver} just implement the interface and implement the {@link #getCustomNameResolver(Settings)} method: + * + *
{@code
+ * public class MyDiscoveryPlugin extends Plugin implements DiscoveryPlugin {
+ *     @Override
+ *     public NetworkService.CustomNameResolver getCustomNameResolver(Settings settings) {
+ *         return new YourCustomNameResolverInstance(settings);
+ *     }
+ * }
+ * }
+ */ +public interface DiscoveryPlugin { + /** + * Override to add additional {@link NetworkService.CustomNameResolver}s. + * This can be handy if you want to provide your own Network interface name like _mycard_ + * and implement by yourself the logic to get an actual IP address/hostname based on this + * name. + * + * For example: you could call a third party service (an API) to resolve _mycard_. + * Then you could define in elasticsearch.yml settings like: + * + *
{@code
+     * network.host: _mycard_
+     * }
+ */ + default NetworkService.CustomNameResolver getCustomNameResolver(Settings settings) { + return null; + } +} diff --git a/core/src/test/java/org/elasticsearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java b/core/src/test/java/org/elasticsearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java index 4f553dfb88a..c2f9938861b 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java @@ -45,12 +45,12 @@ import org.elasticsearch.test.rest.FakeRestRequest; import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Supplier; -import static java.util.Collections.emptyMap; import static java.util.Collections.unmodifiableList; import static org.elasticsearch.common.unit.TimeValue.timeValueMillis; diff --git a/core/src/test/java/org/elasticsearch/cluster/routing/allocation/AllocationCommandsTests.java b/core/src/test/java/org/elasticsearch/cluster/routing/allocation/AllocationCommandsTests.java index f95fb687c76..9624e32dfce 100644 --- a/core/src/test/java/org/elasticsearch/cluster/routing/allocation/AllocationCommandsTests.java +++ b/core/src/test/java/org/elasticsearch/cluster/routing/allocation/AllocationCommandsTests.java @@ -51,8 +51,11 @@ import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.ShardNotFoundException; +import org.elasticsearch.plugins.DiscoveryPlugin; import org.elasticsearch.test.ESAllocationTestCase; +import java.util.Collections; + import static java.util.Collections.singleton; import static org.elasticsearch.cluster.routing.ShardRoutingState.INITIALIZING; import static org.elasticsearch.cluster.routing.ShardRoutingState.RELOCATING; @@ -481,7 +484,7 @@ public class AllocationCommandsTests extends ESAllocationTestCase { parser.nextToken(); parser.nextToken(); AllocationCommandRegistry registry = new NetworkModule(null, Settings.EMPTY, true, new NamedWriteableRegistry()) - .getAllocationCommandRegistry(); + .getAllocationCommandRegistry(); AllocationCommands sCommands = AllocationCommands.fromXContent(parser, ParseFieldMatcher.STRICT, registry); assertThat(sCommands.commands().size(), equalTo(5)); diff --git a/core/src/test/java/org/elasticsearch/common/network/NetworkModuleTests.java b/core/src/test/java/org/elasticsearch/common/network/NetworkModuleTests.java index f5a5928c980..9abcaa0ce3e 100644 --- a/core/src/test/java/org/elasticsearch/common/network/NetworkModuleTests.java +++ b/core/src/test/java/org/elasticsearch/common/network/NetworkModuleTests.java @@ -44,6 +44,7 @@ import org.elasticsearch.transport.Transport; import org.elasticsearch.transport.TransportService; import java.io.IOException; +import java.util.Collections; public class NetworkModuleTests extends ModuleTestCase { @@ -112,13 +113,14 @@ public class NetworkModuleTests extends ModuleTestCase { .put(NetworkModule.HTTP_ENABLED.getKey(), false) .put(NetworkModule.TRANSPORT_TYPE_KEY, "local") .build(); - NetworkModule module = new NetworkModule(new NetworkService(settings), settings, false, new NamedWriteableRegistry()); + NetworkModule module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, false, + new NamedWriteableRegistry()); module.registerTransportService("custom", FakeTransportService.class); assertBinding(module, TransportService.class, FakeTransportService.class); assertFalse(module.isTransportClient()); // check it works with transport only as well - module = new NetworkModule(new NetworkService(settings), settings, true, new NamedWriteableRegistry()); + module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, true, new NamedWriteableRegistry()); module.registerTransportService("custom", FakeTransportService.class); assertBinding(module, TransportService.class, FakeTransportService.class); assertTrue(module.isTransportClient()); @@ -128,13 +130,14 @@ public class NetworkModuleTests extends ModuleTestCase { Settings settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "custom") .put(NetworkModule.HTTP_ENABLED.getKey(), false) .build(); - NetworkModule module = new NetworkModule(new NetworkService(settings), settings, false, new NamedWriteableRegistry()); + NetworkModule module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, false, + new NamedWriteableRegistry()); module.registerTransport("custom", FakeTransport.class); assertBinding(module, Transport.class, FakeTransport.class); assertFalse(module.isTransportClient()); // check it works with transport only as well - module = new NetworkModule(new NetworkService(settings), settings, true, new NamedWriteableRegistry()); + module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, true, new NamedWriteableRegistry()); module.registerTransport("custom", FakeTransport.class); assertBinding(module, Transport.class, FakeTransport.class); assertTrue(module.isTransportClient()); @@ -144,13 +147,14 @@ public class NetworkModuleTests extends ModuleTestCase { Settings settings = Settings.builder() .put(NetworkModule.HTTP_TYPE_SETTING.getKey(), "custom") .put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); - NetworkModule module = new NetworkModule(new NetworkService(settings), settings, false, new NamedWriteableRegistry()); + NetworkModule module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, false, + new NamedWriteableRegistry()); module.registerHttpTransport("custom", FakeHttpTransport.class); assertBinding(module, HttpServerTransport.class, FakeHttpTransport.class); assertFalse(module.isTransportClient()); // check registration not allowed for transport only - module = new NetworkModule(new NetworkService(settings), settings, true, new NamedWriteableRegistry()); + module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, true, new NamedWriteableRegistry()); assertTrue(module.isTransportClient()); try { module.registerHttpTransport("custom", FakeHttpTransport.class); @@ -163,7 +167,7 @@ public class NetworkModuleTests extends ModuleTestCase { // not added if http is disabled settings = Settings.builder().put(NetworkModule.HTTP_ENABLED.getKey(), false) .put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); - module = new NetworkModule(new NetworkService(settings), settings, false, new NamedWriteableRegistry()); + module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, false, new NamedWriteableRegistry()); assertNotBound(module, HttpServerTransport.class); assertFalse(module.isTransportClient()); } @@ -171,7 +175,7 @@ public class NetworkModuleTests extends ModuleTestCase { public void testRegisterTaskStatus() { NamedWriteableRegistry registry = new NamedWriteableRegistry(); Settings settings = Settings.EMPTY; - NetworkModule module = new NetworkModule(new NetworkService(settings), settings, false, registry); + NetworkModule module = new NetworkModule(new NetworkService(settings, Collections.emptyList()), settings, false, registry); assertFalse(module.isTransportClient()); // Builtin reader comes back diff --git a/core/src/test/java/org/elasticsearch/common/network/NetworkServiceTests.java b/core/src/test/java/org/elasticsearch/common/network/NetworkServiceTests.java index 7ec4756d784..096d3b0a9a9 100644 --- a/core/src/test/java/org/elasticsearch/common/network/NetworkServiceTests.java +++ b/core/src/test/java/org/elasticsearch/common/network/NetworkServiceTests.java @@ -23,6 +23,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.test.ESTestCase; import java.net.InetAddress; +import java.util.Collections; import static org.hamcrest.Matchers.is; @@ -36,7 +37,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure exception if we bind to multicast ipv4 address */ public void testBindMulticastV4() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); try { service.resolveBindHostAddresses(new String[] { "239.1.1.1" }); fail("should have hit exception"); @@ -48,7 +49,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure exception if we bind to multicast ipv6 address */ public void testBindMulticastV6() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); try { service.resolveBindHostAddresses(new String[] { "FF08::108" }); fail("should have hit exception"); @@ -61,7 +62,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure exception if we publish to multicast ipv4 address */ public void testPublishMulticastV4() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); try { service.resolvePublishHostAddresses(new String[] { "239.1.1.1" }); fail("should have hit exception"); @@ -74,7 +75,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure exception if we publish to multicast ipv6 address */ public void testPublishMulticastV6() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); try { service.resolvePublishHostAddresses(new String[] { "FF08::108" }); fail("should have hit exception"); @@ -87,7 +88,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure specifying wildcard ipv4 address will bind to all interfaces */ public void testBindAnyLocalV4() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); assertEquals(InetAddress.getByName("0.0.0.0"), service.resolveBindHostAddresses(new String[] { "0.0.0.0" })[0]); } @@ -95,7 +96,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure specifying wildcard ipv6 address will bind to all interfaces */ public void testBindAnyLocalV6() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); assertEquals(InetAddress.getByName("::"), service.resolveBindHostAddresses(new String[] { "::" })[0]); } @@ -103,7 +104,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure specifying wildcard ipv4 address selects reasonable publish address */ public void testPublishAnyLocalV4() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); InetAddress address = service.resolvePublishHostAddresses(new String[] { "0.0.0.0" }); assertFalse(address.isAnyLocalAddress()); } @@ -112,7 +113,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure specifying wildcard ipv6 address selects reasonable publish address */ public void testPublishAnyLocalV6() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); InetAddress address = service.resolvePublishHostAddresses(new String[] { "::" }); assertFalse(address.isAnyLocalAddress()); } @@ -121,7 +122,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure we can bind to multiple addresses */ public void testBindMultipleAddresses() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); InetAddress[] addresses = service.resolveBindHostAddresses(new String[]{"127.0.0.1", "127.0.0.2"}); assertThat(addresses.length, is(2)); } @@ -130,7 +131,7 @@ public class NetworkServiceTests extends ESTestCase { * ensure we can't bind to multiple addresses when using wildcard */ public void testBindMultipleAddressesWithWildcard() throws Exception { - NetworkService service = new NetworkService(Settings.EMPTY); + NetworkService service = new NetworkService(Settings.EMPTY, Collections.emptyList()); try { service.resolveBindHostAddresses(new String[]{"0.0.0.0", "127.0.0.1"}); fail("should have hit exception"); diff --git a/core/src/test/java/org/elasticsearch/discovery/zen/ping/unicast/UnicastZenPingIT.java b/core/src/test/java/org/elasticsearch/discovery/zen/ping/unicast/UnicastZenPingIT.java index 6696174c08f..884ac1aa98f 100644 --- a/core/src/test/java/org/elasticsearch/discovery/zen/ping/unicast/UnicastZenPingIT.java +++ b/core/src/test/java/org/elasticsearch/discovery/zen/ping/unicast/UnicastZenPingIT.java @@ -45,6 +45,7 @@ import org.elasticsearch.transport.TransportService; import org.elasticsearch.transport.TransportSettings; import java.net.InetSocketAddress; +import java.util.Collections; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; @@ -66,7 +67,7 @@ public class UnicastZenPingIT extends ESTestCase { .put(TransportSettings.PORT.getKey(), startPort + "-" + endPort).build(); ThreadPool threadPool = new TestThreadPool(getClass().getName()); - NetworkService networkService = new NetworkService(settings); + NetworkService networkService = new NetworkService(settings, Collections.emptyList()); ElectMasterService electMasterService = new ElectMasterService(settings); NetworkHandle handleA = startServices(settings, threadPool, networkService, "UZP_A", Version.CURRENT); diff --git a/core/src/test/java/org/elasticsearch/transport/TransportServiceHandshakeTests.java b/core/src/test/java/org/elasticsearch/transport/TransportServiceHandshakeTests.java index 39ab7949a65..a9bf3f0f01d 100644 --- a/core/src/test/java/org/elasticsearch/transport/TransportServiceHandshakeTests.java +++ b/core/src/test/java/org/elasticsearch/transport/TransportServiceHandshakeTests.java @@ -36,6 +36,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; @@ -63,7 +64,7 @@ public class TransportServiceHandshakeTests extends ESTestCase { BigArrays.NON_RECYCLING_INSTANCE, new NoneCircuitBreakerService(), new NamedWriteableRegistry(), - new NetworkService(settings)); + new NetworkService(settings, Collections.emptyList())); TransportService transportService = new MockTransportService(settings, transport, threadPool); transportService.start(); transportService.acceptIncomingRequests(); diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpChannelTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpChannelTests.java index 41ea8612fed..ccb8aedd94c 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpChannelTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpChannelTests.java @@ -50,6 +50,7 @@ import org.junit.Before; import java.net.SocketAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.elasticsearch.http.HttpTransportSettings.SETTING_CORS_ALLOW_CREDENTIALS; @@ -70,7 +71,7 @@ public class Netty3HttpChannelTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerPipeliningTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerPipeliningTests.java index ebaff71e0c2..b432708de15 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerPipeliningTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerPipeliningTests.java @@ -49,6 +49,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -72,7 +73,7 @@ public class Netty3HttpServerPipeliningTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerTransportTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerTransportTests.java index 901d517bf95..d291f76ff38 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerTransportTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/http/netty3/Netty3HttpServerTransportTests.java @@ -34,6 +34,7 @@ import org.junit.After; import org.junit.Before; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -55,7 +56,7 @@ public class Netty3HttpServerTransportTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/Netty3SizeHeaderFrameDecoderTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/Netty3SizeHeaderFrameDecoderTests.java index e4047798071..46e65d9d1fe 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/Netty3SizeHeaderFrameDecoderTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/Netty3SizeHeaderFrameDecoderTests.java @@ -38,6 +38,7 @@ import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.Collections; import static org.hamcrest.Matchers.is; @@ -61,7 +62,7 @@ public class Netty3SizeHeaderFrameDecoderTests extends ESTestCase { @Before public void startThreadPool() { threadPool = new ThreadPool(settings); - NetworkService networkService = new NetworkService(settings); + NetworkService networkService = new NetworkService(settings, Collections.emptyList()); BigArrays bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); nettyTransport = new Netty3Transport(settings, threadPool, networkService, bigArrays, new NamedWriteableRegistry(), new NoneCircuitBreakerService()); diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3ScheduledPingTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3ScheduledPingTests.java index 16694dbed0b..3b02caf3b99 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3ScheduledPingTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3ScheduledPingTests.java @@ -43,6 +43,7 @@ import org.elasticsearch.transport.TransportResponseOptions; import org.elasticsearch.transport.TransportSettings; import java.io.IOException; +import java.util.Collections; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; @@ -62,14 +63,14 @@ public class Netty3ScheduledPingTests extends ESTestCase { CircuitBreakerService circuitBreakerService = new NoneCircuitBreakerService(); NamedWriteableRegistry registryA = new NamedWriteableRegistry(); - final Netty3Transport nettyA = new Netty3Transport(settings, threadPool, new NetworkService(settings), + final Netty3Transport nettyA = new Netty3Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), BigArrays.NON_RECYCLING_INSTANCE, registryA, circuitBreakerService); MockTransportService serviceA = new MockTransportService(settings, nettyA, threadPool); serviceA.start(); serviceA.acceptIncomingRequests(); NamedWriteableRegistry registryB = new NamedWriteableRegistry(); - final Netty3Transport nettyB = new Netty3Transport(settings, threadPool, new NetworkService(settings), + final Netty3Transport nettyB = new Netty3Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), BigArrays.NON_RECYCLING_INSTANCE, registryB, circuitBreakerService); MockTransportService serviceB = new MockTransportService(settings, nettyB, threadPool); diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3TransportMultiPortTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3TransportMultiPortTests.java index f21edf3f596..c460f630d5e 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3TransportMultiPortTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/Netty3TransportMultiPortTests.java @@ -34,6 +34,8 @@ import org.elasticsearch.transport.TransportService; import org.elasticsearch.transport.TransportSettings; import org.junit.Before; +import java.util.Collections; + import static org.hamcrest.Matchers.is; public class Netty3TransportMultiPortTests extends ESTestCase { @@ -135,8 +137,8 @@ public class Netty3TransportMultiPortTests extends ESTestCase { private TcpTransport startTransport(Settings settings, ThreadPool threadPool) { BigArrays bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); - TcpTransport transport = new Netty3Transport(settings, threadPool, new NetworkService(settings), bigArrays, - new NamedWriteableRegistry(), new NoneCircuitBreakerService()); + TcpTransport transport = new Netty3Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), + bigArrays, new NamedWriteableRegistry(), new NoneCircuitBreakerService()); transport.start(); assertThat(transport.lifecycleState(), is(Lifecycle.State.STARTED)); diff --git a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/SimpleNetty3TransportTests.java b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/SimpleNetty3TransportTests.java index db400f4df43..60994273fb4 100644 --- a/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/SimpleNetty3TransportTests.java +++ b/modules/transport-netty3/src/test/java/org/elasticsearch/transport/netty3/SimpleNetty3TransportTests.java @@ -36,6 +36,7 @@ import org.elasticsearch.transport.TransportSettings; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Collections; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; @@ -47,8 +48,8 @@ public class SimpleNetty3TransportTests extends AbstractSimpleTransportTestCase Settings settings, ThreadPool threadPool, final Version version) { NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry(); - Transport transport = new Netty3Transport(settings, threadPool, new NetworkService(settings), BigArrays.NON_RECYCLING_INSTANCE, - namedWriteableRegistry, new NoneCircuitBreakerService()) { + Transport transport = new Netty3Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), + BigArrays.NON_RECYCLING_INSTANCE, namedWriteableRegistry, new NoneCircuitBreakerService()) { @Override protected Version getCurrentVersion() { return version; diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpChannelTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpChannelTests.java index 58c6a476fe8..1185419d0dd 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpChannelTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpChannelTests.java @@ -58,6 +58,7 @@ import org.junit.Before; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.elasticsearch.http.HttpTransportSettings.SETTING_CORS_ALLOW_CREDENTIALS; @@ -77,7 +78,7 @@ public class Netty4HttpChannelTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java index d8e61908011..4d94dc2ccaf 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerPipeliningTests.java @@ -49,6 +49,7 @@ import org.junit.Before; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -67,7 +68,7 @@ public class Netty4HttpServerPipeliningTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java index dc63907265c..2683e69c917 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpServerTransportTests.java @@ -33,6 +33,7 @@ import org.junit.After; import org.junit.Before; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -55,7 +56,7 @@ public class Netty4HttpServerTransportTests extends ESTestCase { @Before public void setup() throws Exception { - networkService = new NetworkService(Settings.EMPTY); + networkService = new NetworkService(Settings.EMPTY, Collections.emptyList()); threadPool = new TestThreadPool("test"); bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); } diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4ScheduledPingTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4ScheduledPingTests.java index 0e2ee23f950..c65a63646d1 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4ScheduledPingTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4ScheduledPingTests.java @@ -43,6 +43,7 @@ import org.elasticsearch.transport.TransportResponseOptions; import org.elasticsearch.transport.TransportSettings; import java.io.IOException; +import java.util.Collections; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; @@ -62,14 +63,14 @@ public class Netty4ScheduledPingTests extends ESTestCase { CircuitBreakerService circuitBreakerService = new NoneCircuitBreakerService(); NamedWriteableRegistry registryA = new NamedWriteableRegistry(); - final Netty4Transport nettyA = new Netty4Transport(settings, threadPool, new NetworkService(settings), + final Netty4Transport nettyA = new Netty4Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), BigArrays.NON_RECYCLING_INSTANCE, registryA, circuitBreakerService); MockTransportService serviceA = new MockTransportService(settings, nettyA, threadPool); serviceA.start(); serviceA.acceptIncomingRequests(); NamedWriteableRegistry registryB = new NamedWriteableRegistry(); - final Netty4Transport nettyB = new Netty4Transport(settings, threadPool, new NetworkService(settings), + final Netty4Transport nettyB = new Netty4Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), BigArrays.NON_RECYCLING_INSTANCE, registryB, circuitBreakerService); MockTransportService serviceB = new MockTransportService(settings, nettyB, threadPool); diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4SizeHeaderFrameDecoderTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4SizeHeaderFrameDecoderTests.java index 8e7ac400f46..6a0d8b71968 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4SizeHeaderFrameDecoderTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4SizeHeaderFrameDecoderTests.java @@ -38,6 +38,7 @@ import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.Collections; import static org.hamcrest.Matchers.is; @@ -61,7 +62,7 @@ public class Netty4SizeHeaderFrameDecoderTests extends ESTestCase { @Before public void startThreadPool() { threadPool = new ThreadPool(settings); - NetworkService networkService = new NetworkService(settings); + NetworkService networkService = new NetworkService(settings, Collections.emptyList()); BigArrays bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); nettyTransport = new Netty4Transport(settings, threadPool, networkService, bigArrays, new NamedWriteableRegistry(), new NoneCircuitBreakerService()); diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/NettyTransportMultiPortTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/NettyTransportMultiPortTests.java index e76431daf8d..04488cb5b01 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/NettyTransportMultiPortTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/NettyTransportMultiPortTests.java @@ -34,6 +34,8 @@ import org.elasticsearch.transport.TransportService; import org.elasticsearch.transport.TransportSettings; import org.junit.Before; +import java.util.Collections; + import static org.hamcrest.Matchers.is; public class NettyTransportMultiPortTests extends ESTestCase { @@ -135,8 +137,8 @@ public class NettyTransportMultiPortTests extends ESTestCase { private TcpTransport startTransport(Settings settings, ThreadPool threadPool) { BigArrays bigArrays = new MockBigArrays(Settings.EMPTY, new NoneCircuitBreakerService()); - TcpTransport transport = new Netty4Transport(settings, threadPool, new NetworkService(settings), bigArrays, - new NamedWriteableRegistry(), new NoneCircuitBreakerService()); + TcpTransport transport = new Netty4Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), + bigArrays, new NamedWriteableRegistry(), new NoneCircuitBreakerService()); transport.start(); assertThat(transport.lifecycleState(), is(Lifecycle.State.STARTED)); diff --git a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/SimpleNetty4TransportTests.java b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/SimpleNetty4TransportTests.java index bafec9d2ffa..f370ab2aa03 100644 --- a/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/SimpleNetty4TransportTests.java +++ b/modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/SimpleNetty4TransportTests.java @@ -36,6 +36,7 @@ import org.elasticsearch.transport.TransportSettings; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Collections; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; @@ -47,8 +48,8 @@ public class SimpleNetty4TransportTests extends AbstractSimpleTransportTestCase Settings settings, ThreadPool threadPool, final Version version) { NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry(); - Transport transport = new Netty4Transport(settings, threadPool, new NetworkService(settings), BigArrays.NON_RECYCLING_INSTANCE, - namedWriteableRegistry, new NoneCircuitBreakerService()) { + Transport transport = new Netty4Transport(settings, threadPool, new NetworkService(settings, Collections.emptyList()), + BigArrays.NON_RECYCLING_INSTANCE, namedWriteableRegistry, new NoneCircuitBreakerService()) { @Override protected Version getCurrentVersion() { return version; diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/cloud/aws/AwsEc2ServiceImpl.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/cloud/aws/AwsEc2ServiceImpl.java index b51c9c03f6e..f35d802cee9 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/cloud/aws/AwsEc2ServiceImpl.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/cloud/aws/AwsEc2ServiceImpl.java @@ -55,10 +55,8 @@ public class AwsEc2ServiceImpl extends AbstractLifecycleComponent implements Aws private AmazonEC2Client client; @Inject - public AwsEc2ServiceImpl(Settings settings, NetworkService networkService) { + public AwsEc2ServiceImpl(Settings settings) { super(settings); - // add specific ec2 name resolver - networkService.addCustomNameResolver(new Ec2NameResolver(settings)); } @Override diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/plugin/discovery/ec2/Ec2DiscoveryPlugin.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/plugin/discovery/ec2/Ec2DiscoveryPlugin.java index eb4afbcf784..346372f554e 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/plugin/discovery/ec2/Ec2DiscoveryPlugin.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/plugin/discovery/ec2/Ec2DiscoveryPlugin.java @@ -38,22 +38,26 @@ import org.elasticsearch.SpecialPermission; import org.elasticsearch.cloud.aws.AwsEc2Service; import org.elasticsearch.cloud.aws.AwsEc2ServiceImpl; import org.elasticsearch.cloud.aws.Ec2Module; +import org.elasticsearch.cloud.aws.network.Ec2NameResolver; import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.Module; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; +import org.elasticsearch.common.network.NetworkModule; +import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.discovery.DiscoveryModule; import org.elasticsearch.discovery.ec2.AwsEc2UnicastHostsProvider; import org.elasticsearch.discovery.zen.ZenDiscovery; import org.elasticsearch.node.Node; +import org.elasticsearch.plugins.DiscoveryPlugin; import org.elasticsearch.plugins.Plugin; /** * */ -public class Ec2DiscoveryPlugin extends Plugin { +public class Ec2DiscoveryPlugin extends Plugin implements DiscoveryPlugin { private static ESLogger logger = Loggers.getLogger(Ec2DiscoveryPlugin.class); @@ -105,6 +109,12 @@ public class Ec2DiscoveryPlugin extends Plugin { discoveryModule.addUnicastHostProvider(EC2, AwsEc2UnicastHostsProvider.class); } + @Override + public NetworkService.CustomNameResolver getCustomNameResolver(Settings settings) { + logger.debug("Register _ec2_, _ec2:xxx_ network names"); + return new Ec2NameResolver(settings); + } + @Override public List> getSettings() { return Arrays.asList( diff --git a/plugins/discovery-ec2/src/test/java/org/elasticsearch/discovery/ec2/Ec2NetworkTests.java b/plugins/discovery-ec2/src/test/java/org/elasticsearch/discovery/ec2/Ec2NetworkTests.java index b69ebd369a4..11ba53ca59e 100644 --- a/plugins/discovery-ec2/src/test/java/org/elasticsearch/discovery/ec2/Ec2NetworkTests.java +++ b/plugins/discovery-ec2/src/test/java/org/elasticsearch/discovery/ec2/Ec2NetworkTests.java @@ -26,6 +26,7 @@ import org.elasticsearch.test.ESTestCase; import java.io.IOException; import java.net.InetAddress; +import java.util.Collections; import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.containsString; @@ -42,8 +43,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -60,8 +60,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:publicIp_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -78,8 +77,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:privateIp_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -96,8 +94,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:privateIpv4_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -114,8 +111,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:privateDns_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -132,8 +128,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:publicIpv4_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -150,8 +145,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_ec2:publicDns_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); // TODO we need to replace that with a mock. For now we check the URL we are supposed to reach. try { networkService.resolveBindHostAddresses(null); @@ -169,8 +163,7 @@ public class Ec2NetworkTests extends ESTestCase { .put("network.host", "_local_") .build(); - NetworkService networkService = new NetworkService(nodeSettings); - networkService.addCustomNameResolver(new Ec2NameResolver(nodeSettings)); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new Ec2NameResolver(nodeSettings))); InetAddress[] addresses = networkService.resolveBindHostAddresses(null); assertThat(addresses, arrayContaining(networkService.resolveBindHostAddresses(new String[] { "_local_" }))); } diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeService.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesService.java similarity index 77% rename from plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeService.java rename to plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesService.java index 00a44cd56af..39db86c672a 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeService.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesService.java @@ -25,13 +25,12 @@ import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Setting.Property; import org.elasticsearch.common.unit.TimeValue; -import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.Function; -public interface GceComputeService extends LifecycleComponent { +public interface GceInstancesService extends LifecycleComponent { /** * GCE API Version: Elasticsearch/GceCloud/1.0 @@ -76,19 +75,4 @@ public interface GceComputeService extends LifecycleComponent { * @return a collection of running instances within the same GCE project */ Collection instances(); - - /** - *

Gets metadata on the current running machine (call to - * http://metadata.google.internal/computeMetadata/v1/instance/xxx).

- *

For example, you can retrieve network information by replacing xxx with:

- *
    - *
  • `hostname` when we need to resolve the host name
  • - *
  • `network-interfaces/0/ip` when we need to resolve private IP
  • - *
- * @see org.elasticsearch.cloud.gce.network.GceNameResolver for bindings - * @param metadataPath path to metadata information - * @return extracted information (for example a hostname or an IP address) - * @throws IOException in case metadata URL is not accessible - */ - String metadata(String metadataPath) throws IOException; } diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeServiceImpl.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesServiceImpl.java similarity index 72% rename from plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeServiceImpl.java rename to plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesServiceImpl.java index 8d1090dd82c..5ec4b18e910 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceComputeServiceImpl.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesServiceImpl.java @@ -21,9 +21,6 @@ package org.elasticsearch.cloud.gce; import com.google.api.client.googleapis.compute.ComputeCredential; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; -import com.google.api.client.http.GenericUrl; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; @@ -33,10 +30,8 @@ import com.google.api.services.compute.model.Instance; import com.google.api.services.compute.model.InstanceList; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.SpecialPermission; -import org.elasticsearch.cloud.gce.network.GceNameResolver; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Setting.Property; import org.elasticsearch.common.settings.Settings; @@ -44,10 +39,8 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.discovery.gce.RetryHttpInitializerWrapper; import java.io.IOException; -import java.net.URL; import java.security.AccessController; import java.security.GeneralSecurityException; -import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; @@ -56,27 +49,16 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; -public class GceComputeServiceImpl extends AbstractLifecycleComponent - implements GceComputeService { +public class GceInstancesServiceImpl extends AbstractLifecycleComponent implements GceInstancesService { // all settings just used for testing - not registered by default public static final Setting GCE_VALIDATE_CERTIFICATES = Setting.boolSetting("cloud.gce.validate_certificates", true, Property.NodeScope); - public static final Setting GCE_HOST = - new Setting<>("cloud.gce.host", "http://metadata.google.internal", Function.identity(), Property.NodeScope); public static final Setting GCE_ROOT_URL = new Setting<>("cloud.gce.root_url", "https://www.googleapis.com", Function.identity(), Property.NodeScope); private final String project; private final List zones; - // Forcing Google Token API URL as set in GCE SDK to - // http://metadata/computeMetadata/v1/instance/service-accounts/default/token - // See https://developers.google.com/compute/docs/metadata#metadataserver - private final String gceHost; - private final String metaDataUrl; - private final String tokenServerEncodedUrl; - private String gceRootUrl; - @Override public Collection instances() { @@ -117,47 +99,6 @@ public class GceComputeServiceImpl extends AbstractLifecycleComponent return instances; } - @Override - public String metadata(String metadataPath) throws IOException { - String urlMetadataNetwork = this.metaDataUrl + "/" + metadataPath; - logger.debug("get metadata from [{}]", urlMetadataNetwork); - final URL url = new URL(urlMetadataNetwork); - HttpHeaders headers; - try { - // hack around code messiness in GCE code - // TODO: get this fixed - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(new SpecialPermission()); - } - headers = AccessController.doPrivileged(new PrivilegedExceptionAction() { - @Override - public HttpHeaders run() throws IOException { - return new HttpHeaders(); - } - }); - GenericUrl genericUrl = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public GenericUrl run() { - return new GenericUrl(url); - } - }); - - // This is needed to query meta data: https://cloud.google.com/compute/docs/metadata - headers.put("Metadata-Flavor", "Google"); - HttpResponse response; - response = getGceHttpTransport().createRequestFactory() - .buildGetRequest(genericUrl) - .setHeaders(headers) - .execute(); - String metadata = response.parseAsString(); - logger.debug("metadata found [{}]", metadata); - return metadata; - } catch (Exception e) { - throw new IOException("failed to fetch metadata from [" + urlMetadataNetwork + "]", e); - } - } - private Compute client; private TimeValue refreshInterval = null; private long lastRefresh; @@ -169,17 +110,13 @@ public class GceComputeServiceImpl extends AbstractLifecycleComponent private JsonFactory gceJsonFactory; private final boolean validateCerts; + @Inject - public GceComputeServiceImpl(Settings settings, NetworkService networkService) { + public GceInstancesServiceImpl(Settings settings) { super(settings); this.project = PROJECT_SETTING.get(settings); this.zones = ZONE_SETTING.get(settings); - this.gceHost = GCE_HOST.get(settings); - this.metaDataUrl = gceHost + "/computeMetadata/v1/instance"; - this.gceRootUrl = GCE_ROOT_URL.get(settings); - tokenServerEncodedUrl = metaDataUrl + "/service-accounts/default/token"; this.validateCerts = GCE_VALIDATE_CERTIFICATES.get(settings); - networkService.addCustomNameResolver(new GceNameResolver(settings, this)); } protected synchronized HttpTransport getGceHttpTransport() throws GeneralSecurityException, IOException { @@ -208,8 +145,13 @@ public class GceComputeServiceImpl extends AbstractLifecycleComponent gceJsonFactory = new JacksonFactory(); logger.info("starting GCE discovery service"); + // Forcing Google Token API URL as set in GCE SDK to + // http://metadata/computeMetadata/v1/instance/service-accounts/default/token + // See https://developers.google.com/compute/docs/metadata#metadataserver + String tokenServerEncodedUrl = GceMetadataService.GCE_HOST.get(settings) + + "/computeMetadata/v1/instance/service-accounts/default/token"; ComputeCredential credential = new ComputeCredential.Builder(getGceHttpTransport(), gceJsonFactory) - .setTokenServerEncodedUrl(this.tokenServerEncodedUrl) + .setTokenServerEncodedUrl(tokenServerEncodedUrl) .build(); // hack around code messiness in GCE code @@ -233,7 +175,7 @@ public class GceComputeServiceImpl extends AbstractLifecycleComponent Compute.Builder builder = new Compute.Builder(getGceHttpTransport(), gceJsonFactory, null).setApplicationName(VERSION) - .setRootUrl(gceRootUrl); + .setRootUrl(GCE_ROOT_URL.get(settings)); if (RETRY_SETTING.exists(settings)) { TimeValue maxWait = MAX_WAIT_SETTING.get(settings); diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceMetadataService.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceMetadataService.java new file mode 100644 index 00000000000..25b7cf72c92 --- /dev/null +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceMetadataService.java @@ -0,0 +1,131 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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. + */ + +package org.elasticsearch.cloud.gce; + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.GenericUrl; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpResponse; +import com.google.api.client.http.HttpTransport; +import org.elasticsearch.SpecialPermission; +import org.elasticsearch.cloud.gce.network.GceNameResolver; +import org.elasticsearch.common.component.AbstractLifecycleComponent; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.network.NetworkService; +import org.elasticsearch.common.settings.Setting; +import org.elasticsearch.common.settings.Settings; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.AccessController; +import java.security.GeneralSecurityException; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.util.function.Function; + +public class GceMetadataService extends AbstractLifecycleComponent { + + // Forcing Google Token API URL as set in GCE SDK to + // http://metadata/computeMetadata/v1/instance/service-accounts/default/token + // See https://developers.google.com/compute/docs/metadata#metadataserver + // all settings just used for testing - not registered by default + public static final Setting GCE_HOST = + new Setting<>("cloud.gce.host", "http://metadata.google.internal", Function.identity(), Setting.Property.NodeScope); + + /** Global instance of the HTTP transport. */ + private HttpTransport gceHttpTransport; + + @Inject + public GceMetadataService(Settings settings) { + super(settings); + } + + protected synchronized HttpTransport getGceHttpTransport() throws GeneralSecurityException, IOException { + if (gceHttpTransport == null) { + gceHttpTransport = GoogleNetHttpTransport.newTrustedTransport(); + } + return gceHttpTransport; + } + + public String metadata(String metadataPath) throws IOException, URISyntaxException { + // Forcing Google Token API URL as set in GCE SDK to + // http://metadata/computeMetadata/v1/instance/service-accounts/default/token + // See https://developers.google.com/compute/docs/metadata#metadataserver + final URI urlMetadataNetwork = new URI(GCE_HOST.get(settings)).resolve("/computeMetadata/v1/instance/").resolve(metadataPath); + logger.debug("get metadata from [{}]", urlMetadataNetwork); + HttpHeaders headers; + try { + // hack around code messiness in GCE code + // TODO: get this fixed + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(new SpecialPermission()); + } + headers = AccessController.doPrivileged(new PrivilegedExceptionAction() { + @Override + public HttpHeaders run() throws IOException { + return new HttpHeaders(); + } + }); + GenericUrl genericUrl = AccessController.doPrivileged(new PrivilegedAction() { + @Override + public GenericUrl run() { + return new GenericUrl(urlMetadataNetwork); + } + }); + + // This is needed to query meta data: https://cloud.google.com/compute/docs/metadata + headers.put("Metadata-Flavor", "Google"); + HttpResponse response; + response = getGceHttpTransport().createRequestFactory() + .buildGetRequest(genericUrl) + .setHeaders(headers) + .execute(); + String metadata = response.parseAsString(); + logger.debug("metadata found [{}]", metadata); + return metadata; + } catch (Exception e) { + throw new IOException("failed to fetch metadata from [" + urlMetadataNetwork + "]", e); + } + } + + @Override + protected void doStart() { + + } + + @Override + protected void doStop() { + if (gceHttpTransport != null) { + try { + gceHttpTransport.shutdown(); + } catch (IOException e) { + logger.warn("unable to shutdown GCE Http Transport", e); + } + gceHttpTransport = null; + } + } + + @Override + protected void doClose() { + + } +} diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceModule.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceModule.java index e1b8d6cf02f..81d10c756e5 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceModule.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceModule.java @@ -20,17 +20,28 @@ package org.elasticsearch.cloud.gce; import org.elasticsearch.common.inject.AbstractModule; +import org.elasticsearch.common.logging.ESLogger; +import org.elasticsearch.common.logging.Loggers; +import org.elasticsearch.common.settings.Settings; public class GceModule extends AbstractModule { // pkg private so tests can override with mock - static Class computeServiceImpl = GceComputeServiceImpl.class; + static Class computeServiceImpl = GceInstancesServiceImpl.class; - public static Class getComputeServiceImpl() { + protected final Settings settings; + protected final ESLogger logger = Loggers.getLogger(GceModule.class); + + public GceModule(Settings settings) { + this.settings = settings; + } + + public static Class getComputeServiceImpl() { return computeServiceImpl; } @Override protected void configure() { - bind(GceComputeService.class).to(computeServiceImpl).asEagerSingleton(); + logger.debug("configure GceModule (bind compute service)"); + bind(GceInstancesService.class).to(computeServiceImpl).asEagerSingleton(); } } diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/network/GceNameResolver.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/network/GceNameResolver.java index 0bd5e07da91..54f96a971ca 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/network/GceNameResolver.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/network/GceNameResolver.java @@ -19,7 +19,7 @@ package org.elasticsearch.cloud.gce.network; -import org.elasticsearch.cloud.gce.GceComputeService; +import org.elasticsearch.cloud.gce.GceMetadataService; import org.elasticsearch.common.Strings; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.network.NetworkService.CustomNameResolver; @@ -27,6 +27,7 @@ import org.elasticsearch.common.settings.Settings; import java.io.IOException; import java.net.InetAddress; +import java.net.URISyntaxException; /** *

Resolves certain GCE related 'meta' hostnames into an actual hostname @@ -40,7 +41,7 @@ import java.net.InetAddress; */ public class GceNameResolver extends AbstractComponent implements CustomNameResolver { - private final GceComputeService gceComputeService; + private final GceMetadataService gceMetadataService; /** * enum that can be added to over time with more meta-data types @@ -72,9 +73,9 @@ public class GceNameResolver extends AbstractComponent implements CustomNameReso /** * Construct a {@link CustomNameResolver}. */ - public GceNameResolver(Settings settings, GceComputeService gceComputeService) { + public GceNameResolver(Settings settings, GceMetadataService gceMetadataService) { super(settings); - this.gceComputeService = gceComputeService; + this.gceMetadataService = gceMetadataService; } /** @@ -93,7 +94,7 @@ public class GceNameResolver extends AbstractComponent implements CustomNameReso // We extract the network interface from gce:privateIp:XX String network = "0"; String[] privateIpConfig = value.split(":"); - if (privateIpConfig != null && privateIpConfig.length == 3) { + if (privateIpConfig.length == 3) { network = privateIpConfig[2]; } @@ -105,13 +106,13 @@ public class GceNameResolver extends AbstractComponent implements CustomNameReso } try { - String metadataResult = gceComputeService.metadata(gceMetadataPath); + String metadataResult = gceMetadataService.metadata(gceMetadataPath); if (metadataResult == null || metadataResult.length() == 0) { throw new IOException("no gce metadata returned from [" + gceMetadataPath + "] for [" + value + "]"); } // only one address: because we explicitly ask for only one via the GceHostnameType return new InetAddress[] { InetAddress.getByName(metadataResult) }; - } catch (IOException e) { + } catch (IOException | URISyntaxException e) { throw new IOException("IOException caught when fetching InetAddress from [" + gceMetadataPath + "]", e); } } diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java index be3d737b919..c73df8f8395 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/discovery/gce/GceUnicastHostsProvider.java @@ -23,7 +23,7 @@ import com.google.api.services.compute.model.AccessConfig; import com.google.api.services.compute.model.Instance; import com.google.api.services.compute.model.NetworkInterface; import org.elasticsearch.Version; -import org.elasticsearch.cloud.gce.GceComputeService; +import org.elasticsearch.cloud.gce.GceInstancesService; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.common.Strings; import org.elasticsearch.common.component.AbstractComponent; @@ -64,7 +64,7 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas private static final String TERMINATED = "TERMINATED"; } - private final GceComputeService gceComputeService; + private final GceInstancesService gceInstancesService; private TransportService transportService; private NetworkService networkService; @@ -77,17 +77,17 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas private List cachedDiscoNodes; @Inject - public GceUnicastHostsProvider(Settings settings, GceComputeService gceComputeService, + public GceUnicastHostsProvider(Settings settings, GceInstancesService gceInstancesService, TransportService transportService, NetworkService networkService) { super(settings); - this.gceComputeService = gceComputeService; + this.gceInstancesService = gceInstancesService; this.transportService = transportService; this.networkService = networkService; - this.refreshInterval = GceComputeService.REFRESH_SETTING.get(settings); - this.project = GceComputeService.PROJECT_SETTING.get(settings); - this.zones = GceComputeService.ZONE_SETTING.get(settings); + this.refreshInterval = GceInstancesService.REFRESH_SETTING.get(settings); + this.project = GceInstancesService.PROJECT_SETTING.get(settings); + this.zones = GceInstancesService.ZONE_SETTING.get(settings); this.tags = TAGS_SETTING.get(settings); if (logger.isDebugEnabled()) { @@ -104,8 +104,8 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas // We check that needed properties have been set if (this.project == null || this.project.isEmpty() || this.zones == null || this.zones.isEmpty()) { throw new IllegalArgumentException("one or more gce discovery settings are missing. " + - "Check elasticsearch.yml file. Should have [" + GceComputeService.PROJECT_SETTING.getKey() + - "] and [" + GceComputeService.ZONE_SETTING.getKey() + "]."); + "Check elasticsearch.yml file. Should have [" + GceInstancesService.PROJECT_SETTING.getKey() + + "] and [" + GceInstancesService.ZONE_SETTING.getKey() + "]."); } if (refreshInterval.millis() != 0) { @@ -131,7 +131,7 @@ public class GceUnicastHostsProvider extends AbstractComponent implements Unicas } try { - Collection instances = gceComputeService.instances(); + Collection instances = gceInstancesService.instances(); if (instances == null) { logger.trace("no instance found for project [{}], zones [{}].", this.project, this.zones); diff --git a/plugins/discovery-gce/src/main/java/org/elasticsearch/plugin/discovery/gce/GceDiscoveryPlugin.java b/plugins/discovery-gce/src/main/java/org/elasticsearch/plugin/discovery/gce/GceDiscoveryPlugin.java index 7f4647281c1..031f7eaf10f 100644 --- a/plugins/discovery-gce/src/main/java/org/elasticsearch/plugin/discovery/gce/GceDiscoveryPlugin.java +++ b/plugins/discovery-gce/src/main/java/org/elasticsearch/plugin/discovery/gce/GceDiscoveryPlugin.java @@ -22,30 +22,36 @@ package org.elasticsearch.plugin.discovery.gce; import com.google.api.client.http.HttpHeaders; import com.google.api.client.util.ClassInfo; import org.elasticsearch.SpecialPermission; -import org.elasticsearch.cloud.gce.GceComputeService; +import org.elasticsearch.cloud.gce.GceInstancesService; +import org.elasticsearch.cloud.gce.GceMetadataService; import org.elasticsearch.cloud.gce.GceModule; +import org.elasticsearch.cloud.gce.network.GceNameResolver; import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.Module; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; +import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.discovery.DiscoveryModule; import org.elasticsearch.discovery.gce.GceUnicastHostsProvider; import org.elasticsearch.discovery.zen.ZenDiscovery; +import org.elasticsearch.plugins.DiscoveryPlugin; import org.elasticsearch.plugins.Plugin; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; -public class GceDiscoveryPlugin extends Plugin { +public class GceDiscoveryPlugin extends Plugin implements DiscoveryPlugin { public static final String GCE = "gce"; + private final Settings settings; + protected final ESLogger logger = Loggers.getLogger(GceDiscoveryPlugin.class); static { /* @@ -69,32 +75,46 @@ public class GceDiscoveryPlugin extends Plugin { }); } + public GceDiscoveryPlugin(Settings settings) { + this.settings = settings; + logger.trace("starting gce discovery plugin..."); + } + @Override public Collection createGuiceModules() { - return Collections.singletonList(new GceModule()); + return Collections.singletonList(new GceModule(settings)); } @Override @SuppressWarnings("rawtypes") // Supertype uses raw type public Collection> getGuiceServiceClasses() { - return Collections.singletonList(GceModule.getComputeServiceImpl()); + logger.debug("Register gce compute service"); + Collection> services = new ArrayList<>(); + services.add(GceModule.getComputeServiceImpl()); + return services; } public void onModule(DiscoveryModule discoveryModule) { + logger.debug("Register gce discovery type and gce unicast provider"); discoveryModule.addDiscoveryType(GCE, ZenDiscovery.class); - // If discovery.type: gce, we add Gce as a unicast provider - discoveryModule.addUnicastHostProvider(GCE, GceUnicastHostsProvider.class); + discoveryModule.addUnicastHostProvider(GCE, GceUnicastHostsProvider.class); + } + + @Override + public NetworkService.CustomNameResolver getCustomNameResolver(Settings settings) { + logger.debug("Register _gce_, _gce:xxx network names"); + return new GceNameResolver(settings, new GceMetadataService(settings)); } @Override public List> getSettings() { return Arrays.asList( - // Register GCE settings - GceComputeService.PROJECT_SETTING, - GceComputeService.ZONE_SETTING, - GceUnicastHostsProvider.TAGS_SETTING, - GceComputeService.REFRESH_SETTING, - GceComputeService.RETRY_SETTING, - GceComputeService.MAX_WAIT_SETTING); + // Register GCE settings + GceInstancesService.PROJECT_SETTING, + GceInstancesService.ZONE_SETTING, + GceUnicastHostsProvider.TAGS_SETTING, + GceInstancesService.REFRESH_SETTING, + GceInstancesService.RETRY_SETTING, + GceInstancesService.MAX_WAIT_SETTING); } } diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoverTests.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoverTests.java index 8787f5df791..ef308ac886b 100644 --- a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoverTests.java +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoverTests.java @@ -23,14 +23,14 @@ import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsConfigurator; import com.sun.net.httpserver.HttpsServer; -import org.elasticsearch.cloud.gce.GceComputeServiceImpl; +import org.elasticsearch.cloud.gce.GceInstancesServiceImpl; +import org.elasticsearch.cloud.gce.GceMetadataService; import org.elasticsearch.common.SuppressForbidden; import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.plugin.discovery.gce.GceDiscoveryPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; @@ -67,8 +67,8 @@ public class GceDiscoverTests extends ESIntegTestCase { public static class TestPlugin extends Plugin { @Override public List> getSettings() { - return Arrays.asList(GceComputeServiceImpl.GCE_HOST, GceComputeServiceImpl.GCE_ROOT_URL, - GceComputeServiceImpl.GCE_VALIDATE_CERTIFICATES); + return Arrays.asList(GceMetadataService.GCE_HOST, GceInstancesServiceImpl.GCE_ROOT_URL, + GceInstancesServiceImpl.GCE_VALIDATE_CERTIFICATES); } } @@ -113,7 +113,7 @@ public class GceDiscoverTests extends ESIntegTestCase { httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress().getHostAddress(), 0), 0); httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext)); httpServer.createContext("/computeMetadata/v1/instance/service-accounts/default/token", (s) -> { - String response = GceComputeServiceMock.readGoogleInternalJsonResponse( + String response = GceMockUtils.readGoogleInternalJsonResponse( "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"); byte[] responseAsBytes = response.getBytes(StandardCharsets.UTF_8); s.sendResponseHeaders(200, responseAsBytes.length); diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoveryTests.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoveryTests.java index 92eb12a99b2..08e7ee963d3 100644 --- a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoveryTests.java +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceDiscoveryTests.java @@ -20,8 +20,7 @@ package org.elasticsearch.discovery.gce; import org.elasticsearch.Version; -import org.elasticsearch.cloud.gce.GceComputeService; -import org.elasticsearch.cluster.ClusterName; +import org.elasticsearch.cloud.gce.GceInstancesServiceImpl; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.common.network.NetworkService; import org.elasticsearch.common.settings.Settings; @@ -34,6 +33,7 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import java.util.Collections; import java.util.List; import java.util.Locale; @@ -67,8 +67,7 @@ public class GceDiscoveryTests extends ESTestCase { protected static ThreadPool threadPool; protected MockTransportService transportService; - protected NetworkService networkService; - protected GceComputeService mock; + protected GceInstancesServiceMock mock; protected String projectName; @BeforeClass @@ -98,11 +97,6 @@ public class GceDiscoveryTests extends ESTestCase { transportService = MockTransportService.local(Settings.EMPTY, Version.CURRENT, threadPool); } - @Before - public void createNetworkService() { - networkService = new NetworkService(Settings.EMPTY); - } - @After public void stopGceComputeService() { if (mock != null) { @@ -110,9 +104,9 @@ public class GceDiscoveryTests extends ESTestCase { } } - protected List buildDynamicNodes(GceComputeService gceComputeService, Settings nodeSettings) { - GceUnicastHostsProvider provider = new GceUnicastHostsProvider(nodeSettings, gceComputeService, transportService, - new NetworkService(Settings.EMPTY)); + protected List buildDynamicNodes(GceInstancesServiceImpl gceInstancesService, Settings nodeSettings) { + GceUnicastHostsProvider provider = new GceUnicastHostsProvider(nodeSettings, gceInstancesService, + transportService, new NetworkService(Settings.EMPTY, Collections.emptyList())); List discoveryNodes = provider.buildDynamicNodes(); logger.info("--> nodes found: {}", discoveryNodes); @@ -121,21 +115,21 @@ public class GceDiscoveryTests extends ESTestCase { public void testNodesWithDifferentTagsAndNoTagSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } public void testNodesWithDifferentTagsAndOneTagSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .putArray(GceUnicastHostsProvider.TAGS_SETTING.getKey(), "elasticsearch") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(1)); assertThat(discoveryNodes.get(0).getId(), is("#cloud-test2-0")); @@ -143,11 +137,11 @@ public class GceDiscoveryTests extends ESTestCase { public void testNodesWithDifferentTagsAndTwoTagSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .putArray(GceUnicastHostsProvider.TAGS_SETTING.getKey(), "elasticsearch", "dev") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(1)); assertThat(discoveryNodes.get(0).getId(), is("#cloud-test2-0")); @@ -155,52 +149,52 @@ public class GceDiscoveryTests extends ESTestCase { public void testNodesWithSameTagsAndNoTagSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } public void testNodesWithSameTagsAndOneTagSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .putArray(GceUnicastHostsProvider.TAGS_SETTING.getKey(), "elasticsearch") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } public void testNodesWithSameTagsAndTwoTagsSet() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .put(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b") .putArray(GceUnicastHostsProvider.TAGS_SETTING.getKey(), "elasticsearch", "dev") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } public void testMultipleZonesAndTwoNodesInSameZone() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .putArray(GceComputeService.ZONE_SETTING.getKey(), "us-central1-a", "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .putArray(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "us-central1-a", "europe-west1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } public void testMultipleZonesAndTwoNodesInDifferentZones() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .putArray(GceComputeService.ZONE_SETTING.getKey(), "us-central1-a", "europe-west1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .putArray(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "us-central1-a", "europe-west1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(2)); } @@ -210,17 +204,17 @@ public class GceDiscoveryTests extends ESTestCase { */ public void testZeroNode43() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .putArray(GceComputeService.ZONE_SETTING.getKey(), "us-central1-a", "us-central1-b") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .putArray(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "us-central1-a", "us-central1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(0)); } public void testIllegalSettingsMissingAllRequired() { Settings nodeSettings = Settings.EMPTY; - mock = new GceComputeServiceMock(Settings.EMPTY, networkService); + mock = new GceInstancesServiceMock(nodeSettings); try { buildDynamicNodes(mock, nodeSettings); fail("We expect an IllegalArgumentException for incomplete settings"); @@ -231,9 +225,9 @@ public class GceDiscoveryTests extends ESTestCase { public void testIllegalSettingsMissingProject() { Settings nodeSettings = Settings.builder() - .putArray(GceComputeService.ZONE_SETTING.getKey(), "us-central1-a", "us-central1-b") + .putArray(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "us-central1-a", "us-central1-b") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); try { buildDynamicNodes(mock, nodeSettings); fail("We expect an IllegalArgumentException for incomplete settings"); @@ -244,9 +238,9 @@ public class GceDiscoveryTests extends ESTestCase { public void testIllegalSettingsMissingZone() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); try { buildDynamicNodes(mock, nodeSettings); fail("We expect an IllegalArgumentException for incomplete settings"); @@ -262,10 +256,10 @@ public class GceDiscoveryTests extends ESTestCase { */ public void testNoRegionReturnsEmptyList() { Settings nodeSettings = Settings.builder() - .put(GceComputeService.PROJECT_SETTING.getKey(), projectName) - .putArray(GceComputeService.ZONE_SETTING.getKey(), "europe-west1-b", "us-central1-a") + .put(GceInstancesServiceImpl.PROJECT_SETTING.getKey(), projectName) + .putArray(GceInstancesServiceImpl.ZONE_SETTING.getKey(), "europe-west1-b", "us-central1-a") .build(); - mock = new GceComputeServiceMock(nodeSettings, networkService); + mock = new GceInstancesServiceMock(nodeSettings); List discoveryNodes = buildDynamicNodes(mock, nodeSettings); assertThat(discoveryNodes, hasSize(1)); } diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceInstancesServiceMock.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceInstancesServiceMock.java new file mode 100644 index 00000000000..91a37a4d106 --- /dev/null +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceInstancesServiceMock.java @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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. + */ + +package org.elasticsearch.discovery.gce; + +import com.google.api.client.http.HttpTransport; +import org.elasticsearch.cloud.gce.GceInstancesServiceImpl; +import org.elasticsearch.common.settings.Settings; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +/** + * + */ +public class GceInstancesServiceMock extends GceInstancesServiceImpl { + + protected HttpTransport mockHttpTransport; + + public GceInstancesServiceMock(Settings settings) { + super(settings); + this.mockHttpTransport = GceMockUtils.configureMock(); + } + + @Override + protected HttpTransport getGceHttpTransport() throws GeneralSecurityException, IOException { + return this.mockHttpTransport; + } +} diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMetadataServiceMock.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMetadataServiceMock.java new file mode 100644 index 00000000000..58c50f47a1f --- /dev/null +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMetadataServiceMock.java @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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. + */ + +package org.elasticsearch.discovery.gce; + +import com.google.api.client.http.HttpTransport; +import org.elasticsearch.cloud.gce.GceMetadataService; +import org.elasticsearch.common.settings.Settings; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +/** + * Mock for GCE Metadata Service + */ +public class GceMetadataServiceMock extends GceMetadataService { + + protected HttpTransport mockHttpTransport; + + public GceMetadataServiceMock(Settings settings) { + super(settings); + this.mockHttpTransport = GceMockUtils.configureMock(); + } + + @Override + protected HttpTransport getGceHttpTransport() throws GeneralSecurityException, IOException { + return this.mockHttpTransport; + } +} diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceComputeServiceMock.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMockUtils.java similarity index 82% rename from plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceComputeServiceMock.java rename to plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMockUtils.java index 209657d89d4..88a6fbd9e92 100644 --- a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceComputeServiceMock.java +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceMockUtils.java @@ -26,38 +26,22 @@ import com.google.api.client.json.Json; import com.google.api.client.testing.http.MockHttpTransport; import com.google.api.client.testing.http.MockLowLevelHttpRequest; import com.google.api.client.testing.http.MockLowLevelHttpResponse; -import org.elasticsearch.cloud.gce.GceComputeServiceImpl; import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.Streams; -import org.elasticsearch.common.network.NetworkService; -import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.logging.ESLogger; +import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.util.Callback; import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.security.GeneralSecurityException; -/** - * - */ -public class GceComputeServiceMock extends GceComputeServiceImpl { - - protected HttpTransport mockHttpTransport; - - public GceComputeServiceMock(Settings settings, NetworkService networkService) { - super(settings, networkService); - this.mockHttpTransport = configureMock(); - } - - @Override - protected HttpTransport getGceHttpTransport() throws GeneralSecurityException, IOException { - return this.mockHttpTransport; - } +public class GceMockUtils { + protected static final ESLogger logger = Loggers.getLogger(GceMockUtils.class); public static final String GCE_METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/instance"; - protected HttpTransport configureMock() { + protected static HttpTransport configureMock() { return new MockHttpTransport() { @Override public LowLevelHttpRequest buildRequest(String method, final String url) throws IOException { @@ -94,7 +78,7 @@ public class GceComputeServiceMock extends GceComputeServiceImpl { // We extract from the url the mock file path we want to use String mockFileName = Strings.replace(url, urlRoot, ""); - URL resource = GceComputeServiceMock.class.getResource(mockFileName); + URL resource = GceMockUtils.class.getResource(mockFileName); if (resource == null) { throw new IOException("can't read [" + url + "] in src/test/resources/org/elasticsearch/discovery/gce"); } diff --git a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceNetworkTests.java b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceNetworkTests.java index c09e51fe1ef..5b7b5e2e4d1 100644 --- a/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceNetworkTests.java +++ b/plugins/discovery-gce/src/test/java/org/elasticsearch/discovery/gce/GceNetworkTests.java @@ -26,6 +26,8 @@ import org.elasticsearch.test.ESTestCase; import java.io.IOException; import java.net.InetAddress; +import java.util.Collections; +import java.util.List; import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.containsString; @@ -79,7 +81,8 @@ public class GceNetworkTests extends ESTestCase { * network.host: _local_ */ public void networkHostCoreLocal() throws IOException { - resolveGce("_local_", new NetworkService(Settings.EMPTY).resolveBindHostAddresses(new String[] { NetworkService.DEFAULT_NETWORK_HOST })); + resolveGce("_local_", new NetworkService(Settings.EMPTY, Collections.emptyList()) + .resolveBindHostAddresses(new String[] { NetworkService.DEFAULT_NETWORK_HOST })); } /** @@ -103,9 +106,8 @@ public class GceNetworkTests extends ESTestCase { .put("network.host", gceNetworkSetting) .build(); - NetworkService networkService = new NetworkService(nodeSettings); - GceComputeServiceMock mock = new GceComputeServiceMock(nodeSettings, networkService); - networkService.addCustomNameResolver(new GceNameResolver(nodeSettings, mock)); + GceMetadataServiceMock mock = new GceMetadataServiceMock(nodeSettings); + NetworkService networkService = new NetworkService(nodeSettings, Collections.singletonList(new GceNameResolver(nodeSettings, mock))); try { InetAddress[] addresses = networkService.resolveBindHostAddresses(null); if (expected == null) { diff --git a/test/framework/src/test/java/org/elasticsearch/transport/MockTcpTransportTests.java b/test/framework/src/test/java/org/elasticsearch/transport/MockTcpTransportTests.java index f94bd11b00c..6cec62cb710 100644 --- a/test/framework/src/test/java/org/elasticsearch/transport/MockTcpTransportTests.java +++ b/test/framework/src/test/java/org/elasticsearch/transport/MockTcpTransportTests.java @@ -26,12 +26,14 @@ import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; import org.elasticsearch.test.transport.MockTransportService; +import java.util.Collections; + public class MockTcpTransportTests extends AbstractSimpleTransportTestCase { @Override protected MockTransportService build(Settings settings, Version version) { NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry(); Transport transport = new MockTcpTransport(settings, threadPool, BigArrays.NON_RECYCLING_INSTANCE, - new NoneCircuitBreakerService(), namedWriteableRegistry, new NetworkService(settings), version); + new NoneCircuitBreakerService(), namedWriteableRegistry, new NetworkService(settings, Collections.emptyList()), version); MockTransportService mockTransportService = new MockTransportService(Settings.EMPTY, transport, threadPool); mockTransportService.start(); return mockTransportService;