From ca9902571744a67b791361a092ff160fa7c48a10 Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Wed, 17 Sep 2025 13:35:42 +0100 Subject: [PATCH 01/10] Add role stats to `_security/stats` --- .../referable/roles_security_stats.csv | 1 + .../resources/transport/upper_bounds/9.2.csv | 2 +- .../stats/GetSecurityStatsNodeResponse.java | 44 ++++++++++++++++++- .../GetSecurityStatsNodeResponseTests.java | 40 +++++++++++++++++ .../stats/TransportSecurityStatsAction.java | 20 ++++++++- .../test/security/stats/10_skeleton.yml | 4 +- .../test/security/stats/20_roles_stats.yml | 14 ++++++ 7 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 server/src/main/resources/transport/definitions/referable/roles_security_stats.csv create mode 100644 x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java create mode 100644 x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml diff --git a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv new file mode 100644 index 0000000000000..cec6381023b6b --- /dev/null +++ b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv @@ -0,0 +1 @@ +9169000 diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv index 6e7d51d3d3020..6d4f5e286b6a1 100644 --- a/server/src/main/resources/transport/upper_bounds/9.2.csv +++ b/server/src/main/resources/transport/upper_bounds/9.2.csv @@ -1 +1 @@ -security_stats_endpoint,9168000 +roles_security_stats,9169000 diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponse.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponse.java index 7956ec2eabf87..3834f503caad6 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponse.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponse.java @@ -7,32 +7,74 @@ package org.elasticsearch.xpack.core.security.action.stats; +import org.elasticsearch.TransportVersion; import org.elasticsearch.action.support.nodes.BaseNodeResponse; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.core.Nullable; import org.elasticsearch.xcontent.ToXContentObject; import org.elasticsearch.xcontent.XContentBuilder; import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; public class GetSecurityStatsNodeResponse extends BaseNodeResponse implements ToXContentObject { + private static final TransportVersion ROLES_SECURITY_STATS = TransportVersion.fromName("roles_security_stats"); + + @Nullable + private final Map rolesStoreStats; + public GetSecurityStatsNodeResponse(final StreamInput in) throws IOException { super(in); + this.rolesStoreStats = in.getTransportVersion().supports(ROLES_SECURITY_STATS) ? in.readGenericMap() : null; } - public GetSecurityStatsNodeResponse(final DiscoveryNode node) { + public GetSecurityStatsNodeResponse(final DiscoveryNode node, @Nullable final Map rolesStoreStats) { super(node); + this.rolesStoreStats = rolesStoreStats; } @Override public void writeTo(final StreamOutput out) throws IOException { super.writeTo(out); + if (out.getTransportVersion().supports(ROLES_SECURITY_STATS)) { + out.writeGenericMap(rolesStoreStats); + } } @Override public XContentBuilder toXContent(final XContentBuilder builder, final Params params) throws IOException { + if (rolesStoreStats != null) { + builder.field("roles", rolesStoreStats); + } return builder; } + + @Override + public boolean equals(Object o) { + return this == o + || (o instanceof GetSecurityStatsNodeResponse that + && Objects.equals(getNode(), that.getNode()) + && Objects.equals(rolesStoreStats, that.rolesStoreStats)); + } + + @Override + public int hashCode() { + return Objects.hash(getNode(), rolesStoreStats); + } + + // for testing + @Nullable + Map getRolesStoreStats() { + return rolesStoreStats == null ? null : Collections.unmodifiableMap(rolesStoreStats); + } + + // for testing + DiscoveryNode getDiscoveryNode() { + return getNode(); + } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java new file mode 100644 index 0000000000000..5ecdb7da64a58 --- /dev/null +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java @@ -0,0 +1,40 @@ +/* + * 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.core.security.action.stats; + +import org.elasticsearch.cluster.node.DiscoveryNodeUtils; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.test.AbstractWireSerializingTestCase; + +import java.io.IOException; +import java.util.Map; + +public class GetSecurityStatsNodeResponseTests extends AbstractWireSerializingTestCase { + + @Override + protected Writeable.Reader instanceReader() { + return GetSecurityStatsNodeResponse::new; + } + + @Override + protected GetSecurityStatsNodeResponse createTestInstance() { + return new GetSecurityStatsNodeResponse( + DiscoveryNodeUtils.create(randomUUID()), + randomBoolean() ? null : Map.of("key", randomUUID()) + ); + } + + @Override + protected GetSecurityStatsNodeResponse mutateInstance(GetSecurityStatsNodeResponse instance) throws IOException { + return switch (randomIntBetween(0, 1)) { + case 0 -> new GetSecurityStatsNodeResponse(DiscoveryNodeUtils.create(randomUUID()), instance.getRolesStoreStats()); + case 1 -> new GetSecurityStatsNodeResponse(instance.getDiscoveryNode(), Map.of("key", randomUUID())); + default -> throw new IllegalStateException("Unexpected value"); + }; + } +} diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java index 96cd95a800c3c..43dfef34a5ad9 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java @@ -6,12 +6,14 @@ */ package org.elasticsearch.xpack.security.action.stats; +import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.FailedNodeException; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.nodes.TransportNodesAction; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.core.Nullable; import org.elasticsearch.injection.guice.Inject; import org.elasticsearch.tasks.Task; import org.elasticsearch.threadpool.ThreadPool; @@ -21,9 +23,12 @@ import org.elasticsearch.xpack.core.security.action.stats.GetSecurityStatsNodeResponse; import org.elasticsearch.xpack.core.security.action.stats.GetSecurityStatsNodesRequest; import org.elasticsearch.xpack.core.security.action.stats.GetSecurityStatsNodesResponse; +import org.elasticsearch.xpack.security.authz.store.CompositeRolesStore; import java.io.IOException; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; public class TransportSecurityStatsAction extends TransportNodesAction< GetSecurityStatsNodesRequest, @@ -32,12 +37,16 @@ public class TransportSecurityStatsAction extends TransportNodesAction< GetSecurityStatsNodeResponse, Void> { + @Nullable + private final CompositeRolesStore rolesStore; + @Inject public TransportSecurityStatsAction( ThreadPool threadPool, ClusterService clusterService, TransportService transportService, - ActionFilters actionFilters + ActionFilters actionFilters, + CompositeRolesStore rolesStore ) { super( GetSecurityStatsAction.INSTANCE.name(), @@ -47,6 +56,7 @@ public TransportSecurityStatsAction( GetSecurityStatsNodeRequest::new, threadPool.executor(ThreadPool.Names.MANAGEMENT) ); + this.rolesStore = rolesStore; } @Override @@ -70,6 +80,12 @@ protected GetSecurityStatsNodeResponse newNodeResponse(final StreamInput in, fin @Override protected GetSecurityStatsNodeResponse nodeOperation(final GetSecurityStatsNodeRequest request, final Task task) { - return new GetSecurityStatsNodeResponse(clusterService.localNode()); + final CompletableFuture> rolesStatsFuture = new CompletableFuture<>(); + if (rolesStore == null) { + rolesStatsFuture.complete(null); + } else { + rolesStore.usageStats(ActionListener.wrap(rolesStatsFuture::complete, rolesStatsFuture::completeExceptionally)); + } + return new GetSecurityStatsNodeResponse(clusterService.localNode(), rolesStatsFuture.join()); } } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/10_skeleton.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/10_skeleton.yml index 512e7c1f6e474..82ccee6b07a0b 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/10_skeleton.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/10_skeleton.yml @@ -1,5 +1,5 @@ --- -"Security stats returns empty response": +"Security stats returns a number of stats": - requires: cluster_features: [ "security_stats_endpoint" ] reason: Introduced in 9.2 @@ -9,4 +9,4 @@ - set: nodes._arbitrary_key_: node_id - - length: { nodes.$node_id: 0 } + - length: { nodes.$node_id: 1 } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml new file mode 100644 index 0000000000000..80ecac97f9da6 --- /dev/null +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml @@ -0,0 +1,14 @@ +--- +"Security stats return roles stats": + - requires: + cluster_features: [ "security_stats_endpoint" ] + reason: Introduced in 9.2 + + - do: + security.get_stats: {} + + - set: + nodes._arbitrary_key_: node_id + - match: { nodes.$node_id.roles.dls.bit_set_cache.hits: 0 } + - match: { nodes.$node_id.roles.file.remote_indices: 0 } + - match: { nodes.$node_id.roles.native.remote_indices: 0 } From 5d1135ad2509cf8e544a8235a57bb33f46c84c7b Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Tue, 23 Sep 2025 15:01:24 +0100 Subject: [PATCH 02/10] fix yaml tests --- .../rest-api-spec/test/security/stats/20_roles_stats.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml index 80ecac97f9da6..ff734cd935425 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml @@ -9,6 +9,6 @@ - set: nodes._arbitrary_key_: node_id - - match: { nodes.$node_id.roles.dls.bit_set_cache.hits: 0 } - - match: { nodes.$node_id.roles.file.remote_indices: 0 } - - match: { nodes.$node_id.roles.native.remote_indices: 0 } + - gte: { nodes.$node_id.roles.dls.bit_set_cache.count: 0 } + - gte: { nodes.$node_id.roles.file.size: 0 } + - gte: { nodes.$node_id.roles.native.size: 0 } From fadf041b68643c4751c1f6b756c7de450a75d1bc Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Tue, 23 Sep 2025 16:57:42 +0100 Subject: [PATCH 03/10] Update docs/changelog/135271.yaml --- docs/changelog/135271.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/135271.yaml diff --git a/docs/changelog/135271.yaml b/docs/changelog/135271.yaml new file mode 100644 index 0000000000000..7561cfb4f68c0 --- /dev/null +++ b/docs/changelog/135271.yaml @@ -0,0 +1,5 @@ +pr: 135271 +summary: Add role stats to `_security/stats` +area: Authorization +type: enhancement +issues: [] From 06f3f9835e2ad42a41b7756e80e81ff90faf1a70 Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Tue, 23 Sep 2025 17:02:50 +0100 Subject: [PATCH 04/10] update transport --- .../transport/definitions/referable/roles_security_stats.csv | 2 +- server/src/main/resources/transport/upper_bounds/9.2.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv index cec6381023b6b..e9954a5466961 100644 --- a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv +++ b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv @@ -1 +1 @@ -9169000 +9170000 diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv index b1209b927d8a5..c70a6f832157c 100644 --- a/server/src/main/resources/transport/upper_bounds/9.2.csv +++ b/server/src/main/resources/transport/upper_bounds/9.2.csv @@ -1 +1 @@ -inference_api_openai_embeddings_headers,9169000 +roles_security_stats,9170000 From 61d6bee8739424a7b99f0f7fb7762b69d73eb3e8 Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Thu, 25 Sep 2025 14:08:13 +0100 Subject: [PATCH 05/10] return just DLS stats --- .../action/stats/TransportSecurityStatsAction.java | 14 ++++---------- .../security/authz/store/CompositeRolesStore.java | 4 ++++ .../test/security/stats/20_roles_stats.yml | 8 +++++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java index 43dfef34a5ad9..6ca798100484d 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java @@ -6,7 +6,6 @@ */ package org.elasticsearch.xpack.security.action.stats; -import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.FailedNodeException; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.nodes.TransportNodesAction; @@ -27,8 +26,6 @@ import java.io.IOException; import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; public class TransportSecurityStatsAction extends TransportNodesAction< GetSecurityStatsNodesRequest, @@ -80,12 +77,9 @@ protected GetSecurityStatsNodeResponse newNodeResponse(final StreamInput in, fin @Override protected GetSecurityStatsNodeResponse nodeOperation(final GetSecurityStatsNodeRequest request, final Task task) { - final CompletableFuture> rolesStatsFuture = new CompletableFuture<>(); - if (rolesStore == null) { - rolesStatsFuture.complete(null); - } else { - rolesStore.usageStats(ActionListener.wrap(rolesStatsFuture::complete, rolesStatsFuture::completeExceptionally)); - } - return new GetSecurityStatsNodeResponse(clusterService.localNode(), rolesStatsFuture.join()); + return new GetSecurityStatsNodeResponse( + clusterService.localNode(), + rolesStore == null ? null : rolesStore.usageStatsWithJustDls() + ); } } diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/store/CompositeRolesStore.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/store/CompositeRolesStore.java index be181af4fcd86..9304394297e52 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/store/CompositeRolesStore.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/store/CompositeRolesStore.java @@ -669,6 +669,10 @@ Iterable> cachedRoles() { return this.roleCache.keys(); } + public Map usageStatsWithJustDls() { + return Map.of("dls", Map.of("bit_set_cache", dlsBitsetCache.usageStats())); + } + public void usageStats(ActionListener> listener) { final Map usage = new HashMap<>(); usage.put("dls", Map.of("bit_set_cache", dlsBitsetCache.usageStats())); diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml index ff734cd935425..e6901582630f8 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/security/stats/20_roles_stats.yml @@ -1,5 +1,5 @@ --- -"Security stats return roles stats": +"Security stats return just DLS stats": - requires: cluster_features: [ "security_stats_endpoint" ] reason: Introduced in 9.2 @@ -9,6 +9,8 @@ - set: nodes._arbitrary_key_: node_id + - length: { nodes.$node_id: 1 } + - length: { nodes.$node_id.roles: 1 } + - length: { nodes.$node_id.roles.dls: 1 } + - length: { nodes.$node_id.roles.dls.bit_set_cache: 8 } - gte: { nodes.$node_id.roles.dls.bit_set_cache.count: 0 } - - gte: { nodes.$node_id.roles.file.size: 0 } - - gte: { nodes.$node_id.roles.native.size: 0 } From 1d43baab7eb0b9fddc636ed7794e2c44eae1a46b Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Thu, 25 Sep 2025 14:12:10 +0100 Subject: [PATCH 06/10] update transport --- .../transport/definitions/referable/roles_security_stats.csv | 2 +- server/src/main/resources/transport/upper_bounds/9.2.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv index e9954a5466961..42d1df167e3b9 100644 --- a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv +++ b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv @@ -1 +1 @@ -9170000 +9172000 diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv index f69c2d7fac9a6..200c08c7725f6 100644 --- a/server/src/main/resources/transport/upper_bounds/9.2.csv +++ b/server/src/main/resources/transport/upper_bounds/9.2.csv @@ -1 +1 @@ -esql_fuse_linear_operator_status,9171000 +roles_security_stats,9172000 From f3c503d085429f25c3c6ca207d8242c53a5ba2ee Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Thu, 25 Sep 2025 14:15:47 +0100 Subject: [PATCH 07/10] spotless --- .../security/action/stats/TransportSecurityStatsAction.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java index 6ca798100484d..5ded7055c048a 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/stats/TransportSecurityStatsAction.java @@ -77,9 +77,6 @@ protected GetSecurityStatsNodeResponse newNodeResponse(final StreamInput in, fin @Override protected GetSecurityStatsNodeResponse nodeOperation(final GetSecurityStatsNodeRequest request, final Task task) { - return new GetSecurityStatsNodeResponse( - clusterService.localNode(), - rolesStore == null ? null : rolesStore.usageStatsWithJustDls() - ); + return new GetSecurityStatsNodeResponse(clusterService.localNode(), rolesStore == null ? null : rolesStore.usageStatsWithJustDls()); } } From 8459878f30ef99463d24444ba8b50739fb81e39d Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Fri, 26 Sep 2025 11:17:35 +0100 Subject: [PATCH 08/10] changelog and no birthday problems (no one wants those) --- docs/changelog/135271.yaml | 2 +- .../GetSecurityStatsNodeResponseTests.java | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/changelog/135271.yaml b/docs/changelog/135271.yaml index 7561cfb4f68c0..be9e2ad30f351 100644 --- a/docs/changelog/135271.yaml +++ b/docs/changelog/135271.yaml @@ -1,5 +1,5 @@ pr: 135271 -summary: Add role stats to `_security/stats` +summary: Add DLS stats to `_security/stats` area: Authorization type: enhancement issues: [] diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java index 5ecdb7da64a58..f1cc7b91cb702 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/action/stats/GetSecurityStatsNodeResponseTests.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.util.Map; +import java.util.Objects; public class GetSecurityStatsNodeResponseTests extends AbstractWireSerializingTestCase { @@ -24,16 +25,24 @@ protected Writeable.Reader instanceReader() { @Override protected GetSecurityStatsNodeResponse createTestInstance() { return new GetSecurityStatsNodeResponse( - DiscoveryNodeUtils.create(randomUUID()), - randomBoolean() ? null : Map.of("key", randomUUID()) + DiscoveryNodeUtils.builder(randomAlphaOfLength(10)).ephemeralId(randomAlphanumericOfLength(10)).build(), + randomBoolean() ? null : Map.of("key", randomAlphaOfLength(5)) ); } @Override protected GetSecurityStatsNodeResponse mutateInstance(GetSecurityStatsNodeResponse instance) throws IOException { + final var node = instance.getDiscoveryNode(); + final var value = Objects.requireNonNullElse(instance.getRolesStoreStats(), Map.of()).get("key"); return switch (randomIntBetween(0, 1)) { - case 0 -> new GetSecurityStatsNodeResponse(DiscoveryNodeUtils.create(randomUUID()), instance.getRolesStoreStats()); - case 1 -> new GetSecurityStatsNodeResponse(instance.getDiscoveryNode(), Map.of("key", randomUUID())); + case 0 -> new GetSecurityStatsNodeResponse( + DiscoveryNodeUtils.builder(randomValueOtherThan(node.getId(), () -> randomAlphaOfLength(10))) + // DiscoverNode#hashCode only tests ephemeralId, so make sure to change it too + .ephemeralId(randomValueOtherThan(node.getEphemeralId(), () -> randomAlphanumericOfLength(10))) + .build(), + instance.getRolesStoreStats() + ); + case 1 -> new GetSecurityStatsNodeResponse(node, Map.of("key", randomValueOtherThan(value, () -> randomAlphaOfLength(5)))); default -> throw new IllegalStateException("Unexpected value"); }; } From 698bb784ae3ceb1cd3e5654e8922f025eb3ab77d Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Fri, 26 Sep 2025 11:21:50 +0100 Subject: [PATCH 09/10] update transport --- .../transport/definitions/referable/roles_security_stats.csv | 2 +- server/src/main/resources/transport/upper_bounds/9.2.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv index 42d1df167e3b9..a4676dc2fe444 100644 --- a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv +++ b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv @@ -1 +1 @@ -9172000 +9175000 diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv index 57900e0428e01..f7514941cec2b 100644 --- a/server/src/main/resources/transport/upper_bounds/9.2.csv +++ b/server/src/main/resources/transport/upper_bounds/9.2.csv @@ -1 +1 @@ -semantic_search_ccs_support,9174000 +roles_security_stats,9175000 From 6ac2653ff062fbe812875d221a25313b3ab684a7 Mon Sep 17 00:00:00 2001 From: Szymon Bialkowski Date: Fri, 26 Sep 2025 12:23:35 +0100 Subject: [PATCH 10/10] update transport --- .../transport/definitions/referable/roles_security_stats.csv | 2 +- server/src/main/resources/transport/upper_bounds/9.2.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv index a4676dc2fe444..958f4e9c30d79 100644 --- a/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv +++ b/server/src/main/resources/transport/definitions/referable/roles_security_stats.csv @@ -1 +1 @@ -9175000 +9176000 diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv index 455c9526b5cfd..78180d915cd67 100644 --- a/server/src/main/resources/transport/upper_bounds/9.2.csv +++ b/server/src/main/resources/transport/upper_bounds/9.2.csv @@ -1 +1 @@ -contextual_ai_service,9175000 +roles_security_stats,9176000