From e9cde2b7415c2b365bdcc0ceff3012f2a935a7db Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Mon, 8 Jan 2018 09:16:45 +0000
Subject: [PATCH] Add fabfile and set variables

---
 fabfile.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 152 insertions(+)
 create mode 100644 fabfile.py

diff --git a/fabfile.py b/fabfile.py
new file mode 100644
index 000000000..c52eb5b1c
--- /dev/null
+++ b/fabfile.py
@@ -0,0 +1,152 @@
+import os
+from datetime import datetime
+
+from fabric.api import roles, runs_once, run, local, env, prompt, get
+
+
+env.roledefs = {
+    'production': [],
+    'pre-production': ['otfpreprod@staging-1-a.bmyrk.torchbox.net'],
+    'staging': ['otfstaging@staging-1-a.bmyrk.torchbox.net'],
+}
+
+
+@roles('production')
+def deploy_production():
+    # Remove this line when you're happy that this task is correct
+    raise RuntimeError("Please check the fabfile before using it")
+
+    run('git pull')
+    run('pip install -r requirements.txt')
+    _run_migrate()
+    run('django-admin collectstatic --noinput')
+
+    # 'restart' should be an alias to a script that restarts the web server
+    run('restart')
+
+    _post_deploy()
+
+
+@runs_once
+@roles('production')
+def pull_production_data():
+    # Remove this line when you're happy that this task is correct
+    raise RuntimeError("Please check the fabfile before using it")
+
+    _pull_data(
+        env_name='production',
+        remote_db_name='opentech',
+        local_db_name='opentech',
+        remote_dump_path='/usr/local/django/otf/tmp/',
+        local_dump_path='/tmp/',
+    )
+
+
+@runs_once
+@roles('production')
+def pull_production_media():
+    local('rsync -avz %s:\'%s\' /vagrant/media/' % (env['host_string'], '$CFG_MEDIA_DIR'))
+
+
+@roles('staging')
+def deploy_staging():
+    # Remove this line when you're happy that this task is correct
+    raise RuntimeError("Please check the fabfile before using it")
+
+    run('git pull')
+    run('pip install -r requirements.txt')
+    _run_migrate()
+    run('django-admin collectstatic --noinput')
+
+    # 'restart' should be an alias to a script that restarts the web server
+    run('restart')
+
+    _post_deploy()
+
+
+@runs_once
+@roles('staging')
+def pull_staging_data():
+    # Remove this line when you're happy that this task is correct
+    raise RuntimeError("Please check the fabfile before using it")
+
+    _pull_data(
+        env_name='staging',
+        remote_db_name='otfstaging',
+        local_db_name='otfstaging',
+        remote_dump_path='/usr/local/django/otf/tmp/',
+        local_dump_path='/tmp/',
+    )
+
+
+@runs_once
+@roles('staging')
+def pull_staging_media():
+    local('rsync -avz %s:\'%s\' /vagrant/media/' % (env['host_string'], '$CFG_MEDIA_DIR'))
+
+
+@runs_once
+def _pull_data(env_name, remote_db_name, local_db_name, remote_dump_path, local_dump_path):
+    timestamp = datetime.now().strftime('%Y%m%d-%I%M%S')
+
+    filename = '.'.join([env_name, remote_db_name, timestamp, 'sql'])
+    remote_filename = remote_dump_path + filename
+    local_filename = local_dump_path + filename
+
+    params = {
+        'remote_db_name': remote_db_name,
+        'remote_filename': remote_filename,
+        'local_db_name': local_db_name,
+        'local_filename': local_filename,
+    }
+
+    # Dump/download database from server
+    run('pg_dump {remote_db_name} -xOf {remote_filename}'.format(**params))
+    run('gzip {remote_filename}'.format(**params))
+    get('{remote_filename}.gz'.format(**params), '{local_filename}.gz'.format(**params))
+    run('rm {remote_filename}.gz'.format(**params))
+
+    # Load database locally
+    local('gunzip {local_filename}.gz'.format(**params))
+    _restore_db(local_db_name, local_filename)
+
+
+def _restore_db(local_db_name, local_dump_path):
+    params = {
+        'local_db_name': local_db_name,
+        'local_dump_path': local_dump_path,
+    }
+
+    local('dropdb {local_db_name}'.format(**params))
+    local('createdb {local_db_name}'.format(**params))
+    local('psql {local_db_name} -f {local_dump_path}'.format(**params))
+    local('rm {local_dump_path}'.format(**params))
+
+    newsuperuser = prompt(
+        'Any superuser accounts you previously created locally will'
+        ' have been wiped. Do you wish to create a new superuser? (Y/n): ',
+        default="Y"
+    )
+    if newsuperuser.strip().lower() == 'y':
+        local('django-admin createsuperuser')
+
+
+@runs_once
+def _run_migrate():
+    # Run migrations
+    run('django-admin migrate --noinput')
+    # Create a table for database cache backend
+    run('django-admin createcachetable')
+
+
+@runs_once
+def _post_deploy():
+    # clear frontend cache
+    run(
+        'for host in $(echo $CFG_HOSTNAMES | tr \',\' \' \'); do echo "Purge cache for $host";'
+        'ats-cache-purge $host; '
+        'done'
+    )
+
+    # update search index
+    run('django-admin update_index')
-- 
GitLab