@Test
  public void createIndexWarmer() {
    client().admin().indices().prepareDelete().execute().actionGet();

    client()
        .admin()
        .indices()
        .prepareCreate("test")
        .setSource(
            "{\n"
                + "    \"settings\" : {\n"
                + "        \"index.number_of_shards\" : 1\n"
                + "    },\n"
                + "    \"warmers\" : {\n"
                + "        \"warmer_1\" : {\n"
                + "            \"types\" : [],\n"
                + "            \"source\" : {\n"
                + "                \"query\" : {\n"
                + "                    \"match_all\" : {}\n"
                + "                }\n"
                + "            }\n"
                + "        }\n"
                + "    }\n"
                + "}")
        .execute()
        .actionGet();

    ClusterState clusterState =
        client().admin().cluster().prepareState().execute().actionGet().getState();
    IndexWarmersMetaData warmersMetaData =
        clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE);
    assertThat(warmersMetaData, Matchers.notNullValue());
    assertThat(warmersMetaData.entries().size(), equalTo(1));

    client()
        .prepareIndex("test", "type1", "1")
        .setSource("field", "value1")
        .setRefresh(true)
        .execute()
        .actionGet();
    client()
        .prepareIndex("test", "type1", "2")
        .setSource("field", "value2")
        .setRefresh(true)
        .execute()
        .actionGet();
  }
    public TerminationHandle internalWarm(
        final IndexShard indexShard,
        final IndexMetaData indexMetaData,
        final IndicesWarmer.WarmerContext warmerContext,
        ThreadPool threadPool,
        final boolean top) {
      IndexWarmersMetaData custom = indexMetaData.custom(IndexWarmersMetaData.TYPE);
      if (custom == null) {
        return TerminationHandle.NO_WAIT;
      }
      final Executor executor = threadPool.executor(executor());
      final CountDownLatch latch = new CountDownLatch(custom.entries().size());
      for (final IndexWarmersMetaData.Entry entry : custom.entries()) {
        executor.execute(
            new Runnable() {

              @Override
              public void run() {
                SearchContext context = null;
                try {
                  long now = System.nanoTime();
                  ShardSearchRequest request =
                      new ShardSearchLocalRequest(
                          indexShard.shardId(),
                          indexMetaData.numberOfShards(),
                          SearchType.QUERY_THEN_FETCH,
                          entry.source(),
                          entry.types(),
                          entry.queryCache());
                  context = createContext(request, warmerContext.searcher());
                  // if we use sort, we need to do query to sort on it and load relevant field data
                  // if not, we might as well set size=0 (and cache if needed)
                  if (context.sort() == null) {
                    context.size(0);
                  }
                  boolean canCache = indicesQueryCache.canCache(request, context);
                  // early terminate when we can cache, since we can only do proper caching on top
                  // level searcher
                  // also, if we can't cache, and its top, we don't need to execute it, since we
                  // already did when its not top
                  if (canCache != top) {
                    return;
                  }
                  loadOrExecuteQueryPhase(request, context, queryPhase);
                  long took = System.nanoTime() - now;
                  if (indexShard.warmerService().logger().isTraceEnabled()) {
                    indexShard
                        .warmerService()
                        .logger()
                        .trace(
                            "warmed [{}], took [{}]", entry.name(), TimeValue.timeValueNanos(took));
                  }
                } catch (Throwable t) {
                  indexShard.warmerService().logger().warn("warmer [{}] failed", t, entry.name());
                } finally {
                  try {
                    if (context != null) {
                      freeContext(context.id());
                      cleanContext(context);
                    }
                  } finally {
                    latch.countDown();
                  }
                }
              }
            });
      }
      return new TerminationHandle() {
        @Override
        public void awaitTermination() throws InterruptedException {
          latch.await();
        }
      };
    }
  @Test
  public void templateWarmer() {
    client().admin().indices().prepareDelete().execute().actionGet();

    client()
        .admin()
        .indices()
        .preparePutTemplate("template_1")
        .setSource(
            "{\n"
                + "    \"template\" : \"*\",\n"
                + "    \"warmers\" : {\n"
                + "        \"warmer_1\" : {\n"
                + "            \"types\" : [],\n"
                + "            \"source\" : {\n"
                + "                \"query\" : {\n"
                + "                    \"match_all\" : {}\n"
                + "                }\n"
                + "            }\n"
                + "        }\n"
                + "    }\n"
                + "}")
        .execute()
        .actionGet();

    client()
        .admin()
        .indices()
        .prepareCreate("test")
        .setSettings(ImmutableSettings.settingsBuilder().put("index.number_of_shards", 1))
        .execute()
        .actionGet();

    client()
        .admin()
        .cluster()
        .prepareHealth()
        .setWaitForEvents(Priority.LANGUID)
        .setWaitForGreenStatus()
        .execute()
        .actionGet();

    ClusterState clusterState =
        client().admin().cluster().prepareState().execute().actionGet().getState();
    IndexWarmersMetaData warmersMetaData =
        clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE);
    assertThat(warmersMetaData, Matchers.notNullValue());
    assertThat(warmersMetaData.entries().size(), equalTo(1));

    client()
        .prepareIndex("test", "type1", "1")
        .setSource("field", "value1")
        .setRefresh(true)
        .execute()
        .actionGet();
    client()
        .prepareIndex("test", "type1", "2")
        .setSource("field", "value2")
        .setRefresh(true)
        .execute()
        .actionGet();
  }