Elasticsearch::Extensionsを用いたテスト on Ruby on Rails（xception in thread "main" java.lang.IllegalArgumentException: Unknown [gateway] type [none]）

> Exception in thread "main" java.lang.IllegalArgumentException: Unknown [gateway] type [none]

rspecにて、Elasticsearchを用いたアプリのテストを実行中に、上記のエラーが発生しハマったので、備忘録として。。。

ESの起動時はデフォルトだと、gatewayはlocalのはずだがなぜ・・・

## 調査１
https://github.com/elastic/elasticsearch/issues/347

一応エラーからソースを追ってみると、
https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java#L150

でこけている。

で、ここからトレースをしてみても。。。
https://github.com/jprante/elasticsearch-server/blob/master/elasticsearch-server-node/src/main/java/org/elasticsearch/gateway/GatewayModule.java#L28

だし、gatewayが`none`となってしまうのが全くもって不明。

## 調査2

そして、さらに、謎なのが、

```
TEST_CLUSTER_NAME=my-testing-cluster \
TEST_CLUSTER_COMMAND=/usr/local/Cellar/elasticsearch/0.90.10/bin/elasticsearch \
TEST_CLUSTER_PORT=9350 \
TEST_CLUSTER_NODES=3 \
TEST_CLUSTER_NAME=my_testing_cluster \
ruby -r elasticsearch -e "require 'elasticsearch/extensions/test/cluster'; Elasticsearch::Extensions::Test::Cluster.start"
```
みたいな感じでコマンドから実行するとうまくいく・・・という　 :astonished: 

## 調査3
ドキュメント漁って。。。。
コマンドで再現をしてみたところ。。。。

```cli
~ $ elasticsearch -D es.foreground=yes -D es.cluster.name=elasticsearch-test-apple-no-macbook-pro.local -D es.node.name=node-1 -D es.http.port=9250 -D es.path.data=/tmp/elasticsearch_test -D es.path.work=/tmp -D es.path.logs=/tmp/log/elasticsearch -D es.cluster.routing.allocation.disk.threshold_enabled=false -D es.network.host=localhost -D es.script.inline=true -D es.script.stored=true -D es.node.attr.testattr=test -D es.path.repo=/tmp -D es.repositories.url.allowed_urls=http://snapshot.test* -D es.logger.level=DEBUG -D es.gateway.type=none
:
:
Exception in thread "main" java.lang.IllegalArgumentException: Unknown [gateway] type [none]
	at org.elasticsearch.common.util.ExtensionPoint$SelectedType.bindType(ExtensionPoint.java:146)
	at org.elasticsearch.gateway.GatewayModule.configure(GatewayModule.java:53)
	at <<<guice>>>
	at org.elasticsearch.node.Node.<init>(Node.java:213)
	at org.elasticsearch.node.Node.<init>(Node.java:140)
	at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.java:143)
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:178)
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.
```

再現できた。

要は
```
-D es.gateway.type=none
```

が間違いで、
```
-D es.gateway=local
```
とすると

```
[2016-07-24 21:17:02,368][INFO ][node                     ] [node-1] started
[2016-07-24 21:17:02,371][DEBUG][cluster.service          ] [node-1] processing [local-gateway-elected-state]: execute
[2016-07-24 21:17:02,372][DEBUG][cluster.service          ] [node-1] cluster state updated, version [2], source [local-gateway-elected-state]
[2016-07-24 21:17:02,372][DEBUG][cluster.service          ] [node-1] publishing cluster state version [2]
[2016-07-24 21:17:02,372][DEBUG][cluster.service          ] [node-1] set local cluster state to version 2
[2016-07-24 21:17:02,389][INFO ][gateway                  ] [node-1] recovered [0] indices into cluster_state
[2016-07-24 21:17:02,389][DEBUG][cluster.service          ] [node-1] processing [local-gateway-elected-state]: took 18ms done applying updated cluster_state (version: 2, uuid: -NnoHok5TRWNODw59ligMQ)
```

となり、無事起動成功。

余談だがデフォルトが　`local`なので、
```
-D es.gateway=none
```
でもいける。

## 結果
https://github.com/kieaiaarh/lancher_es/pull/6/files#diff-d95265df13cf89b449e4b80218d35125R11

```rb
Elasticsearch::Extensions::Test::Cluster.start port: 9250, network_host: 'localhost', es_params: '-D es.gateway=local' unless Elasticsearch::Extensions::Test::Cluster.running?(on: 9250)`
```

TEST Cluster起動時に設定追加して、完了。

ちなみに、`network_host`も指定していますが、これはデフォルトだと、　`0.0.0.0`（　デフォルトゲートウェイ）なので、CIテスト時、気持ち悪いため、固定しているだけです。


## モヤっと。。。
> Exception in thread "main" java.lang.IllegalArgumentException: Unknown [gateway] type [none]

については、なぜこうなったのかが現状まだ不明・・・。
elasticsearch.ymlで　設定しているわけでもなし。。。そもそもバグなのか、、、とりあえずは先に進めたいので、一旦　FIXMEとしておこ。