package com.github.obourgain.elasticsearch.http.handler.admin.cluster;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthAction;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
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.request.RequestUriBuilder;
import com.github.obourgain.elasticsearch.http.response.ErrorHandler;
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 ClusterHealthActionHandler {
private static final Logger logger = LoggerFactory.getLogger(ClusterHealthActionHandler.class);
private final HttpClusterAdminClient indicesAdminClient;
public ClusterHealthActionHandler(HttpClusterAdminClient httpClusterAdminClient) {
this.indicesAdminClient = httpClusterAdminClient;
}
public ClusterHealthAction getAction() {
return ClusterHealthAction.INSTANCE;
}
public void execute(ClusterHealthRequest request, final ActionListener<ClusterHealthResponse> listener) {
logger.debug("cluster health request {}", request);
try {
// TODO test
StringBuilder url = new StringBuilder();
url.append("_cluster/health");
if (request.indices().length != 0) {
url.append("/").append(Strings.arrayToCommaDelimitedString(request.indices()));
}
RequestUriBuilder uriBuilder = new RequestUriBuilder(url.toString());
// TODO level ? http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-health.html#request-params
uriBuilder.addQueryParameter("level", "shards");
if (request.waitForStatus() != null) {
uriBuilder.addQueryParameter("wait_for_status", request.waitForStatus().name().toLowerCase());
}
uriBuilder.addQueryParameterIfNotMinusOne("wait_for_relocating_shards", request.waitForRelocatingShards());
if (!request.waitForNodes().equals("")) {
uriBuilder.addQueryParameter("wait_for_nodes", request.waitForNodes());
}
uriBuilder.addQueryParameter("timeout", request.timeout().toString());
uriBuilder.addQueryParameter("master_timeout", request.masterNodeTimeout().toString());
indicesAdminClient.getHttpClient().submit(HttpClientRequest.createPut(uriBuilder.toString()))
.flatMap(ErrorHandler.AS_FUNC)
.flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<ClusterHealthResponse>>() {
@Override
public Observable<ClusterHealthResponse> call(HttpClientResponse<ByteBuf> response) {
return response.getContent().flatMap(new Func1<ByteBuf, Observable<ClusterHealthResponse>>() {
@Override
public Observable<ClusterHealthResponse> call(ByteBuf byteBuf) {
// TODO
return null;
}
});
}
})
.single()
.subscribe(new ListenerCompleterObserver<>(listener));
} catch (Exception e) {
listener.onFailure(e);
}
}
}