/**
* Copyright 2017 Netflix, Inc.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 com.netflix.raigad.discovery;
import com.netflix.raigad.discovery.utils.DataFetcher;
import com.netflix.raigad.discovery.utils.ElasticsearchUtil;
import org.elasticsearch.Version;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.discovery.zen.UnicastHostsProvider;
import org.elasticsearch.transport.TransportService;
import java.util.ArrayList;
import java.util.List;
public class RaigadUnicastHostsProvider extends AbstractComponent implements UnicastHostsProvider {
private static final String GET_NODES_ISLAND_URL = "http://127.0.0.1:8080/Raigad/REST/v1/esconfig/get_nodes";
private static final String GET_NODES_TRIBE_URL_PREFIX = "http://127.0.0.1:8080/Raigad/REST/v1/esconfig/get_tribe_nodes/";
private final TransportService transportService;
RaigadUnicastHostsProvider(Settings settings, TransportService transportService) {
super(settings);
this.transportService = transportService;
}
@Override
public List<DiscoveryNode> buildDynamicNodes() {
final List<DiscoveryNode> discoveryNodes = new ArrayList<>();
try {
//Extract tribe ID from name field of settings and query accordingly
String discoveryNodesJsonString;
if (isTribeNode()) {
String nodeName = settings.get("name");
String tribeId = nodeName.substring(nodeName.indexOf("/") + 1);
logger.debug("[raigad-discovery] Tribe node name [{}], ID [{}]", nodeName, tribeId);
discoveryNodesJsonString = DataFetcher.fetchData(GET_NODES_TRIBE_URL_PREFIX + tribeId, logger);
} else {
discoveryNodesJsonString = DataFetcher.fetchData(GET_NODES_ISLAND_URL, logger);
}
List<RaigadInstance> instances = ElasticsearchUtil.getRaigadInstancesFromJsonString(discoveryNodesJsonString, logger);
for (RaigadInstance instance : instances) {
try {
TransportAddress[] addresses = transportService.addressesFromString(instance.getHostIP(), 1);
if (addresses != null && addresses.length > 0) {
logger.info("[raigad-discovery] Adding instance [{}] (address [{}], transport address [{}])",
instance.getId(), instance.getHostIP(), addresses[0]);
discoveryNodes.add(new DiscoveryNode(instance.getId(), addresses[0], Version.CURRENT.minimumCompatibilityVersion()));
}
} catch (Exception e) {
logger.warn("[raigad-discovery] Failed to add instance [{}] (address [{}])", e, instance.getId(), instance.getHostIP());
}
}
} catch (Exception e) {
logger.error("[raigad-discovery] Exception while trying to build dynamic discovery nodes", e);
throw new RuntimeException(e);
}
logger.debug("[raigad-discovery] Using dynamic discovery nodes {}", discoveryNodes);
return discoveryNodes;
}
private boolean isTribeNode() {
if (settings == null) {
return false;
}
String tribeName = settings.get("name");
if (tribeName == null || tribeName.isEmpty()) {
return false;
}
return tribeName.contains("/t");
}
}