Unverified Commit e84961eb by Kevin Falcone Committed by GitHub

Merge pull request #4520 from edx/jibsheet/xqueue-edx-service

Move XQueue to use edx_service
parents d29cec3e bc3b93a5
- Role: XQueue
- Convert to a yaml config (instead of xqueue.auth.json and xqueue.env.json we get xqueue.yml and it lives by default in /edx/etc/xqueue.yml like standard IDAs)
- Add XQUEUE_DEFAULT_FILE_STORAGE so that you can specify S3 or Swift in your config
- Role: credentials
- Set `LANGUAGE_COOKIE_NAME` so that Credentials will use the global language cookie.
......
......@@ -2,6 +2,7 @@
XQUEUE_SYSLOG_SERVER: "localhost"
XQUEUE_RABBITMQ_HOSTNAME: "edx.devstack.rabbit"
XQUEUE_MYSQL_HOST: "edx.devstack.mysql"
XQUEUE_SETTINGS: "devstack"
xqueue_gunicorn_port: 18040
xqueue_gunicorn_host: 0.0.0.0
devstack: true
......@@ -23,6 +23,10 @@ edx_service_repos: []
# and not write out a config at all.
edx_service_config: {}
# If you would like edx_service to strip out !!null settings before writing out
# the yaml config, set this to true.
edx_service_config_filter_nones: false
#
# OS packages
#
......
---
# {{ ansible_managed }}
{% if edx_service_config_filter_nones -%}
{% for key, value in edx_service_config.copy().iteritems() -%}
{% if value is none -%}
{% do edx_service_config.pop(key) %}
{%- endif %}
{%- endfor %}
{%- endif %}
{{ edx_service_config | to_nice_yaml }}
......@@ -21,22 +21,25 @@ XQUEUE_SYSLOG_SERVER: 'localhost'
XQUEUE_UPLOAD_BUCKET: 'sandbox-bucket'
XQUEUE_UPLOAD_PATH_PREFIX: 'sandbox-xqueue'
# You can set this to S3 or Swift, but it will
# default to the django file storage for tests/devstacks
XQUEUE_DEFAULT_FILE_STORAGE: !!null
XQUEUE_LOCAL_LOGLEVEL: 'INFO'
# If you try to use an Instance IAM Role rather than a user key S3 will invalidate the signed
# URLs used in uploaded file submissions. If you don't upload files on grade submissions, then
# it's ok, the submission is stored directly in the database.
XQUEUE_AWS_ACCESS_KEY_ID : ''
XQUEUE_AWS_SECRET_ACCESS_KEY : ''
XQUEUE_AWS_ACCESS_KEY_ID : !!null
XQUEUE_AWS_SECRET_ACCESS_KEY : !!null
XQUEUE_SWIFT_USERNAME: ''
XQUEUE_SWIFT_KEY: ''
XQUEUE_SWIFT_TENANT_ID: ''
XQUEUE_SWIFT_TENANT_NAME: ''
XQUEUE_SWIFT_AUTH_URL: ''
XQUEUE_SWIFT_AUTH_VERSION: 1
XQUEUE_SWIFT_REGION_NAME: ''
XQUEUE_SWIFT_USERNAME: !!null
XQUEUE_SWIFT_KEY: !!null
XQUEUE_SWIFT_TENANT_ID: !!null
XQUEUE_SWIFT_TENANT_NAME: !!null
XQUEUE_SWIFT_AUTH_URL: !!null
XQUEUE_SWIFT_AUTH_VERSION: !!null
XQUEUE_SWIFT_REGION_NAME: !!null
XQUEUE_BASIC_AUTH_USER: "{{ COMMON_HTPASSWD_USER }}"
XQUEUE_BASIC_AUTH_PASSWORD: "{{ COMMON_HTPASSWD_PASS }}"
......@@ -54,7 +57,6 @@ XQUEUE_MYSQL_CONN_MAX_AGE: 0 # This is Django's default https://docs.djangoproje
XQUEUE_NEWRELIC_APPNAME: "{{ COMMON_ENVIRONMENT }}-{{ COMMON_DEPLOYMENT }}-xqueue"
XQUEUE_CONSUMER_NEWRELIC_APPNAME: "{{ COMMON_ENVIRONMENT }}-{{ COMMON_DEPLOYMENT }}-xqueue_consumer"
XQUEUE_SETTINGS_MODULE: "xqueue.aws_settings"
# Set the number of gunicorn front end workers explicitely for xqueue
XQUEUE_WORKERS: !!null
......@@ -66,29 +68,11 @@ XQUEUE_SUBMISSION_PROCESSING_DELAY: 1
# Number of seconds to delay before querying for available push submissions
XQUEUE_CONSUMER_DELAY: 10
# Internal vars below this line
#############################################
xqueue_app_dir: "{{ COMMON_APP_DIR }}/xqueue"
xqueue_code_dir: "{{ xqueue_app_dir }}/xqueue"
xqueue_data_dir: "{{ COMMON_DATA_DIR }}/xqueue"
xqueue_venvs_dir: "{{ xqueue_app_dir }}/venvs"
xqueue_venv_dir: "{{ xqueue_venvs_dir }}/xqueue"
xqueue_venv_bin: "{{ xqueue_venv_dir }}/bin"
xqueue_user: "xqueue"
INSIGHTS_CSRF_COOKIE_SECURE: false
# Default nginx listen port
# These should be overrided if you want
# to serve all content on port 80
xqueue_gunicorn_port: 8040
xqueue_gunicorn_host: 127.0.0.1
xqueue_environment:
DJANGO_SETTINGS_MODULE: '{{ XQUEUE_SETTINGS_MODULE }}'
PATH: '{{ xqueue_venv_bin }}:{{ ansible_env.PATH }}'
xqueue_env_config:
# This block of config is dropped into /edx/etc/xqueue.yml
# and is read in by xqueue.XQUEUE_SETTINGS
XQUEUE_CONFIG:
XQUEUES: "{{ XQUEUE_QUEUES }}"
LOGGING_ENV: "{{ XQUEUE_LOGGING_ENV }}"
SYSLOG_SERVER: "{{ XQUEUE_SYSLOG_SERVER }}"
......@@ -98,11 +82,10 @@ xqueue_env_config:
LOCAL_LOGLEVEL: "{{ XQUEUE_LOCAL_LOGLEVEL }}"
UPLOAD_BUCKET: "{{ XQUEUE_UPLOAD_BUCKET }}"
UPLOAD_PATH_PREFIX: "{{ XQUEUE_UPLOAD_PATH_PREFIX }}"
DEFAULT_FILE_STORAGE: "{{ XQUEUE_DEFAULT_FILE_STORAGE }}"
NEWRELIC_APPNAME: "{{ XQUEUE_NEWRELIC_APPNAME }}"
SUBMISSION_PROCESSING_DELAY: "{{ XQUEUE_SUBMISSION_PROCESSING_DELAY }}"
CONSUMER_DELAY: "{{ XQUEUE_CONSUMER_DELAY }}"
xqueue_auth_config:
AWS_ACCESS_KEY_ID: "{{ XQUEUE_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "{{ XQUEUE_AWS_SECRET_ACCESS_KEY }}"
SWIFT_USERNAME: "{{ XQUEUE_SWIFT_USERNAME }}"
......@@ -112,6 +95,7 @@ xqueue_auth_config:
SWIFT_AUTH_URL: "{{ XQUEUE_SWIFT_AUTH_URL }}"
SWIFT_AUTH_VERSION: "{{ XQUEUE_SWIFT_AUTH_VERSION }}"
SWIFT_REGION_NAME: "{{ XQUEUE_SWIFT_REGION_NAME }}"
# This is used by the xqueue consumer in case it needs to send a password protected submission out for a push grader.
REQUESTS_BASIC_AUTH: ["{{ XQUEUE_BASIC_AUTH_USER }}", "{{XQUEUE_BASIC_AUTH_PASSWORD}}"]
USERS: "{{ XQUEUE_DJANGO_USERS }}"
DATABASES:
......@@ -127,8 +111,44 @@ xqueue_auth_config:
OPTIONS: "{{ XQUEUE_MYSQL_OPTIONS }}"
NEWRELIC_LICENSE_KEY: "{{ NEWRELIC_LICENSE_KEY | default('') }}"
xqueue_source_repo: "https://github.com/edx/xqueue.git"
xqueue_version: 'master'
XQUEUE_VERSION: "master"
XQUEUE_GIT_IDENTITY: !!null
XQUEUE_REPOS:
- PROTOCOL: "{{ COMMON_GIT_PROTOCOL }}"
DOMAIN: "{{ COMMON_GIT_MIRROR }}"
PATH: "{{ COMMON_GIT_PATH }}"
REPO: xqueue.git
VERSION: "{{ XQUEUE_VERSION }}"
DESTINATION: "{{ xqueue_code_dir }}"
SSH_KEY: "{{ XQUEUE_GIT_IDENTITY }}"
# Internal vars below this line
#############################################
xqueue_service_name: "xqueue"
xqueue_app_dir: "{{ COMMON_APP_DIR }}/xqueue"
xqueue_code_dir: "{{ xqueue_app_dir }}/xqueue"
xqueue_data_dir: "{{ COMMON_DATA_DIR }}/xqueue"
xqueue_venvs_dir: "{{ xqueue_app_dir }}/venvs"
xqueue_venv_dir: "{{ xqueue_venvs_dir }}/xqueue"
xqueue_venv_bin: "{{ xqueue_venv_dir }}/bin"
xqueue_user: "xqueue"
xqueue_home: "{{ COMMON_APP_DIR }}/{{ xqueue_service_name }}"
# Default nginx listen port
# These should be overrided if you want
# to serve all content on port 80
xqueue_gunicorn_port: 8040
xqueue_gunicorn_host: 127.0.0.1
xqueue_environment:
DJANGO_SETTINGS_MODULE: 'xqueue.{{ XQUEUE_SETTINGS }}'
PATH: '{{ xqueue_venv_bin }}:{{ ansible_env.PATH }}'
XQUEUE_CFG: '{{ COMMON_CFG_DIR }}/xqueue.yml'
xqueue_requirements_file: "{{ xqueue_code_dir }}/requirements.txt"
xqueue_openstack_requirements_file: "{{ xqueue_code_dir }}/openstack-requirements.txt"
......
......@@ -2,3 +2,13 @@
dependencies:
- common
- supervisor
- role: edx_service
edx_service_name: "{{ xqueue_service_name }}"
edx_service_config: "{{ XQUEUE_CONFIG }}"
edx_service_config_filter_nones: true
edx_service_repos: "{{ XQUEUE_REPOS }}"
edx_service_user: "{{ xqueue_user }}"
edx_service_home: "{{ xqueue_home }}"
edx_service_packages:
debian: "{{ xqueue_debian_pkgs }}"
redhat: []
---
- name: "Writing supervisor scripts - xqueue, xqueue consumer"
template:
src: "{{ item }}.conf.j2"
dest: "{{ supervisor_available_dir }}/{{ item }}.conf"
owner: "{{ supervisor_user }}"
group: "{{ common_web_user }}"
mode: "0644"
with_items:
- xqueue
- xqueue_consumer
tags:
- install
- install:configuration
- name: "Enabling supervisor scripts - xqueue, xqueue consumer"
file:
src: "{{ supervisor_available_dir }}/{{ item }}.conf"
dest: "{{ supervisor_cfg_dir }}/{{ item }}.conf"
owner: "{{ supervisor_user }}"
group: "{{ common_web_user }}"
mode: "0644"
state: link
force: yes
with_items:
- xqueue
- xqueue_consumer
when: not disable_edx_services
tags:
- install
- install:configuration
- name: Copy the configurations to the desired directory
template:
src: "{{ item.src }}"
dest: "{{ xqueue_app_dir }}/{{ item.dest }}"
mode: "{{ item.mode }}"
become_user: "{{ xqueue_user }}"
with_items:
- { src: 'xqueue_gunicorn.py.j2', dest: 'xqueue_gunicorn.py', mode: '0644' }
- { src: 'xqueue.env.json.j2', dest: 'xqueue.env.json', mode: '0644' }
- { src: 'xqueue.auth.json.j2', dest: 'xqueue.auth.json', mode: '0644' }
tags:
- install
- install:configuration
- name: setup the app env file
template:
src: "xqueue_env.j2"
dest: "{{ xqueue_app_dir }}/xqueue_env"
owner: "{{ xqueue_user }}"
group: "{{ common_web_group }}"
mode: 0644
tags:
- install
- install:configuration
# Do A Checkout
- name: "Git checkout xqueue repo into {{ xqueue_code_dir }}"
git:
repo: "{{ xqueue_source_repo }}"
dest: "{{ xqueue_code_dir }}"
version: "{{ xqueue_version }}"
accept_hostkey: yes
become_user: "{{ xqueue_user }}"
register: xqueue_checkout
tags:
- install
- install:code
# Install the python requirements into {{ xqueue_venv_dir }}
- name: "Install python requirements"
pip:
requirements: "{{ xqueue_requirements_file }}"
virtualenv: "{{ xqueue_venv_dir }}"
state: present
extra_args: "-i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w"
become_user: "{{ xqueue_user }}"
tags:
- install
- install:app-requirements
# If this is an openstack deployment, install openstack requirements
- name: Install python openstack requirements
pip:
requirements: "{{ xqueue_openstack_requirements_file }}"
virtualenv: "{{ xqueue_venv_dir }}"
state: present
extra_args: "-i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w"
become_user: "{{ xqueue_user }}"
when: XQUEUE_SETTINGS == 'openstack_settings'
tags:
- install
- install:app-requirements
# If there is a common user for migrations run migrations using his username
# and credentials. If not we use the xqueue mysql user
- name: Migrate
shell: "{{ xqueue_venv_bin }}/django-admin.py migrate --noinput --settings=xqueue.{{ XQUEUE_SETTINGS }} --pythonpath={{ xqueue_code_dir }}"
become_user: "{{ xqueue_user }}"
environment:
DB_MIGRATION_USER: "{{ COMMON_MYSQL_MIGRATE_USER }}"
DB_MIGRATION_PASS: "{{ COMMON_MYSQL_MIGRATE_PASS }}"
when: migrate_db is defined and migrate_db|lower == "yes" and COMMON_MYSQL_MIGRATE_PASS
run_once: yes
tags:
- migrate
- migrate:db
- name: Create users
shell: "SERVICE_VARIANT=xqueue {{ xqueue_venv_bin }}/django-admin.py update_users --settings=xqueue.{{ XQUEUE_SETTINGS }} --pythonpath={{ xqueue_code_dir }}"
become_user: "{{ xqueue_user }}"
when: not disable_edx_services
tags:
- manage
- manage:app-users
# call supervisorctl update. this reloads
# the supervisorctl config and restarts
# the services if any of the configurations
# have changed.
#
- name: Update supervisor configuration
shell: "{{ supervisor_ctl }} -c {{ supervisor_cfg }} update"
register: supervisor_update
changed_when: supervisor_update.stdout is defined and supervisor_update.stdout != ""
when: not disable_edx_services
- name: Ensure xqueue, consumer is running
supervisorctl:
name: "{{ item }}"
supervisorctl_path: "{{ supervisor_ctl }}"
config: "{{ supervisor_cfg }}"
state: started
with_items:
- xqueue
- xqueue_consumer
when: not disable_edx_services
tags:
- manage
- manage:start
- name: Create a symlink for venv commands
file:
src: "{{ xqueue_venv_bin }}/{{ item }}"
dest: "{{ COMMON_BIN_DIR }}/{{ item }}.xqueue"
state: link
with_items:
- python
- pip
tags:
- install
- install:app-requirements
- name: Create symlinks for repo commands
file:
src: "{{ xqueue_code_dir }}/{{ item }}"
dest: "{{ COMMON_BIN_DIR }}/{{ item.split('.')[0] }}.xqueue"
state: link
with_items:
- manage.py
tags:
- install
- install:app-requirements
- name: Restart xqueue
supervisorctl:
name: "{{ item }}"
supervisorctl_path: "{{ supervisor_ctl }}"
config: "{{ supervisor_cfg }}"
state: restarted
when: not disable_edx_services
with_items:
- xqueue
- xqueue_consumer
tags:
- manage
- manage:start
# requires:
# - group_vars/all
# - common/tasks/main.yml
---
# Check out xqueue repo to {{ xqueue_code_dir }}
#
#
- name: Create application user
user:
name: "{{ xqueue_user }}"
home: "{{ xqueue_app_dir }}"
createhome: no
shell: /bin/false
- name: write devstack script
template:
src: "devstack.sh.j2"
dest: "{{ xqueue_app_dir }}/devstack.sh"
owner: "{{ xqueue_user }}"
group: "{{ common_web_group }}"
mode: 0744
when: devstack is defined and devstack
tags:
- devstack
- devstack:install
- name: "Writing supervisor scripts - xqueue, xqueue consumer"
template:
src: "{{ item }}.conf.j2"
dest: "{{ supervisor_available_dir }}/{{ item }}.conf"
owner: "{{ supervisor_user }}"
group: "{{ common_web_user }}"
mode: "0644"
with_items:
- xqueue
- xqueue_consumer
tags:
- install
- install:base
- install:configuration
- name: Create xqueue app and venv dir
- name: "Enabling supervisor scripts - xqueue, xqueue consumer"
file:
path: "{{ item }}"
state: directory
owner: "{{ xqueue_user }}"
group: "{{ common_web_group }}"
src: "{{ supervisor_available_dir }}/{{ item }}.conf"
dest: "{{ supervisor_cfg_dir }}/{{ item }}.conf"
owner: "{{ supervisor_user }}"
group: "{{ common_web_user }}"
mode: "0644"
state: link
force: yes
with_items:
- "{{ xqueue_app_dir }}"
- "{{ xqueue_venvs_dir }}"
- xqueue
- xqueue_consumer
when: not disable_edx_services
tags:
- install
- install:base
- install:configuration
- name: Install a bunch of system packages on which xqueue relies
apt:
name: "{{ item }}"
state: present
with_items: "{{ xqueue_debian_pkgs }}"
- name: add gunicorn configuration file
template:
src: "xqueue_gunicorn.py.j2"
dest: "{{ xqueue_app_dir }}/xqueue_gunicorn.py"
become_user: "{{ xqueue_user }}"
tags:
- install
- install:system-requirements
- install:configuration
- name: write devstack script
- name: setup the app env file
template:
src: "devstack.sh.j2"
dest: "{{ xqueue_app_dir }}/devstack.sh"
src: "xqueue_env.j2"
dest: "{{ xqueue_app_dir }}/xqueue_env"
owner: "{{ xqueue_user }}"
group: "{{ common_web_group }}"
mode: 0744
when: devstack is defined and devstack
mode: 0644
tags:
- devstack
- devstack:install
- install
- install:configuration
# Install the python requirements into {{ xqueue_venv_dir }}
- name: "Install python requirements"
pip:
requirements: "{{ xqueue_requirements_file }}"
virtualenv: "{{ xqueue_venv_dir }}"
state: present
extra_args: "-i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w"
become_user: "{{ xqueue_user }}"
tags:
- install
- install:app-requirements
# If this is an openstack deployment, install openstack requirements
- name: Install python openstack requirements
pip:
requirements: "{{ xqueue_openstack_requirements_file }}"
virtualenv: "{{ xqueue_venv_dir }}"
state: present
extra_args: "-i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w"
become_user: "{{ xqueue_user }}"
when: XQUEUE_SETTINGS == 'openstack_settings'
tags:
- install
- install:app-requirements
# If there is a common user for migrations run migrations using his username
# and credentials. If not we use the xqueue mysql user
- name: Migrate
shell: "{{ xqueue_venv_bin }}/django-admin.py migrate --noinput --settings=xqueue.{{ XQUEUE_SETTINGS }} --pythonpath={{ xqueue_code_dir }}"
become_user: "{{ xqueue_user }}"
environment:
DB_MIGRATION_USER: "{{ COMMON_MYSQL_MIGRATE_USER }}"
DB_MIGRATION_PASS: "{{ COMMON_MYSQL_MIGRATE_PASS }}"
when: migrate_db is defined and migrate_db|lower == "yes" and COMMON_MYSQL_MIGRATE_PASS
run_once: yes
tags:
- migrate
- migrate:db
- name: Create users
shell: "SERVICE_VARIANT=xqueue {{ xqueue_venv_bin }}/django-admin.py update_users --settings=xqueue.{{ XQUEUE_SETTINGS }} --pythonpath={{ xqueue_code_dir }}"
become_user: "{{ xqueue_user }}"
when: not disable_edx_services
tags:
- manage
- manage:app-users
# call supervisorctl update. this reloads
# the supervisorctl config and restarts
# the services if any of the configurations
# have changed.
#
- name: Update supervisor configuration
shell: "{{ supervisor_ctl }} -c {{ supervisor_cfg }} update"
register: supervisor_update
changed_when: supervisor_update.stdout is defined and supervisor_update.stdout != ""
when: not disable_edx_services
- include: deploy.yml
- name: Ensure xqueue, consumer is running
supervisorctl:
name: "{{ item }}"
supervisorctl_path: "{{ supervisor_ctl }}"
config: "{{ supervisor_cfg }}"
state: started
with_items:
- xqueue
- xqueue_consumer
when: not disable_edx_services
tags:
- manage
- manage:start
- name: Create a symlink for venv commands
file:
src: "{{ xqueue_venv_bin }}/{{ item }}"
dest: "{{ COMMON_BIN_DIR }}/{{ item }}.xqueue"
state: link
with_items:
- python
- pip
tags:
- install
- install:app-requirements
- name: Create symlinks for repo commands
file:
src: "{{ xqueue_code_dir }}/{{ item }}"
dest: "{{ COMMON_BIN_DIR }}/{{ item.split('.')[0] }}.xqueue"
state: link
with_items:
- manage.py
tags:
- install
- install:app-requirements
- name: Restart xqueue
supervisorctl:
name: "{{ item }}"
supervisorctl_path: "{{ supervisor_ctl }}"
config: "{{ supervisor_cfg }}"
state: restarted
when: not disable_edx_services
with_items:
- xqueue
- xqueue_consumer
tags:
- deploy
- manage
- manage:start
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment