package com.github.obourgain.elasticsearch.http.handler.admin.cluster;
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.cluster.state.ClusterStateAction;
import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
import org.elasticsearch.common.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.obourgain.elasticsearch.http.client.HttpClusterAdminClient;
import com.github.obourgain.elasticsearch.http.concurrent.ListenerCompleterObserver;
import com.github.obourgain.elasticsearch.http.response.ErrorHandler;
import com.google.common.base.Joiner;
import io.netty.buffer.ByteBuf;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import io.reactivex.netty.protocol.http.client.HttpClientResponse;
import rx.Observable;
import rx.functions.Func1;
/**
* @author olivier bourgain
*/
public class ClusterStateActionHandler {
private static final Logger logger = LoggerFactory.getLogger(ClusterStateActionHandler.class);
private final HttpClusterAdminClient indicesAdminClient;
public ClusterStateActionHandler(HttpClusterAdminClient httpClusterAdminClient) {
this.indicesAdminClient = httpClusterAdminClient;
}
public ClusterStateAction getAction() {
return ClusterStateAction.INSTANCE;
}
public void execute(ClusterStateRequest request, final ActionListener<ClusterStateResponse> listener) {
logger.debug("cluster state request {}", request);
try {
// TODO test
List<String> metricsAsList = new ArrayList<>();
if (request.blocks()) {
metricsAsList.add("blocks");
}
if (request.routingTable()) {
metricsAsList.add("routing_table");
}
if (request.nodes()) {
metricsAsList.add("nodes");
}
if (request.metaData()) {
metricsAsList.add("metadata");
}
String metrics;
if (metricsAsList.isEmpty()) {
metrics = "_all";
} else {
// TODO version and master_node are not in the request, so add them by default
metricsAsList.add("version");
metricsAsList.add("master_node");
metrics = Joiner.on(",").join(metricsAsList);
}
String indices = Strings.arrayToCommaDelimitedString(request.indices());
String uri = "/_cluster/state/" + metrics + "/" + indices;
indicesAdminClient.getHttpClient().submit(HttpClientRequest.createPut(uri))
.flatMap(ErrorHandler.AS_FUNC)
.flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<ClusterStateResponse>>() {
@Override
public Observable<ClusterStateResponse> call(HttpClientResponse<ByteBuf> response) {
return response.getContent().flatMap(new Func1<ByteBuf, Observable<ClusterStateResponse>>() {
@Override
public Observable<ClusterStateResponse> call(ByteBuf byteBuf) {
// TODO
return null;
}
});
}
})
.single()
.subscribe(new ListenerCompleterObserver<>(listener));
} catch (Exception e) {
listener.onFailure(e);
}
}
}