|
13 | 13 | import org.elasticsearch.client.Response; |
14 | 14 | import org.elasticsearch.client.ResponseException; |
15 | 15 | import org.elasticsearch.client.RestClient; |
| 16 | +import org.elasticsearch.client.WarningFailureException; |
16 | 17 | import org.elasticsearch.cluster.metadata.DataStream; |
17 | 18 | import org.elasticsearch.common.Strings; |
18 | 19 | import org.elasticsearch.common.settings.SecureString; |
@@ -1120,6 +1121,115 @@ public void testAutoFollowSearchableSnapshotsFails() throws Exception { |
1120 | 1121 | } |
1121 | 1122 | } |
1122 | 1123 |
|
| 1124 | + public void testNoWarningOnPromoteDatastreamWhenTemplateExistsOnFollower() throws Exception { |
| 1125 | + if ("follow".equals(targetCluster) == false) { |
| 1126 | + return; |
| 1127 | + } |
| 1128 | + testDatastreamPromotionWarnings(true); |
| 1129 | + } |
| 1130 | + |
| 1131 | + public void testWarningOnPromoteDatastreamWhenTemplateDoesNotExistsOnFollower() { |
| 1132 | + if ("follow".equals(targetCluster) == false) { |
| 1133 | + return; |
| 1134 | + } |
| 1135 | + WarningFailureException exception = assertThrows(WarningFailureException.class, () -> testDatastreamPromotionWarnings(false)); |
| 1136 | + assertThat( |
| 1137 | + exception.getMessage(), |
| 1138 | + containsString( |
| 1139 | + "does not have a matching index template. " + "This will cause rollover to fail until a matching index template is created]" |
| 1140 | + ) |
| 1141 | + ); |
| 1142 | + } |
| 1143 | + |
| 1144 | + private void testDatastreamPromotionWarnings(Boolean createFollowerTemplate) throws Exception { |
| 1145 | + final int numDocs = 64; |
| 1146 | + final String dataStreamName = getTestName().toLowerCase(Locale.ROOT) + "-dopromo"; |
| 1147 | + final String autoFollowPatternName = getTestName().toLowerCase(Locale.ROOT); |
| 1148 | + |
| 1149 | + int initialNumberOfSuccessfulFollowedIndices = getNumberOfSuccessfulFollowedIndices(); |
| 1150 | + List<String> backingIndexNames = null; |
| 1151 | + try { |
| 1152 | + // Create index template |
| 1153 | + Request putComposableIndexTemplateRequest = new Request("POST", "/_index_template/" + getTestName().toLowerCase(Locale.ROOT)); |
| 1154 | + putComposableIndexTemplateRequest.setJsonEntity("{\"index_patterns\":[\"" + dataStreamName + "*\"],\"data_stream\":{}}"); |
| 1155 | + |
| 1156 | + if (createFollowerTemplate) { |
| 1157 | + assertOK(client().performRequest(putComposableIndexTemplateRequest)); |
| 1158 | + } |
| 1159 | + |
| 1160 | + // Create auto follow pattern |
| 1161 | + createAutoFollowPattern(client(), autoFollowPatternName, dataStreamName + "*", "leader_cluster", null); |
| 1162 | + |
| 1163 | + // Create data stream and ensure that it is auto followed |
| 1164 | + try (var leaderClient = buildLeaderClient()) { |
| 1165 | + assertOK(leaderClient.performRequest(putComposableIndexTemplateRequest)); |
| 1166 | + |
| 1167 | + for (int i = 0; i < numDocs; i++) { |
| 1168 | + var indexRequest = new Request("POST", "/" + dataStreamName + "/_doc"); |
| 1169 | + indexRequest.addParameter("refresh", "true"); |
| 1170 | + indexRequest.setJsonEntity("{\"@timestamp\": \"" + DATE_FORMAT.format(new Date()) + "\",\"message\":\"abc\"}"); |
| 1171 | + assertOK(leaderClient.performRequest(indexRequest)); |
| 1172 | + } |
| 1173 | + verifyDataStream(leaderClient, dataStreamName, backingIndexName(dataStreamName, 1)); |
| 1174 | + verifyDocuments(leaderClient, dataStreamName, numDocs); |
| 1175 | + } |
| 1176 | + assertBusy(() -> { |
| 1177 | + assertThat(getNumberOfSuccessfulFollowedIndices(), equalTo(initialNumberOfSuccessfulFollowedIndices + 1)); |
| 1178 | + verifyDataStream(client(), dataStreamName, backingIndexName(dataStreamName, 1)); |
| 1179 | + ensureYellow(dataStreamName); |
| 1180 | + verifyDocuments(client(), dataStreamName, numDocs); |
| 1181 | + }); |
| 1182 | + |
| 1183 | + // Rollover in leader cluster and ensure second backing index is replicated: |
| 1184 | + try (var leaderClient = buildLeaderClient()) { |
| 1185 | + var rolloverRequest = new Request("POST", "/" + dataStreamName + "/_rollover"); |
| 1186 | + assertOK(leaderClient.performRequest(rolloverRequest)); |
| 1187 | + verifyDataStream(leaderClient, dataStreamName, backingIndexName(dataStreamName, 1), backingIndexName(dataStreamName, 2)); |
| 1188 | + |
| 1189 | + var indexRequest = new Request("POST", "/" + dataStreamName + "/_doc"); |
| 1190 | + indexRequest.addParameter("refresh", "true"); |
| 1191 | + indexRequest.setJsonEntity("{\"@timestamp\": \"" + DATE_FORMAT.format(new Date()) + "\",\"message\":\"abc\"}"); |
| 1192 | + assertOK(leaderClient.performRequest(indexRequest)); |
| 1193 | + verifyDocuments(leaderClient, dataStreamName, numDocs + 1); |
| 1194 | + } |
| 1195 | + assertBusy(() -> { |
| 1196 | + assertThat(getNumberOfSuccessfulFollowedIndices(), equalTo(initialNumberOfSuccessfulFollowedIndices + 2)); |
| 1197 | + verifyDataStream(client(), dataStreamName, backingIndexName(dataStreamName, 1), backingIndexName(dataStreamName, 2)); |
| 1198 | + ensureYellow(dataStreamName); |
| 1199 | + verifyDocuments(client(), dataStreamName, numDocs + 1); |
| 1200 | + }); |
| 1201 | + |
| 1202 | + backingIndexNames = verifyDataStream( |
| 1203 | + client(), |
| 1204 | + dataStreamName, |
| 1205 | + backingIndexName(dataStreamName, 1), |
| 1206 | + backingIndexName(dataStreamName, 2) |
| 1207 | + ); |
| 1208 | + |
| 1209 | + // Promote local data stream |
| 1210 | + var promoteRequest = new Request("POST", "/_data_stream/_promote/" + dataStreamName); |
| 1211 | + Response response = client().performRequest(promoteRequest); |
| 1212 | + assertOK(response); |
| 1213 | + } finally { |
| 1214 | + if (backingIndexNames == null) { |
| 1215 | + // we failed to compute the actual backing index names in the test because we failed earlier on, guessing them on a |
| 1216 | + // best-effort basis |
| 1217 | + backingIndexNames = List.of(backingIndexName(dataStreamName, 1), backingIndexName(dataStreamName, 2)); |
| 1218 | + } |
| 1219 | + |
| 1220 | + cleanUpFollower(backingIndexNames, List.of(dataStreamName), List.of(autoFollowPatternName)); |
| 1221 | + cleanUpLeader(backingIndexNames.subList(0, 1), List.of(dataStreamName), List.of()); |
| 1222 | + Request deleteTemplateRequest = new Request("DELETE", "/_index_template/" + getTestName().toLowerCase(Locale.ROOT)); |
| 1223 | + if (createFollowerTemplate) { |
| 1224 | + assertOK(client().performRequest(deleteTemplateRequest)); |
| 1225 | + } |
| 1226 | + try (var leaderClient = buildLeaderClient()) { |
| 1227 | + assertOK(leaderClient.performRequest(deleteTemplateRequest)); |
| 1228 | + } |
| 1229 | + } |
| 1230 | + |
| 1231 | + } |
| 1232 | + |
1123 | 1233 | private int getNumberOfSuccessfulFollowedIndices() throws IOException { |
1124 | 1234 | return getNumberOfSuccessfulFollowedIndices(client()); |
1125 | 1235 | } |
|
0 commit comments