Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Rest Api Compatibility] Typed and xpack graph explore api #74185

Merged
merged 4 commits into from
Jun 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.xcontent.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.core.RestApiVersion;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.protocol.xpack.graph.GraphExploreRequest;
Expand All @@ -38,6 +40,11 @@
*/
public class RestGraphAction extends BaseRestHandler {

private static final DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(RestGraphAction.class);
public static final String TYPES_DEPRECATION_MESSAGE = "[types removal]" +
" Specifying types in graph requests is deprecated.";
private static final String URI_BASE = "/_xpack";

public static final ParseField TIMEOUT_FIELD = new ParseField("timeout");
public static final ParseField SIGNIFICANCE_FIELD = new ParseField("use_significance");
public static final ParseField RETURN_DETAILED_INFO = new ParseField("return_detailed_stats");
Expand All @@ -60,8 +67,19 @@ public class RestGraphAction extends BaseRestHandler {
@Override
public List<Route> routes() {
return List.of(
new Route(GET, "/{index}/_graph/explore"),
new Route(POST, "/{index}/_graph/explore"));
Route.builder(GET, "/{index}/_graph/explore")
.replaces(GET, "/{index}" + URI_BASE + "/graph/_explore", RestApiVersion.V_7).build(),
Route.builder(POST, "/{index}/_graph/explore")
.replaces(POST, "/{index}" + URI_BASE + "/graph/_explore", RestApiVersion.V_7).build(),
Route.builder(GET, "/{index}/{type}/_graph/explore")
.deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build(),
Route.builder(GET, "/{index}/{type}" + URI_BASE + "/graph/_explore")
.deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build(),
Route.builder(POST, "/{index}/{type}/_graph/explore")
.deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build(),
Route.builder(POST, "/{index}/{type}" + URI_BASE + "/graph/_explore")
.deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build()
);
}

@Override
Expand All @@ -71,6 +89,11 @@ public String getName() {

@Override
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
if (request.getRestApiVersion() == RestApiVersion.V_7 && request.hasParam("type")) {
deprecationLogger.compatibleApiWarning("graph_with_types", TYPES_DEPRECATION_MESSAGE);
request.param("type");
}

GraphExploreRequest graphRequest = new GraphExploreRequest(Strings.splitStringByCommaToArray(request.param("index")));
graphRequest.indicesOptions(IndicesOptions.fromRequest(request, graphRequest.indicesOptions()));
graphRequest.routing(request.param("routing"));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

package org.elasticsearch.xpack.graph.rest.action;

import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.core.RestApiVersion;
import org.elasticsearch.core.Tuple;
import org.elasticsearch.protocol.xpack.graph.GraphExploreRequest;
import org.elasticsearch.protocol.xpack.graph.GraphExploreResponse;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.test.rest.FakeRestRequest;
import org.elasticsearch.test.rest.RestActionTestCase;
import org.junit.Before;
import org.mockito.Mockito;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import static org.hamcrest.Matchers.instanceOf;

public class RestGraphActionTests extends RestActionTestCase {
private final List<String> compatibleMediaType = Collections.singletonList(randomCompatibleMediaType(RestApiVersion.V_7));

@Before
public void setUpAction() {
controller().registerHandler(new RestGraphAction());
verifyingClient.setExecuteVerifier((actionType, request) -> {
assertThat(request, instanceOf(GraphExploreRequest.class));
return Mockito.mock(GraphExploreResponse.class);
});
}

public void testTypeInPath() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a test for the _xpath variant as well?

Copy link
Contributor Author

@pgomulka pgomulka Jun 17, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point, in fact not all endpoints are correctly deprecated. /{index}/{type}/_xpack/graph/_explore api was indicating to use /{index}/{type}/_graph/explore
I will update this on 7.x and then update this PR too

for (Tuple<RestRequest.Method, String> methodAndPath :
List.of(
Tuple.tuple(RestRequest.Method.GET, "/some_index/some_type/_graph/explore"),
Tuple.tuple(RestRequest.Method.POST, "/some_index/some_type/_graph/explore"),
Tuple.tuple(RestRequest.Method.GET, "/some_index/some_type/_xpack/graph/_explore"),
Tuple.tuple(RestRequest.Method.POST, "/some_index/some_type/_xpack/graph/_explore")
)) {

RestRequest request = new FakeRestRequest.Builder(xContentRegistry())
.withHeaders(Map.of("Accept", compatibleMediaType, "Content-Type",
Collections.singletonList(compatibleMediaType(XContentType.VND_JSON, RestApiVersion.V_7))))
.withMethod(methodAndPath.v1())
.withPath(methodAndPath.v2())
.withContent(new BytesArray("{}"), null)
.build();

dispatchRequest(request);
assertWarnings(RestGraphAction.TYPES_DEPRECATION_MESSAGE);
}
}
}