@Override
    public void upgrade() {
        if (clusterConfigService.get(V20161216123500_Succeeded.class) != null) {
            return;
        }

        // The default index set must have been created first.
        checkState(clusterConfigService.get(DefaultIndexSetCreated.class) != null, "The default index set hasn't been created yet. This is a bug!");

        final IndexSetConfig defaultIndexSet = indexSetService.getDefault();
        migrateIndexSet(defaultIndexSet, elasticsearchConfiguration.getDefaultIndexTemplateName());

        final List<IndexSetConfig> allWithoutDefault = indexSetService.findAll()
                .stream()
                .filter(indexSetConfig -> !indexSetConfig.equals(defaultIndexSet))
                .collect(Collectors.toList());

        for (IndexSetConfig indexSetConfig : allWithoutDefault) {
            migrateIndexSet(indexSetConfig, indexSetConfig.indexPrefix() + "-template");
        }


        clusterConfigService.write(V20161216123500_Succeeded.create());
    }
@Test
    @SuppressWarnings("deprecation")
    public void upgradeCreatesDefaultIndexSet() throws Exception {
        final RotationStrategyConfig rotationStrategyConfig = mock(RotationStrategyConfig.class);
        final RetentionStrategyConfig retentionStrategyConfig = mock(RetentionStrategyConfig.class);
        final IndexSetConfig defaultConfig = IndexSetConfig.builder()
                .id("id")
                .title("title")
                .description("description")
                .indexPrefix("prefix")
                .shards(1)
                .replicas(0)
                .rotationStrategyConfig(rotationStrategyConfig)
                .retentionStrategyConfig(retentionStrategyConfig)
                .creationDate(ZonedDateTime.of(2016, 10, 12, 0, 0, 0, 0, ZoneOffset.UTC))
                .indexAnalyzer("standard")
                .indexTemplateName("prefix-template")
                .indexOptimizationMaxNumSegments(1)
                .indexOptimizationDisabled(false)
                .build();
        final IndexSetConfig additionalConfig = defaultConfig.toBuilder()
                .id("foo")
                .indexPrefix("foo")
                .build();
        final IndexSetConfig savedDefaultConfig = defaultConfig.toBuilder()
                .indexAnalyzer(elasticsearchConfiguration.getAnalyzer())
                .indexTemplateName(elasticsearchConfiguration.getDefaultIndexTemplateName())
                .indexOptimizationMaxNumSegments(elasticsearchConfiguration.getIndexOptimizationMaxNumSegments())
                .indexOptimizationDisabled(elasticsearchConfiguration.isDisableIndexOptimization())
                .build();
        final IndexSetConfig savedAdditionalConfig = additionalConfig.toBuilder()
                .indexAnalyzer(elasticsearchConfiguration.getAnalyzer())
                .indexTemplateName("foo-template")
                .indexOptimizationMaxNumSegments(elasticsearchConfiguration.getIndexOptimizationMaxNumSegments())
                .indexOptimizationDisabled(elasticsearchConfiguration.isDisableIndexOptimization())
                .build();

        when(indexSetService.save(any(IndexSetConfig.class))).thenReturn(savedAdditionalConfig, savedDefaultConfig);
        when(indexSetService.getDefault()).thenReturn(defaultConfig);
        when(indexSetService.findAll()).thenReturn(ImmutableList.of(defaultConfig, additionalConfig));
        when(clusterConfigService.get(DefaultIndexSetCreated.class)).thenReturn(DefaultIndexSetCreated.create());

        final ArgumentCaptor<IndexSetConfig> indexSetConfigCaptor = ArgumentCaptor.forClass(IndexSetConfig.class);

        migration.upgrade();

        verify(indexSetService, times(2)).save(indexSetConfigCaptor.capture());
        verify(clusterConfigService).write(V20161216123500_Succeeded.create());

        final List<IndexSetConfig> allValues = indexSetConfigCaptor.getAllValues();
        assertThat(allValues).hasSize(2);

        final IndexSetConfig capturedDefaultIndexSetConfig = allValues.get(0);
        assertThat(capturedDefaultIndexSetConfig.id()).isEqualTo("id");
        assertThat(capturedDefaultIndexSetConfig.title()).isEqualTo("title");
        assertThat(capturedDefaultIndexSetConfig.description()).isEqualTo("description");
        assertThat(capturedDefaultIndexSetConfig.indexPrefix()).isEqualTo("prefix");
        assertThat(capturedDefaultIndexSetConfig.shards()).isEqualTo(1);
        assertThat(capturedDefaultIndexSetConfig.replicas()).isEqualTo(0);
        assertThat(capturedDefaultIndexSetConfig.rotationStrategyConfig()).isEqualTo(rotationStrategyConfig);
        assertThat(capturedDefaultIndexSetConfig.retentionStrategyConfig()).isEqualTo(retentionStrategyConfig);
        assertThat(capturedDefaultIndexSetConfig.indexAnalyzer()).isEqualTo(elasticsearchConfiguration.getAnalyzer());
        assertThat(capturedDefaultIndexSetConfig.indexTemplateName()).isEqualTo(elasticsearchConfiguration.getDefaultIndexTemplateName());
        assertThat(capturedDefaultIndexSetConfig.indexOptimizationMaxNumSegments()).isEqualTo(elasticsearchConfiguration.getIndexOptimizationMaxNumSegments());
        assertThat(capturedDefaultIndexSetConfig.indexOptimizationDisabled()).isEqualTo(elasticsearchConfiguration.isDisableIndexOptimization());

        final IndexSetConfig capturedAdditionalIndexSetConfig = allValues.get(1);
        assertThat(capturedAdditionalIndexSetConfig.id()).isEqualTo("foo");
        assertThat(capturedAdditionalIndexSetConfig.title()).isEqualTo("title");
        assertThat(capturedAdditionalIndexSetConfig.description()).isEqualTo("description");
        assertThat(capturedAdditionalIndexSetConfig.indexPrefix()).isEqualTo("foo");
        assertThat(capturedAdditionalIndexSetConfig.shards()).isEqualTo(1);
        assertThat(capturedAdditionalIndexSetConfig.replicas()).isEqualTo(0);
        assertThat(capturedAdditionalIndexSetConfig.rotationStrategyConfig()).isEqualTo(rotationStrategyConfig);
        assertThat(capturedAdditionalIndexSetConfig.retentionStrategyConfig()).isEqualTo(retentionStrategyConfig);
        assertThat(capturedAdditionalIndexSetConfig.indexAnalyzer()).isEqualTo(elasticsearchConfiguration.getAnalyzer());
        assertThat(capturedAdditionalIndexSetConfig.indexTemplateName()).isEqualTo("foo-template");
        assertThat(capturedAdditionalIndexSetConfig.indexOptimizationMaxNumSegments()).isEqualTo(elasticsearchConfiguration.getIndexOptimizationMaxNumSegments());
        assertThat(capturedAdditionalIndexSetConfig.indexOptimizationDisabled()).isEqualTo(elasticsearchConfiguration.isDisableIndexOptimization());
    }