Automatically import Kibana dashboards

Facilitate the spin up of the environment by importing the
Kibana dashboard and creating the empty gerrit elasticsearch index

Change-Id: I921c9c469d740d79a3f75bd54e7221bfd81c694b
diff --git a/dashboard-importer/Dockerfile b/dashboard-importer/Dockerfile
new file mode 100644
index 0000000..4aa6a13
--- /dev/null
+++ b/dashboard-importer/Dockerfile
@@ -0,0 +1,7 @@
+FROM taskrabbit/elasticsearch-dump:v3.3.1
+
+RUN apk add --no-cache curl
+
+COPY docker-entrypoint.sh wait-for-elasticsearch ./kibana-config /
+
+ENTRYPOINT /docker-entrypoint.sh
diff --git a/dashboard-importer/credentials.env b/dashboard-importer/credentials.env
new file mode 100644
index 0000000..02177e6
--- /dev/null
+++ b/dashboard-importer/credentials.env
@@ -0,0 +1,2 @@
+ES_USER=elastic
+ES_PWD=changeme
diff --git a/dashboard-importer/docker-entrypoint.sh b/dashboard-importer/docker-entrypoint.sh
new file mode 100755
index 0000000..fdfcbea
--- /dev/null
+++ b/dashboard-importer/docker-entrypoint.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+/wait-for-elasticsearch
+
+echo "** Creating Gerrit index"
+curl -XPUT "http://$ES_USER:$ES_PWD@elasticsearch:9200/gerrit?pretty" -H 'Content-Type: application/json'
+
+echo "** Importing Kibana setting from: "
+for file in `ls -v /*.json`;
+    do  echo "--> $file";
+        /usr/lib/node_modules/elasticdump/bin/elasticdump \
+        --output=http://$ES_USER:$ES_PWD@elasticsearch:9200/.kibana \
+        --input=$file \
+        --type=data \
+        --headers '{"Content-Type": "application/json"}';
+done;
diff --git a/dashboard-importer/kibana-config/00_config.json b/dashboard-importer/kibana-config/00_config.json
new file mode 100644
index 0000000..cc5f7a8
--- /dev/null
+++ b/dashboard-importer/kibana-config/00_config.json
@@ -0,0 +1,12 @@
+{
+  "_index": ".kibana",
+  "_type": "config",
+  "_id": "5.5.2",
+  "_score": 1,
+  "_source": {
+    "buildNum": 15443,
+    "xPackMonitoring:allowReport": true,
+    "xPackMonitoring:showBanner": true,
+    "defaultIndex": "gerrit"
+  }
+}
diff --git a/dashboard-importer/kibana-config/10_index-pattern.json b/dashboard-importer/kibana-config/10_index-pattern.json
new file mode 100644
index 0000000..6b2c233
--- /dev/null
+++ b/dashboard-importer/kibana-config/10_index-pattern.json
@@ -0,0 +1,11 @@
+{
+  "_index": ".kibana",
+  "_type": "index-pattern",
+  "_id": "gerrit",
+  "_score": 1,
+  "_source": {
+    "title": "gerrit",
+    "notExpandable": true,
+    "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"added_lines\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"author\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"author.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"day\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"deleted_lines\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"email\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"email.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"email_alias\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"email_alias.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"hour\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"last_commit_date\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"month\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_commits\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_files\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"organization\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"organization.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"project\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"project.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"year\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]"
+  }
+}
diff --git a/dashboard-importer/wait-for-elasticsearch b/dashboard-importer/wait-for-elasticsearch
new file mode 100755
index 0000000..6f05499
--- /dev/null
+++ b/dashboard-importer/wait-for-elasticsearch
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+wait_for() {
+  for i in `seq 30` ; do
+    curl -f -u $ES_USER:$ES_PWD http://elasticsearch:9200/_cluster/health > /dev/null 2>&1
+
+    result=$?
+    if [ $result -eq 0 ] ; then
+      if [ $# -gt 0 ] ; then
+        exec "$@"
+      fi
+      exit 0
+    fi
+    echo "* Waiting for Elasticsearch ($i/30)"
+    sleep 2
+  done
+  echo "Operation timed out" >&2
+  exit 1
+}
+
+wait_for "$@"
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7c646e1..a7300e1 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -2,7 +2,26 @@
 
 services:
 
-  elasticsearch:
+ dashboard-importer:
+    build: dashboard-importer
+    networks:
+      - ek
+    env_file:
+      - ./dashboard-importer/credentials.env
+    links:
+      - elasticsearch
+      - kibana
+
+ kibana:
+    image: docker.elastic.co/kibana/kibana:5.5.2
+    ports:
+      - "5601:5601"
+    networks:
+      - ek
+    depends_on:
+      - elasticsearch
+
+ elasticsearch:
     image: docker.elastic.co/elasticsearch/elasticsearch:5.5.2
     ports:
       - "9200:9200"
@@ -14,15 +33,6 @@
     networks:
       - ek
 
-  kibana:
-    image: docker.elastic.co/kibana/kibana:5.5.2
-    ports:
-      - "5601:5601"
-    networks:
-      - ek
-    depends_on:
-      - elasticsearch
-
 networks:
 
   ek: