Skip to content

Commit ba9d4da

Browse files
ES-10242 Update TransportNodesCapabilitiesAction for V9
1 parent 66d18d0 commit ba9d4da

File tree

6 files changed

+49
-21
lines changed

6 files changed

+49
-21
lines changed

libs/core/src/main/java/org/elasticsearch/core/RestApiVersion.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,11 @@ public static Predicate<RestApiVersion> onOrAfter(RestApiVersion restApiVersion)
6161
};
6262
}
6363

64-
public static RestApiVersion forMajor(int major) {
65-
switch (major) {
66-
case 8 -> {
67-
return V_8;
68-
}
69-
case 9 -> {
70-
return V_9;
71-
}
72-
default -> throw new IllegalArgumentException("Unknown REST API version " + major);
73-
}
64+
public static RestApiVersion forMajorIfKnown(int major) {
65+
return switch (major) {
66+
case 8 -> V_8;
67+
case 9 -> V_9;
68+
default -> null;
69+
};
7470
}
7571
}

server/src/internalClusterTest/java/org/elasticsearch/nodescapabilities/SimpleNodesCapabilitiesIT.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
1313
import org.elasticsearch.action.admin.cluster.node.capabilities.NodesCapabilitiesRequest;
1414
import org.elasticsearch.action.admin.cluster.node.capabilities.NodesCapabilitiesResponse;
15+
import org.elasticsearch.core.RestApiVersion;
1516
import org.elasticsearch.test.ESIntegTestCase;
1617

1718
import java.io.IOException;
@@ -43,6 +44,13 @@ public void testNodesCapabilities() throws IOException {
4344
assertThat(response.getNodes(), hasSize(2));
4445
assertThat(response.isSupported(), isPresentWith(true));
4546

47+
// check we support REST API version parameters of the capabilities API
48+
response = clusterAdmin().nodesCapabilities(new NodesCapabilitiesRequest().path("_capabilities").parameters("method", "path")
49+
.restApiVersion(RestApiVersion.current()))
50+
.actionGet();
51+
assertThat(response.getNodes(), hasSize(2));
52+
assertThat(response.isSupported(), isPresentWith(true));
53+
4654
// check we don't support some other parameters of the capabilities API
4755
response = clusterAdmin().nodesCapabilities(new NodesCapabilitiesRequest().path("_capabilities").parameters("method", "invalid"))
4856
.actionGet();

server/src/main/java/org/elasticsearch/action/admin/cluster/node/capabilities/NodesCapabilitiesRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class NodesCapabilitiesRequest extends BaseNodesRequest {
2222
private String path = "/";
2323
private Set<String> parameters = Set.of();
2424
private Set<String> capabilities = Set.of();
25-
private RestApiVersion restApiVersion = RestApiVersion.current();
25+
private RestApiVersion restApiVersion = null;
2626

2727
public NodesCapabilitiesRequest() {
2828
// send to all nodes

server/src/main/java/org/elasticsearch/action/admin/cluster/node/capabilities/TransportNodesCapabilitiesAction.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,19 @@ protected NodeCapability nodeOperation(NodeCapabilitiesRequest request, Task tas
9393
request.path,
9494
request.parameters,
9595
request.capabilities,
96-
request.restApiVersion
96+
request.restApiVersionMajor
9797
);
9898
return new NodeCapability(supported, transportService.getLocalNode());
9999
}
100100

101101
public static class NodeCapabilitiesRequest extends TransportRequest {
102+
private static final int IMPLICIT_REST_API_VERSION = 0;
103+
102104
private final RestRequest.Method method;
103105
private final String path;
104106
private final Set<String> parameters;
105107
private final Set<String> capabilities;
106-
private final RestApiVersion restApiVersion;
108+
private final Byte restApiVersionMajor;
107109

108110
public NodeCapabilitiesRequest(StreamInput in) throws IOException {
109111
super(in);
@@ -112,7 +114,8 @@ public NodeCapabilitiesRequest(StreamInput in) throws IOException {
112114
path = in.readString();
113115
parameters = in.readCollectionAsImmutableSet(StreamInput::readString);
114116
capabilities = in.readCollectionAsImmutableSet(StreamInput::readString);
115-
restApiVersion = RestApiVersion.forMajor(in.readVInt());
117+
byte versionFromMessage = (byte) in.readVInt();
118+
restApiVersionMajor = (versionFromMessage != IMPLICIT_REST_API_VERSION) ? versionFromMessage : null;
116119
}
117120

118121
public NodeCapabilitiesRequest(
@@ -126,7 +129,7 @@ public NodeCapabilitiesRequest(
126129
this.path = path;
127130
this.parameters = Set.copyOf(parameters);
128131
this.capabilities = Set.copyOf(capabilities);
129-
this.restApiVersion = restApiVersion;
132+
this.restApiVersionMajor = (restApiVersion != null) ? restApiVersion.major : null;
130133
}
131134

132135
@UpdateForV9(owner = UpdateForV9.Owner.CORE_INFRA) // 8.x blows up in a mixed cluster when trying to read RestApiVersion.forMajor(9)
@@ -141,9 +144,11 @@ public void writeTo(StreamOutput out) throws IOException {
141144
out.writeString(path);
142145
out.writeCollection(parameters, StreamOutput::writeString);
143146
out.writeCollection(capabilities, StreamOutput::writeString);
144-
// Fixme: lies! all lies!
145-
out.writeVInt(8);
146-
// out.writeVInt(restApiVersion.major);
147+
if (restApiVersionMajor == null) {
148+
out.writeVInt(IMPLICIT_REST_API_VERSION);
149+
} else {
150+
out.writeVInt(restApiVersionMajor);
151+
}
147152
}
148153
}
149154
}

server/src/main/java/org/elasticsearch/rest/RestController.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,14 @@ public boolean checkSupported(
350350
String path,
351351
Set<String> parameters,
352352
Set<String> capabilities,
353-
RestApiVersion restApiVersion
353+
Byte restApiVersionMajor
354354
) {
355+
RestApiVersion restApiVersion = getRestApiVersionIfKnown(restApiVersionMajor);
356+
// if explicitly requested RestApiVersion is not known by this node, it should respond that it doesn't support the capability
357+
if (restApiVersion == null) {
358+
return false;
359+
}
360+
355361
Iterator<MethodHandlers> allHandlers = getAllHandlers(null, path);
356362
while (allHandlers.hasNext()) {
357363
RestHandler handler;
@@ -373,6 +379,16 @@ public boolean checkSupported(
373379
return false;
374380
}
375381

382+
private static RestApiVersion getRestApiVersionIfKnown(Byte restApiVersionMajor) {
383+
RestApiVersion restApiVersion;
384+
if (restApiVersionMajor == null) {
385+
restApiVersion = RestApiVersion.current();
386+
} else {
387+
restApiVersion = RestApiVersion.forMajorIfKnown(restApiVersionMajor);
388+
}
389+
return restApiVersion;
390+
}
391+
376392
@Override
377393
public Map<String, HttpRouteStats> getStats() {
378394
final Iterator<MethodHandlers> methodHandlersIterator = handlers.allNodeValues();

server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestNodesCapabilitiesAction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,11 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
6666
NodesCapabilitiesRequest r = requestNodes.method(RestRequest.Method.valueOf(request.param("method", "GET")))
6767
.path(path)
6868
.parameters(request.paramAsStringArray("parameters", Strings.EMPTY_ARRAY))
69-
.capabilities(request.paramAsStringArray("capabilities", Strings.EMPTY_ARRAY))
70-
.restApiVersion(request.getRestApiVersion());
69+
.capabilities(request.paramAsStringArray("capabilities", Strings.EMPTY_ARRAY));
70+
71+
if (request.hasExplicitRestApiVersion()) {
72+
r.restApiVersion(request.getRestApiVersion());
73+
}
7174

7275
return channel -> client.admin().cluster().nodesCapabilities(r, new NodesResponseRestListener<>(channel));
7376
}

0 commit comments

Comments
 (0)