package com.netflix.raigad.indexmanagement;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.netflix.raigad.configuration.IConfiguration;
import com.netflix.raigad.configuration.UnitTestModule;
import com.netflix.raigad.utils.ElasticsearchTransportClient;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import org.elasticsearch.action.admin.indices.stats.IndexStats;
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.test.ESIntegTestCase;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.*;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Ignore
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.TEST, numDataNodes = 2)
public class TestIndexManagement extends ESIntegTestCase {
private static final DateTimeZone currentZone = DateTimeZone.UTC;
private static final String S3_REPO_DATE_FORMAT = "yyyyMMdd";
private static final String indexPrefix = "test_index";
private static final int numDays = 5;
private static Injector injector;
private static Client client0;
private static IConfiguration conf;
@Mocked
private static ElasticsearchTransportClient esTransportClient;
@Mocked
private static ElasticsearchIndexManager esIndexManager;
@BeforeClass
public static void setup() throws InterruptedException, IOException {
injector = Guice.createInjector(new UnitTestModule());
conf = injector.getInstance(IConfiguration.class);
esTransportClient = injector.getInstance(ElasticsearchTransportClient.class);
if (esIndexManager == null) {
esIndexManager = injector.getInstance(ElasticsearchIndexManager.class);
}
}
@AfterClass
public static void cleanup() throws IOException {
injector = null;
client0 = null;
esTransportClient = null;
conf = null;
esIndexManager = null;
}
@Ignore
public static class MockElasticsearchTransportClient extends MockUp<ElasticsearchTransportClient> {
@Mock
public static ElasticsearchTransportClient instance(IConfiguration config) {
return esTransportClient;
}
@Mock
public Client getTransportClient() {
return client0;
}
}
@Ignore
public static class MockElasticsearchIndexManager extends MockUp<ElasticsearchIndexManager> {
@Mock
public IndicesStatsResponse getIndicesStatusResponse(Client esTransportClient) {
return getLocalIndicesStatusResponse();
}
@Mock
public void deleteIndices(Client client, String indexName, int timeout) {
client0.admin().indices().prepareDelete(indexName).execute().actionGet(timeout);
}
}
@Test
public void testIndexRetentionWithPreCreate() throws Exception {
client0 = client();
Map<String, IndexStats> beforeIndexStatusMap = getLocalIndicesStatusResponse().getIndices();
Assert.assertEquals(0, beforeIndexStatusMap.size());
//Create Old indices for {numDays}
createOldIndices(indexPrefix, numDays);
Map<String, IndexStats> afterIndexStatusMap = getLocalIndicesStatusResponse().getIndices();
Assert.assertEquals(numDays, afterIndexStatusMap.size());
esIndexManager.runIndexManagement();
Map<String, IndexStats> finalIndexStatusMap = getLocalIndicesStatusResponse().getIndices();
List<IndexMetadata> indexMetadataList = ElasticsearchIndexManager.buildInfo(conf.getIndexMetadata());
/**
* If pre-create is enabled, it will create today's index + (retention period in days - 1) day indices for future days
*/
if (indexMetadataList.get(0).isPreCreate()) {
Assert.assertEquals((indexMetadataList.get(0).getRetentionPeriod() - 1) * 2 + 1, finalIndexStatusMap.size());
} else {
Assert.assertEquals(indexMetadataList.get(0).getRetentionPeriod() - 1, finalIndexStatusMap.size());
}
}
public static IndicesStatsResponse getLocalIndicesStatusResponse() {
return client0.admin().indices().prepareStats().execute().actionGet(conf.getAutoCreateIndexTimeout());
}
public static void createOldIndices(String indexPrefix, int numDays) {
for (int i = numDays; i > 0; i--) {
String indexName = indexPrefix + getFormattedDate(i);
client0.admin().indices().prepareCreate(indexName).execute().actionGet();
}
}
public static String getFormattedDate(int priorDay) {
DateTime dt = new DateTime().minusDays(priorDay).withZone(currentZone);
DateTimeFormatter fmt = DateTimeFormat.forPattern(S3_REPO_DATE_FORMAT);
return dt.toString(fmt);
}
}