/*
* 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 org.elasticsearch.cloud.gce.network.GceNameResolver;
import org.elasticsearch.common.network.NetworkService;
import org.elasticsearch.common.settings.Settings;
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;
/**
* Test for GCE network.host settings.
* Related to https://github.com/elastic/elasticsearch/issues/13605
*/
public class GceNetworkTests extends ESTestCase {
/**
* Test for network.host: _gce_
*/
public void testNetworkHostGceDefault() throws IOException {
resolveGce("_gce_", InetAddress.getByName("10.240.0.2"));
}
/**
* Test for network.host: _gce:privateIp_
*/
public void testNetworkHostPrivateIp() throws IOException {
resolveGce("_gce:privateIp_", InetAddress.getByName("10.240.0.2"));
}
/**
* Test for network.host: _gce:hostname_
*/
public void testNetworkHostPrivateDns() throws IOException {
resolveGce("_gce:hostname_", InetAddress.getByName("localhost"));
}
/**
* Test for network.host: _gce:doesnotexist_
* This should raise an IllegalArgumentException as this setting does not exist
*/
public void testNetworkHostWrongSetting() throws IOException {
resolveGce("_gce:doesnotexist_", (InetAddress) null);
}
/**
* Test with multiple network interfaces:
* network.host: _gce:privateIp:0_
* network.host: _gce:privateIp:1_
*/
public void testNetworkHostPrivateIpInterface() throws IOException {
resolveGce("_gce:privateIp:0_", InetAddress.getByName("10.240.0.2"));
resolveGce("_gce:privateIp:1_", InetAddress.getByName("10.150.0.1"));
}
/**
* Test that we don't have any regression with network host core settings such as
* network.host: _local_
*/
public void networkHostCoreLocal() throws IOException {
resolveGce("_local_", new NetworkService(Settings.EMPTY, Collections.emptyList())
.resolveBindHostAddresses(new String[] { NetworkService.DEFAULT_NETWORK_HOST }));
}
/**
* Utility test method to test different settings
* @param gceNetworkSetting tested network.host property
* @param expected expected InetAddress, null if we expect an exception
* @throws IOException Well... If something goes wrong :)
*/
private void resolveGce(String gceNetworkSetting, InetAddress expected) throws IOException {
resolveGce(gceNetworkSetting, expected == null ? null : new InetAddress [] { expected });
}
/**
* Utility test method to test different settings
* @param gceNetworkSetting tested network.host property
* @param expected expected InetAddress, null if we expect an exception
* @throws IOException Well... If something goes wrong :)
*/
private void resolveGce(String gceNetworkSetting, InetAddress[] expected) throws IOException {
Settings nodeSettings = Settings.builder()
.put("network.host", gceNetworkSetting)
.build();
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) {
fail("We should get a IllegalArgumentException when setting network.host: _gce:doesnotexist_");
}
assertThat(addresses, arrayContaining(expected));
} catch (IllegalArgumentException e) {
if (expected != null) {
// We were expecting something and not an exception
throw e;
}
// We check that we get the expected exception
assertThat(e.getMessage(), containsString("is not one of the supported GCE network.host setting"));
}
}
}