From 464da8019c48fc82daedb3d0fd8f849d7cca99ef Mon Sep 17 00:00:00 2001
From: Benjamin Bertrand <benjamin.bertrand@esss.se>
Date: Wed, 8 Aug 2018 22:01:03 +0200
Subject: [PATCH] Add elasticsearch dependency

JIRA INFRA-575
---
 .env                        |  3 ++-
 Makefile                    |  2 +-
 app/factory.py              |  6 ++++++
 app/settings.py             |  2 ++
 docker-compose.override.yml |  5 +++++
 docker-compose.yml          | 13 +++++++++++++
 requirements-to-freeze.txt  |  1 +
 requirements.txt            |  1 +
 8 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/.env b/.env
index e028ff2..29cca1b 100644
--- a/.env
+++ b/.env
@@ -1,4 +1,5 @@
 POSTGRES_USER=ics
 POSTGRES_PASSWORD=icspwd
 POSTGRES_DB=csentry_db
-PGDATA_VOLUME=./data
+PGDATA_VOLUME=./data/postgres
+ELASTIC_DATA_VOLUME=./data/elastic
diff --git a/Makefile b/Makefile
index 78966b9..d7220b3 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ release: refresh \
 release: ## build, tag, and push all stacks
 
 db: ## start postgres and redis for development
-	docker-compose up -d postgres redis worker
+	docker-compose up -d postgres redis elasticsearch worker
 
 init_db: ## initialize the dev database
 	docker-compose run --rm web flask db upgrade head
diff --git a/app/factory.py b/app/factory.py
index 8d11576..060d692 100644
--- a/app/factory.py
+++ b/app/factory.py
@@ -14,6 +14,7 @@ import sqlalchemy as sa
 import rq_dashboard
 from flask import Flask
 from whitenoise import WhiteNoise
+from elasticsearch import Elasticsearch
 from . import settings, models
 from .extensions import (
     db,
@@ -113,6 +114,11 @@ def create_app(config=None):
     app.config["SESSION_REDIS"] = session_redis_store
     fsession.init_app(app)
     cache.init_app(app)
+    app.elasticsearch = (
+        Elasticsearch([app.config["ELASTICSEARCH_URL"]])
+        if app.config["ELASTICSEARCH_URL"]
+        else None
+    )
 
     admin.init_app(app)
     admin.add_view(UserAdmin(models.User, db.session, endpoint="users"))
diff --git a/app/settings.py b/app/settings.py
index 14784a8..254a6e7 100644
--- a/app/settings.py
+++ b/app/settings.py
@@ -36,6 +36,8 @@ CACHE_REDIS_URL = "redis://redis:6379/1"
 REDIS_URL = "redis://redis:6379/2"
 QUEUES = ["default"]
 
+ELASTICSEARCH_URL = "http://elasticsearch:9200"
+
 LDAP_HOST = "esss.lu.se"
 LDAP_BASE_DN = "DC=esss,DC=lu,DC=se"
 LDAP_USER_DN = "OU=ESS Users"
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
index 239d28f..a36399a 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -26,3 +26,8 @@ services:
     volumes:
       - ./postgres/create-test-db.sh:/docker-entrypoint-initdb.d/create-test-db.sh
       - ${PGDATA_VOLUME}:/var/lib/postgresql/data/pgdata
+  elasticsearch:
+    volumes:
+      - ${ELASTIC_DATA_VOLUME}:/usr/share/elasticsearch/data
+    ports:
+      - "9200:9200"
diff --git a/docker-compose.yml b/docker-compose.yml
index 7700c32..ac0a319 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,6 +7,7 @@ services:
     depends_on:
       - postgres
       - redis
+      - elasticsearch
   worker:
     image: registry.esss.lu.se/ics-infrastructure/csentry:master
     container_name: csentry_worker
@@ -28,3 +29,15 @@ services:
   redis:
     image: redis:4.0
     container_name: csentry_redis
+  elasticsearch:
+    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
+    container_name: csentry_elasticsearch
+    environment:
+      - cluster.name=csentry-cluster
+      - bootstrap.memory_lock=true
+      - discovery.type=single-node
+      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+    ulimits:
+      memlock:
+        soft: -1
+        hard: -1
diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt
index 7d087bb..336128f 100644
--- a/requirements-to-freeze.txt
+++ b/requirements-to-freeze.txt
@@ -1,3 +1,4 @@
+elasticsearch
 flask>=1.0.0
 flask-admin
 flask-caching
diff --git a/requirements.txt b/requirements.txt
index 21a2a7b..c3ff3a8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,6 +6,7 @@ certifi==2018.4.16
 chardet==3.0.4
 click==6.7
 colorama==0.3.9
+elasticsearch==6.3.1
 et-xmlfile==1.0.1
 Flask==1.0.2
 Flask-Admin==1.5.1
-- 
GitLab