From 71c92ded22509e96f8a24867f36acddcda0b460e Mon Sep 17 00:00:00 2001
From: Francesco Siddi <francesco.siddi@gmail.com>
Date: Sat, 28 Nov 2015 21:45:29 +0100
Subject: [PATCH] Manager: fix for server registration

---
 docker/dashboard/dev/Dockerfile               |  2 +
 docker/dashboard/dev/manage.sh                |  3 ++
 docker/dashboard/dev/runserver.sh             |  2 +-
 docker/dashboard/pro/Dockerfile               |  2 +
 docker/dashboard/pro/manage.sh                |  3 ++
 docker/manager/dev/runserver.sh               |  4 ++
 docker/manager/pro/runserver.sh               |  3 ++
 flamenco/dashboard/application/__init__.py    | 17 +++++---
 .../dashboard/application/config.py.example   |  6 ---
 flamenco/dashboard/application/config_base.py |  6 +++
 .../dashboard/application/config_docker.py    |  2 +
 flamenco/manager/application/__init__.py      |  1 +
 flamenco/manager/application/config_base.py   |  4 +-
 flamenco/manager/manage.py                    | 41 ++++++++-----------
 14 files changed, 56 insertions(+), 40 deletions(-)
 create mode 100644 docker/dashboard/dev/manage.sh
 create mode 100644 docker/dashboard/pro/manage.sh
 delete mode 100644 flamenco/dashboard/application/config.py.example
 create mode 100644 flamenco/dashboard/application/config_base.py
 create mode 100644 flamenco/dashboard/application/config_docker.py

diff --git a/docker/dashboard/dev/Dockerfile b/docker/dashboard/dev/Dockerfile
index 6f825304..b75ee39b 100644
--- a/docker/dashboard/dev/Dockerfile
+++ b/docker/dashboard/dev/Dockerfile
@@ -36,6 +36,8 @@ VOLUME /data/config
 VOLUME /data/storage/shared
 VOLUME /data/storage/dashboard
 
+ENV IS_DOCKER True
+
 EXPOSE 8888
 
 ADD runserver.sh /runserver.sh
diff --git a/docker/dashboard/dev/manage.sh b/docker/dashboard/dev/manage.sh
new file mode 100644
index 00000000..b26d9f14
--- /dev/null
+++ b/docker/dashboard/dev/manage.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+. /data/venv/bin/activate && python /data/git/dashboard/manage.py $1 $2 $3
diff --git a/docker/dashboard/dev/runserver.sh b/docker/dashboard/dev/runserver.sh
index da7b88ca..6858c841 100644
--- a/docker/dashboard/dev/runserver.sh
+++ b/docker/dashboard/dev/runserver.sh
@@ -4,5 +4,5 @@
 if [ ! -d /data/git/dashboard/node_modules ]; then
 	bash setup.sh
 fi
-# Enable virtual evnvironment and start server
+# Enable virtual evnvironment and start dashboard
 . /data/venv/bin/activate && cd /data/git/dashboard && python manage.py runserver
diff --git a/docker/dashboard/pro/Dockerfile b/docker/dashboard/pro/Dockerfile
index eb6fa58b..bd19f8ea 100644
--- a/docker/dashboard/pro/Dockerfile
+++ b/docker/dashboard/pro/Dockerfile
@@ -48,6 +48,8 @@ VOLUME /data/config
 VOLUME /data/storage/shared
 VOLUME /data/storage/dashboard
 
+ENV IS_DOCKER True
+
 EXPOSE 8888
 
 ADD 000-default.conf /etc/apache2/sites-available/000-default.conf
diff --git a/docker/dashboard/pro/manage.sh b/docker/dashboard/pro/manage.sh
new file mode 100644
index 00000000..b26d9f14
--- /dev/null
+++ b/docker/dashboard/pro/manage.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+. /data/venv/bin/activate && python /data/git/dashboard/manage.py $1 $2 $3
diff --git a/docker/manager/dev/runserver.sh b/docker/manager/dev/runserver.sh
index e9e90113..f56b1293 100644
--- a/docker/manager/dev/runserver.sh
+++ b/docker/manager/dev/runserver.sh
@@ -7,4 +7,8 @@ if [ ! -e /installed ]; then
 	touch /installed
 fi
 
+# Enable virtual evnvironment and register manager
+. /data/venv/bin/activate && cd /data/git/manager && python manage.py setup_register_manager
+
+# Run development server
 . /data/venv/bin/activate && cd /data/git/manager && python manage.py runserver
diff --git a/docker/manager/pro/runserver.sh b/docker/manager/pro/runserver.sh
index edfce469..9e0004f0 100644
--- a/docker/manager/pro/runserver.sh
+++ b/docker/manager/pro/runserver.sh
@@ -7,5 +7,8 @@ if [ ! -e /installed ]; then
 	touch /installed
 fi
 
+# Enable virtual evnvironment and register manager
+. /data/venv/bin/activate && cd /data/git/manager && python manage.py setup_register_manager
+
 # Run Apache
 /usr/sbin/apache2 -D FOREGROUND
diff --git a/flamenco/dashboard/application/__init__.py b/flamenco/dashboard/application/__init__.py
index 086bf7c9..1a618dcb 100644
--- a/flamenco/dashboard/application/__init__.py
+++ b/flamenco/dashboard/application/__init__.py
@@ -10,11 +10,18 @@ app.config.update(
     SECRET_KEY='A0Zr98j/3yX R~XHH!jmN]LWX/,?RT',
 )
 
-try:
-    from application import config
-    app.config['FLAMENCO_SERVER'] = config.Config.FLAMENCO_SERVER
-except ImportError:
-    app.config['FLAMENCO_SERVER'] = 'localhost:9999'
+# Initial configuration
+from application import config_base
+app.config.from_object(config_base.Config)
+
+# If we are in a Docker container, override with some new defaults
+if os.environ.get('IS_DOCKER'):
+    from application import config_docker
+    app.config.from_object(config_docker.Config)
+
+# If a custom config file is specified, further override the config
+if os.environ.get('FLAMENCO_DASHBOARD_CONFIG'):
+    app.config.from_envvar('FLAMENCO_DASHBOARD_CONFIG')
 
 def check_connection():
     try:
diff --git a/flamenco/dashboard/application/config.py.example b/flamenco/dashboard/application/config.py.example
deleted file mode 100644
index b70c0c76..00000000
--- a/flamenco/dashboard/application/config.py.example
+++ /dev/null
@@ -1,6 +0,0 @@
-class Config(object):
-    DEBUG=True
-    FLAMENCO_SERVER='localhost:9999'
-
-    PORT=8888
-    HOST='0.0.0.0'
diff --git a/flamenco/dashboard/application/config_base.py b/flamenco/dashboard/application/config_base.py
new file mode 100644
index 00000000..41effe90
--- /dev/null
+++ b/flamenco/dashboard/application/config_base.py
@@ -0,0 +1,6 @@
+class Config(object):
+    DEBUG = True
+    FLAMENCO_SERVER = 'localhost:9999'
+    PORT = 8888
+    HOST = '0.0.0.0'
+
diff --git a/flamenco/dashboard/application/config_docker.py b/flamenco/dashboard/application/config_docker.py
new file mode 100644
index 00000000..d90f0c71
--- /dev/null
+++ b/flamenco/dashboard/application/config_docker.py
@@ -0,0 +1,2 @@
+class Config(object):
+    FLAMENCO_SERVER = 'flamenco_server:9999'
diff --git a/flamenco/manager/application/__init__.py b/flamenco/manager/application/__init__.py
index 8623e3c5..bd5abdfc 100644
--- a/flamenco/manager/application/__init__.py
+++ b/flamenco/manager/application/__init__.py
@@ -99,6 +99,7 @@ def register_manager(host, name, has_virtual_workers):
     r = http_request(app.config['FLAMENCO_SERVER'], '/managers', 'post', params=params)
 
     # If we don't find one, we proceed to create it, using the server reponse
+    # TODO handle case when token exists on the manager, but not on the server
     if not token:
         token = Setting(name='token', value=r['token'])
         db.session.add(token)
diff --git a/flamenco/manager/application/config_base.py b/flamenco/manager/application/config_base.py
index 88246b27..fa639813 100644
--- a/flamenco/manager/application/config_base.py
+++ b/flamenco/manager/application/config_base.py
@@ -6,7 +6,7 @@ class Config(object):
     DEBUG = True
     PORT = 7777
     HOST = '0.0.0.0' # or 'localhost'
-    HOSTNAME = 'My Manager' # or use socket.gethostname()
+    NAME = 'My Manager' # or use socket.gethostname()
     FLAMENCO_SERVER = 'localhost:9999'
 
     DATABASE_URI = 'sqlite:///' + os.path.join(os.path.dirname(__file__), '../')
@@ -20,7 +20,5 @@ class Config(object):
     TMP_FOLDER = tempfile.gettempdir()
     THUMBNAIL_EXTENSIONS = set(['png'])
 
-    # Don't change this variable until the worker's code will have costant declaration of this path
-    # see controllers.py line 243 to understand
     MANAGER_STORAGE = '{0}/static/storage'.format(
         os.path.join(os.path.dirname(__file__)))
diff --git a/flamenco/manager/manage.py b/flamenco/manager/manage.py
index 770309f0..13acbac6 100755
--- a/flamenco/manager/manage.py
+++ b/flamenco/manager/manage.py
@@ -76,38 +76,29 @@ def setup_db():
 
 
 @manager.command
-def runserver():
-    """This command is meant for development. If no configuration is found,
-    we start the app listening from all hosts, from port 7777."""
-    setup_db()
-
-    try:
-        from application import config
-        PORT = config.Config.PORT
-        DEBUG = config.Config.DEBUG
-        HOST = config.Config.HOST
-        HOSTNAME = config.Config.HOSTNAME
-        VIRTUAL_WORKERS = config.Config.VIRTUAL_WORKERS
-    except ImportError:
-        DEBUG = False
-        PORT = 7777
-        HOST = '0.0.0.0'
-        VIRTUAL_WORKERS = False
-        HOSTNAME = socket.gethostname()
-
+def setup_register_manager():
     # Register the manager to the server
     if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':
-        if VIRTUAL_WORKERS:
+        if app.config['VIRTUAL_WORKERS']:
             has_virtual_worker = 1
         else:
             has_virtual_worker = 0
-        full_host = "{0}:{1}".format(HOST, PORT)
-        register_manager(full_host, HOSTNAME, has_virtual_worker)
+        full_host = "http://{0}:{1}".format(
+            app.config['HOST'], app.config['PORT'])
+        register_manager(full_host, app.config['NAME'], has_virtual_worker)
+
+
+@manager.command
+def runserver():
+    """This command is meant for development. If no configuration is found,
+    we start the app listening from all hosts, from port 7777."""
+    setup_db()
+    setup_register_manager()
 
     app.run(
-        port=PORT,
-        debug=DEBUG,
-        host=HOST,
+        port=app.config['PORT'],
+        debug=app.config['DEBUG'],
+        host=app.config['HOST'],
         threaded=True)
 
 
-- 
GitLab