Add Elasticsearch index templates

This patch adds three index templates that are used by StackLight.
diff --git a/README.rst b/README.rst
index 1d85c54..cc8cfdb 100644
--- a/README.rst
+++ b/README.rst
@@ -122,7 +122,7 @@
 Client setup
 ------------
 
-Client with host and port
+Client with host and port:
 
 .. code-block:: yaml
 
@@ -133,6 +133,22 @@
           host: elasticsearch.host
           port: 9200
 
+Client where you download an index template that is stored in the direcotry
+*files/*:
+
+.. code-block:: yaml
+
+    elasticsearch:
+      client:
+        enabled: true
+        server:
+          host: elasticsearch.host
+          port: 9200
+        index:
+          my_index:
+            enabled: true
+            template: elasticsearch/files/my_index_template.json
+
 Read more
 =========
 
diff --git a/elasticsearch/client.sls b/elasticsearch/client.sls
index bc14f82..f336cd3 100644
--- a/elasticsearch/client.sls
+++ b/elasticsearch/client.sls
@@ -8,4 +8,17 @@
   - user: root
   - group: root
 
+{%- for index_name, index in client.get('index', {}).iteritems() %}
+elasticsearch_index_{{ index_name }}:
+  {%- if index.get('enabled', False) %}
+  elasticsearch_index_template.present:
+  {%- import_json index.template as definition %}
+  - name: {{ index_name }}
+  - definition: '{{ definition|json }}'
+  {%- else %}
+  elasticsearch_index_template.absent:
+  - name: {{ index_name }}
+  {%- endif %}
+{%- endfor %}
+
 {%- endif %}
diff --git a/elasticsearch/files/es_template_kibana4.json b/elasticsearch/files/es_template_kibana4.json
new file mode 100644
index 0000000..5a910a4
--- /dev/null
+++ b/elasticsearch/files/es_template_kibana4.json
@@ -0,0 +1,135 @@
+{
+    "mappings" : {
+      "index-pattern" : {
+        "properties" : {
+          "fieldFormatMap" : {
+            "type" : "string"
+          },
+          "fields" : {
+            "type" : "string"
+          },
+          "intervalName" : {
+            "type" : "string"
+          },
+          "notExpandable" : {
+            "type" : "boolean"
+          },
+          "timeFieldName" : {
+            "type" : "string"
+          },
+          "title" : {
+            "type" : "string"
+          }
+        }
+      },
+      "config" : {
+        "properties" : {
+          "buildNum" : {
+            "type" : "string",
+            "index" : "not_analyzed"
+          }
+        }
+      },
+      "search" : {
+        "properties" : {
+          "columns" : {
+            "type" : "string"
+          },
+          "description" : {
+            "type" : "string"
+          },
+          "hits" : {
+            "type" : "integer"
+          },
+          "kibanaSavedObjectMeta" : {
+            "properties" : {
+              "searchSourceJSON" : {
+                "type" : "string"
+              }
+            }
+          },
+          "sort" : {
+            "type" : "string"
+          },
+          "title" : {
+            "type" : "string"
+          },
+          "version" : {
+            "type" : "integer"
+          }
+        }
+      },
+      "visualization" : {
+        "properties" : {
+          "description" : {
+            "type" : "string"
+          },
+          "kibanaSavedObjectMeta" : {
+            "properties" : {
+              "searchSourceJSON" : {
+                "type" : "string"
+              }
+            }
+          },
+          "savedSearchId" : {
+            "type" : "string"
+          },
+          "title" : {
+            "type" : "string"
+          },
+          "uiStateJSON" : {
+            "type" : "string"
+          },
+          "version" : {
+            "type" : "integer"
+          },
+          "visState" : {
+            "type" : "string"
+          }
+        }
+      },
+      "dashboard" : {
+        "properties" : {
+          "description" : {
+            "type" : "string"
+          },
+          "hits" : {
+            "type" : "integer"
+          },
+          "kibanaSavedObjectMeta" : {
+            "properties" : {
+              "searchSourceJSON" : {
+                "type" : "string"
+              }
+            }
+          },
+          "optionsJSON" : {
+            "type" : "string"
+          },
+          "panelsJSON" : {
+            "type" : "string"
+          },
+          "timeFrom" : {
+            "type" : "string"
+          },
+          "timeRestore" : {
+            "type" : "boolean"
+          },
+          "timeTo" : {
+            "type" : "string"
+          },
+          "title" : {
+            "type" : "string"
+          },
+          "uiStateJSON" : {
+            "type" : "string"
+          },
+          "version" : {
+            "type" : "integer"
+          }
+        }
+      }
+    },
+    "template": ".kibana"
+}
+
diff --git a/elasticsearch/files/es_template_log.json b/elasticsearch/files/es_template_log.json
new file mode 100644
index 0000000..1c3e7fb
--- /dev/null
+++ b/elasticsearch/files/es_template_log.json
@@ -0,0 +1,112 @@
+{
+    "mappings": {
+        "message": {
+            "properties": {
+                "Logger": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "Hostname": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "Pid": {
+                    "index": "not_analyzed",
+                    "type": "long"
+                },
+                "Severity": {
+                    "index": "not_analyzed",
+                    "type": "long"
+                },
+                "Type": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "programname": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "python_module": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "severity_label": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "environment_label": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "openstack_roles": {
+                    "type": "string",
+                    "analyzer": "ost_roles"
+                },
+                "openstack_region": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "openstack_release": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "deployment_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "request_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "tenant_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "user_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "instance_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "http_response_time": {
+                    "type": "float"
+                },
+                "http_status": {
+                    "type": "integer"
+                },
+                "http_method": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "http_url": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "http_version": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                }
+            }
+        }
+    },
+    "settings": {
+        "analysis": {
+            "tokenizer": {
+                 "comma" : {
+                     "type": "pattern",
+                     "pattern": ","
+                 }
+            },
+            "analyzer": {
+                 "ost_roles": {
+                     "type": "custom",
+                     "tokenizer": "comma",
+                     "filter": ["lowercase"]
+                 }
+            }
+        }
+    },
+    "template": "log-*"
+}
diff --git a/elasticsearch/files/es_template_notification.json b/elasticsearch/files/es_template_notification.json
new file mode 100644
index 0000000..e19c907
--- /dev/null
+++ b/elasticsearch/files/es_template_notification.json
@@ -0,0 +1,109 @@
+{
+    "mappings": {
+        "message": {
+            "properties": {
+                "event_type": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "Payload": {
+                    "type": "string"
+                },
+                "Logger": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "programname": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "Hostname": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "hostname": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "Pid": {
+                    "index": "not_analyzed",
+                    "type": "long"
+                },
+                "Severity": {
+                    "index": "not_analyzed",
+                    "type": "long"
+                },
+                "syslogfacility": {
+                    "index": "not_analyzed",
+                    "type": "long"
+                },
+                "Type": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "severity_label": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "environment_label": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "openstack_role": {
+                    "type": "string",
+                    "analyzer": "ost_roles"
+                },
+                "openstack_region": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "openstack_release": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "deployment_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "request_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "tenant_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "user_id": {
+                    "index": "not_analyzed",
+                    "type": "string"
+                },
+                "launched_at": {
+                    "type": "date",
+                    "format": "dateOptionalTime"
+                },
+                "created_at": {
+                    "type": "date",
+                    "format": "dateOptionalTime"
+                }
+            }
+        }
+    },
+    "settings": {
+        "analysis": {
+            "tokenizer": {
+                 "comma" : {
+                     "type": "pattern",
+                     "pattern": ","
+                 }
+            },
+            "analyzer": {
+                 "ost_roles": {
+                     "type": "custom",
+                     "tokenizer": "comma",
+                     "filter": ["lowercase"]
+                 }
+            }
+        }
+    },
+    "template": "notification-*"
+}
diff --git a/metadata/service/client.yml b/metadata/service/client.yml
index 1e5fbc1..fc57c7c 100644
--- a/metadata/service/client.yml
+++ b/metadata/service/client.yml
@@ -4,3 +4,13 @@
   elasticsearch:
     client:
       enabled: true
+      index:
+        log:
+          enabled: true
+          template: elasticsearch/files/es_template_log.json
+        notification:
+          enabled: true
+          template: elasticsearch/files/es_template_notification.json
+        kibana4:
+          enabled: true
+          template: elasticsearch/files/es_template_kibana4.json