servers.py 6.04 KB
Newer Older
Will Daly committed
1 2 3
"""
Run and manage servers for local development.
"""
4 5
from __future__ import print_function
import sys
Will Daly committed
6 7 8
import argparse
from paver.easy import *
from .utils.cmd import django_cmd
9
from .utils.process import run_process, run_multi_processes
Will Daly committed
10 11 12


DEFAULT_PORT = {"lms": 8000, "studio": 8001}
13
DEFAULT_SETTINGS = 'devstack'
Will Daly committed
14 15


16
def run_server(system, settings=None, port=None, skip_assets=False, contracts=False):
Will Daly committed
17 18 19 20 21 22 23 24
    """
    Start the server for the specified `system` (lms or studio).
    `settings` is the Django settings module to use; if not provided, use the default.
    `port` is the port to run the server on; if not provided, use the default port for the system.

    If `skip_assets` is True, skip the asset compilation step.
    """
    if system not in ['lms', 'studio']:
25
        print("System must be either lms or studio", file=sys.stderr)
Will Daly committed
26 27
        exit(1)

28 29 30
    if not settings:
        settings = DEFAULT_SETTINGS

Will Daly committed
31 32
    if not skip_assets:
        # Local dev settings use staticfiles to serve assets, so we can skip the collecstatic step
33
        args = [system, '--settings={}'.format(settings), '--skip-collect', '--watch']
Will Daly committed
34 35 36 37 38
        call_task('pavelib.assets.update_assets', args=args)

    if port is None:
        port = DEFAULT_PORT[system]

39 40 41 42 43 44
    args = [settings, 'runserver', '--traceback', '--pythonpath=.', '0.0.0.0:{}'.format(port)]

    if contracts:
        args.append("--contracts")

    run_process(django_cmd(system, *args))
Will Daly committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ("settings=", "s", "Django settings"),
    ("port=", "p", "Port"),
    ("fast", "f", "Skip updating assets")
])
def lms(options):
    """
    Run the LMS server.
    """
    settings = getattr(options, 'settings', None)
    port = getattr(options, 'port', None)
    fast = getattr(options, 'fast', False)
    run_server('lms', settings=settings, port=port, skip_assets=fast)


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ("settings=", "s", "Django settings"),
    ("port=", "p", "Port"),
    ("fast", "f", "Skip updating assets")
])
def studio(options):
    """
    Run the Studio server.
    """
    settings = getattr(options, 'settings', None)
    port = getattr(options, 'port', None)
    fast = getattr(options, 'fast', False)
    run_server('studio', settings=settings, port=port, skip_assets=fast)


@task
@needs('pavelib.prereqs.install_prereqs')
@consume_args
84
@no_help
Will Daly committed
85 86 87 88 89 90 91
def devstack(args):
    """
    Start the devstack lms or studio server
    """
    parser = argparse.ArgumentParser(prog='paver devstack')
    parser.add_argument('system', type=str, nargs=1, help="lms or studio")
    parser.add_argument('--fast', action='store_true', default=False, help="Skip updating assets")
92 93 94 95 96 97
    parser.add_argument(
        '--no-contracts',
        action='store_true',
        default=False,
        help="Disable contracts. By default, they're enabled in devstack."
    )
Will Daly committed
98
    args = parser.parse_args(args)
99
    run_server(args.system[0], settings='devstack', skip_assets=args.fast, contracts=(not args.no_contracts))
Will Daly committed
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ("settings=", "s", "Django settings"),
])
def celery(options):
    """
    Runs Celery workers.
    """
    settings = getattr(options, 'settings', 'dev_with_worker')
    run_process(django_cmd('lms', settings, 'celery', 'worker', '--loglevel=INFO', '--pythonpath=.'))


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
118
    ("settings=", "s", "Django settings for both LMS and Studio"),
Will Daly committed
119
    ("worker_settings=", "w", "Celery worker Django settings"),
120 121 122
    ("fast", "f", "Skip updating assets"),
    ("settings_lms=", "l", "Set LMS only, overriding the value from --settings (if provided)"),
    ("settings_cms=", "c", "Set Studio only, overriding the value from --settings (if provided)"),
Will Daly committed
123 124 125 126 127
])
def run_all_servers(options):
    """
    Runs Celery workers, Studio, and LMS.
    """
128
    settings = getattr(options, 'settings', DEFAULT_SETTINGS)
129 130
    settings_lms = getattr(options, 'settings_lms', settings)
    settings_cms = getattr(options, 'settings_cms', settings)
Will Daly committed
131 132 133 134
    worker_settings = getattr(options, 'worker_settings', 'dev_with_worker')
    fast = getattr(options, 'fast', False)

    if not fast:
135 136 137 138 139 140
        args = ['lms', '--settings={}'.format(settings_lms), '--skip-collect']
        call_task('pavelib.assets.update_assets', args=args)

        args = ['studio', '--settings={}'.format(settings_cms), '--skip-collect']
        call_task('pavelib.assets.update_assets', args=args)

141
        call_task('pavelib.assets.watch_assets', options={'background': True})
Will Daly committed
142
    run_multi_processes([
143 144
        django_cmd('lms', settings_lms, 'runserver', '--traceback', '--pythonpath=.', "0.0.0.0:{}".format(DEFAULT_PORT['lms'])),
        django_cmd('studio', settings_cms, 'runserver', '--traceback', '--pythonpath=.', "0.0.0.0:{}".format(DEFAULT_PORT['studio'])),
Will Daly committed
145 146 147 148 149 150 151 152 153 154 155 156 157
        django_cmd('lms', worker_settings, 'celery', 'worker', '--loglevel=INFO', '--pythonpath=.')
    ])


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ("settings=", "s", "Django settings"),
])
def update_db():
    """
    Runs syncdb and then migrate.
    """
158
    settings = getattr(options, 'settings', DEFAULT_SETTINGS)
159 160
    for system in ('lms', 'cms'):
        sh(django_cmd(system, settings, 'syncdb', '--migrate', '--traceback', '--pythonpath=.'))
Will Daly committed
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183


@task
@needs('pavelib.prereqs.install_prereqs')
@consume_args
def check_settings(args):
    """
    Checks settings files.
    """
    parser = argparse.ArgumentParser(prog='paver check_settings')
    parser.add_argument('system', type=str, nargs=1, help="lms or studio")
    parser.add_argument('settings', type=str, nargs=1, help='Django settings')
    args = parser.parse_args(args)

    system = args.system[0]
    settings = args.settings[0]

    try:
        import_cmd = "echo 'import {system}.envs.{settings}'".format(system=system, settings=settings)
        django_shell_cmd = django_cmd(system, settings, 'shell', '--plain', '--pythonpath=.')
        sh("{import_cmd} | {shell_cmd}".format(import_cmd=import_cmd, shell_cmd=django_shell_cmd))

    except:
184
        print("Failed to import settings", file=sys.stderr)