|
47 | 47 | import java.util.List; |
48 | 48 | import java.util.Locale; |
49 | 49 | import java.util.Map; |
| 50 | +import java.util.Objects; |
50 | 51 | import java.util.Set; |
51 | 52 | import java.util.stream.Collectors; |
52 | 53 | import java.util.stream.Stream; |
|
57 | 58 | import static org.hamcrest.Matchers.equalTo; |
58 | 59 | import static org.hamcrest.Matchers.hasItem; |
59 | 60 | import static org.hamcrest.Matchers.is; |
| 61 | +import static org.hamcrest.Matchers.iterableWithSize; |
60 | 62 | import static org.hamcrest.Matchers.notNullValue; |
61 | 63 |
|
62 | 64 | public class FailureStoreSecurityRestIT extends ESRestTestCase { |
@@ -2016,9 +2018,105 @@ private Response modifyFailureStoreBackingIndex(String user, String action, Stri |
2016 | 2018 | return performRequest(user, request); |
2017 | 2019 | } |
2018 | 2020 |
|
2019 | | - public void testDataStreamApi() { |
2020 | | - // test get data stream |
2021 | | - // test data stream stats |
| 2021 | + public void testDataStreamApis() throws Exception { |
| 2022 | + setupDataStream(); |
| 2023 | + setupOtherDataStream(); |
| 2024 | + |
| 2025 | + final String username = "user"; |
| 2026 | + final String roleName = "role"; |
| 2027 | + createUser(username, PASSWORD, roleName); |
| 2028 | + { |
| 2029 | + // manage_failure_store does not grant access to _data_stream APIs |
| 2030 | + createOrUpdateRoleAndApiKey(username, roleName, """ |
| 2031 | + { |
| 2032 | + "cluster": ["all"], |
| 2033 | + "indices": [ |
| 2034 | + { |
| 2035 | + "names": ["test1", "other1"], |
| 2036 | + "privileges": ["manage_failure_store"] |
| 2037 | + } |
| 2038 | + ] |
| 2039 | + } |
| 2040 | + """); |
| 2041 | + |
| 2042 | + expectThrows(() -> performRequest(username, new Request("GET", "/_data_stream/test1")), 403); |
| 2043 | + expectThrows(() -> performRequest(username, new Request("GET", "/_data_stream/test1/_stats")), 403); |
| 2044 | + expectThrows(() -> performRequest(username, new Request("GET", "/_data_stream/test1/_options")), 403); |
| 2045 | + expectThrows(() -> performRequest(username, new Request("GET", "/_data_stream/test1/_lifecycle")), 403); |
| 2046 | + expectThrows(() -> putDataStreamLifecycle(username, "test1", """ |
| 2047 | + { |
| 2048 | + "data_retention": "7d" |
| 2049 | + }"""), 403); |
| 2050 | + expectEmptyDataStreamStats(username, new Request("GET", "/_data_stream/_stats")); |
| 2051 | + expectEmptyDataStreamStats(username, new Request("GET", "/_data_stream/" + randomFrom("test*", "*") + "/_stats")); |
| 2052 | + } |
| 2053 | + { |
| 2054 | + createOrUpdateRoleAndApiKey(username, roleName, """ |
| 2055 | + { |
| 2056 | + "cluster": ["all"], |
| 2057 | + "indices": [ |
| 2058 | + { |
| 2059 | + "names": ["test1"], |
| 2060 | + "privileges": ["manage"] |
| 2061 | + } |
| 2062 | + ] |
| 2063 | + } |
| 2064 | + """); |
| 2065 | + |
| 2066 | + expectDataStreamStats(username, new Request("GET", "/_data_stream/_stats"), "test1", 2); |
| 2067 | + expectDataStreamStats( |
| 2068 | + username, |
| 2069 | + new Request("GET", "/_data_stream/" + randomFrom("test1", "test*", "*") + "/_stats"), |
| 2070 | + "test1", |
| 2071 | + 2 |
| 2072 | + ); |
| 2073 | + expectDataStreams(username, new Request("GET", "/_data_stream/" + randomFrom("test1", "test*", "*")), "test1"); |
| 2074 | + putDataStreamLifecycle(username, "test1", """ |
| 2075 | + { |
| 2076 | + "data_retention": "7d" |
| 2077 | + }"""); |
| 2078 | + |
| 2079 | + var lifecycleResponse = assertOKAndCreateObjectPath( |
| 2080 | + performRequest(username, new Request("GET", "/_data_stream/" + randomFrom("test1", "test*", "*") + "/_lifecycle")) |
| 2081 | + ); |
| 2082 | + assertThat(lifecycleResponse.evaluate("data_streams"), iterableWithSize(1)); |
| 2083 | + assertThat(lifecycleResponse.evaluate("data_streams.0.name"), equalTo("test1")); |
| 2084 | + |
| 2085 | + var optionsResponse = assertOKAndCreateObjectPath( |
| 2086 | + performRequest(username, new Request("GET", "/_data_stream/" + randomFrom("test1", "test*", "*") + "/_options")) |
| 2087 | + ); |
| 2088 | + assertThat(optionsResponse.evaluate("data_streams"), iterableWithSize(1)); |
| 2089 | + assertThat(optionsResponse.evaluate("data_streams.0.name"), equalTo("test1")); |
| 2090 | + } |
| 2091 | + } |
| 2092 | + |
| 2093 | + private void putDataStreamLifecycle(String user, String dataStreamName, String lifecyclePolicy) throws IOException { |
| 2094 | + Request request = new Request("PUT", "/_data_stream/" + dataStreamName + "/_lifecycle"); |
| 2095 | + request.setJsonEntity(lifecyclePolicy); |
| 2096 | + assertOK(performRequest(user, request)); |
| 2097 | + } |
| 2098 | + |
| 2099 | + private void expectDataStreams(String user, Request dataStreamRequest, String dataStreamName) throws IOException { |
| 2100 | + Response response = performRequest(user, dataStreamRequest); |
| 2101 | + ObjectPath path = assertOKAndCreateObjectPath(response); |
| 2102 | + List<Objects> dataStreams = path.evaluate("data_streams"); |
| 2103 | + assertThat(dataStreams.size(), equalTo(1)); |
| 2104 | + assertThat(path.evaluate("data_streams.0.name"), equalTo(dataStreamName)); |
| 2105 | + } |
| 2106 | + |
| 2107 | + private void expectDataStreamStats(String user, Request statsRequest, String dataStreamName, int backingIndices) throws IOException { |
| 2108 | + Response response = performRequest(user, statsRequest); |
| 2109 | + ObjectPath path = assertOKAndCreateObjectPath(response); |
| 2110 | + assertThat(path.evaluate("data_stream_count"), equalTo(1)); |
| 2111 | + assertThat(path.evaluate("backing_indices"), equalTo(backingIndices)); |
| 2112 | + assertThat(path.evaluate("data_streams.0.data_stream"), equalTo(dataStreamName)); |
| 2113 | + } |
| 2114 | + |
| 2115 | + private void expectEmptyDataStreamStats(String user, Request request) throws IOException { |
| 2116 | + Response response = performRequest(user, request); |
| 2117 | + ObjectPath path = assertOKAndCreateObjectPath(response); |
| 2118 | + assertThat(path.evaluate("data_stream_count"), equalTo(0)); |
| 2119 | + assertThat(path.evaluate("backing_indices"), equalTo(0)); |
2022 | 2120 | } |
2023 | 2121 |
|
2024 | 2122 | public void testAliasBasedAccess() throws Exception { |
|
0 commit comments