# if this node is in the cobbler group, configure it
- include: cobbler.yml
+# if this node is in the paddles group, configure it
+- include: paddles.yml
+
# if this node is in the pulpito group, configure it
- include: pulpito.yml
--- /dev/null
+---
+- hosts: paddles
+ roles:
+ - common
+ - paddles
--- /dev/null
+Paddles
+==========
+This role is used to configure a node to run paddles_.
+
+It has been tested on:
+
+- Ubuntu 14.04 (Trusty)
+
+.. _paddles: https://github.com/ceph/paddles
--- /dev/null
+---
+paddles_user: paddles
+
+paddles_repo: https://github.com/ceph/paddles.git
+
+# Default is to listen on all interfaces
+listen_ip: "0.0.0.0"
+paddles_port: 8080
+
+log_host: localhost
--- /dev/null
+---
+dependencies:
+ - role: secrets
+ - role: sudo
+ - role: users
--- /dev/null
+---
+- name: Include package type specific vars.
+ include_vars: "apt_systems.yml"
+ tags:
+ - always
+
+- name: Install packages via apt
+ apt:
+ name: "{{ item }}"
+ state: latest
+ update_cache: yes
+ cache_valid_time: 600
+ with_items: "{{ paddles_extra_packages }}"
+ tags:
+ - packages
--- /dev/null
+---
+- name: Include cobbler keys.
+ include_vars: "{{ secrets_path | mandatory }}/paddles.yml"
+ no_log: true
+
+- name: Set repo location
+ set_fact:
+ paddles_repo_path: "/home/{{ paddles_user }}/paddles"
+
+- name: Set paddles_address
+ set_fact:
+ paddles_address: http://{{ ansible_hostname }}/
+ when: not paddles_address.startswith('http')
+
+- name: Set db_url
+ set_fact:
+ db_url: "postgresql+psycopg2://{{ paddles_user }}:{{ db_pass }}@localhost/paddles"
+ no_log: true
+
+- include: apt_systems.yml
+ when: ansible_pkg_mgr == "apt"
+
+# Yum systems support is not implemented yet.
+- include: yum_systems.yml
+ when: ansible_pkg_mgr == "yum"
+
+# Set up the paddles user
+- include: setup_user.yml
+
+# Set up the actual paddles project
+- include: setup_paddles.yml
+
+# Set up the DB which paddles uses
+- include: setup_db.yml
+
+# Configure the system to run paddles as a daemon
+- include: setup_service.yml
--- /dev/null
+---
+- name: Create the postgresql database
+ postgresql_db:
+ name: paddles
+ sudo_user: postgres
+ register: create_db
+
+- name: Set up access to the database
+ postgresql_user:
+ db: paddles
+ name: "{{ paddles_user }}"
+ password: "{{ db_pass }}"
+ sudo_user: postgres
+ when: create_db|changed
+
+- name: Run pecan populate
+ command: ./virtualenv/bin/pecan populate prod.py
+ args:
+ chdir: "{{ paddles_repo_path }}"
+ sudo_user: "{{ paddles_user }}"
+ when: create_db|changed
+
+- name: Copy alembic config template to alembic.ini
+ command: cp ./alembic.ini.in alembic.ini
+ args:
+ creates: alembic.ini
+ chdir: "{{ paddles_repo_path }}"
+ register: alembic_ini
+ sudo_user: "{{ paddles_user }}"
+
+- name: Update alembic.ini
+ lineinfile:
+ dest: "{{ paddles_repo_path }}/alembic.ini"
+ line: "sqlalchemy.url = {{ db_url }}"
+ regexp: "^sqlalchemy.url = "
+
+- name: Set the alembic revision
+ shell: ./virtualenv/bin/alembic stamp head
+ args:
+ chdir: "{{ paddles_repo_path }}"
+ when: alembic_ini|changed
+ sudo_user: "{{ paddles_user }}"
--- /dev/null
+---
+- name: Checkout the repo
+ git:
+ repo: "{{ paddles_repo }}"
+ dest: "{{ paddles_repo_path }}"
+ sudo_user: "{{ paddles_user }}"
+ tags:
+ - repos
+
+- name: Install requirements via pip
+ pip:
+ chdir: "{{ paddles_repo_path }}"
+ requirements: "./requirements.txt"
+ virtualenv: "{{ paddles_repo_path }}/virtualenv"
+ sudo_user: "{{ paddles_user }}"
+
+- name: Run setup inside virtualenv
+ command: "./virtualenv/bin/python setup.py develop"
+ args:
+ chdir: "{{ paddles_repo_path }}"
+ changed_when: false
+ sudo_user: "{{ paddles_user }}"
+
+- name: Ship prod.py
+ template:
+ src: prod.py
+ dest: "{{ paddles_repo_path }}/prod.py"
+ owner: "{{ paddles_user }}"
+ group: "{{ paddles_user }}"
+ mode: 0755
--- /dev/null
+---
+- name: Ship supervisor config
+ template:
+ src: supervisor.conf
+ dest: "{{ supervisor_conf_d }}/paddles.{{ supervisor_conf_suffix }}"
+ mode: 0755
+ register: supervisor_conf
+
+- name: Read supervisord config
+ command: supervisorctl update
+ when: supervisor_conf|changed
+
+- name: Ensure paddles is running
+ supervisorctl:
+ name: paddles
+ state: started
+
+- name: Wait for paddles to start
+ wait_for:
+ port: "{{ paddles_port }}"
--- /dev/null
+---
+- name: Create user
+ user:
+ name: "{{ paddles_user }}"
+ state: present
+ shell: /bin/bash
+ tags:
+ - user
--- /dev/null
+---
+- name: Fail on yum systems as support is not implemented
+ fail:
+ msg: "yum systems are not supported at this time"
--- /dev/null
+# {{ ansible_managed }}
+from paddles.hooks import IsolatedTransactionHook
+from paddles import models
+from paddles.hooks.cors import CorsHook
+
+server = {
+ 'port': '{{ paddles_port }}',
+ 'host': '{{ listen_ip }}'
+}
+
+address = '{{ paddles_address }}'
+job_log_href_templ = 'http://{{ log_host }}/teuthology/{run_name}/{job_id}/teuthology.log' # noqa
+default_latest_runs_count = 25
+
+sqlalchemy = {
+ 'url': '{{ db_url }}',
+ 'echo': True,
+ 'echo_pool': True,
+ 'pool_recycle': 3600,
+ 'encoding': 'utf-8'
+}
+
+app = {
+ 'root': 'paddles.controllers.root.RootController',
+ 'modules': ['paddles'],
+ 'template_path': '%(confdir)s/paddles/templates',
+ 'default_renderer': 'json',
+ 'debug': False,
+ 'hooks': [
+ IsolatedTransactionHook(
+ models.start,
+ models.start_read_only,
+ models.commit,
+ models.rollback,
+ models.clear
+ ),
+ CorsHook(),
+ ],
+}
+
+logging = {
+ 'disable_existing_loggers': False,
+ 'loggers': {
+ 'root': {'level': 'INFO', 'handlers': ['console']},
+ 'paddles': {'level': 'DEBUG', 'handlers': ['console']},
+ 'sqlalchemy': {'level': 'WARN'},
+ 'py.warnings': {'handlers': ['console']},
+ '__force_dict__': True
+ },
+ 'handlers': {
+ 'console': {
+ 'level': 'DEBUG',
+ 'class': 'logging.StreamHandler',
+ 'formatter': 'simple'
+ }
+ },
+ 'formatters': {
+ 'simple': {
+ 'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
+ ' %(message)s')
+ }
+ }
+}
--- /dev/null
+# {{ ansible_managed }}
+[program:paddles]
+user={{ paddles_user }}
+environment=HOME="/home/{{ paddles_user }}",USER="{{ paddles_user }}"
+directory=/home/{{ paddles_user }}/paddles
+command=/home/{{ paddles_user }}/paddles/virtualenv/bin/gunicorn_pecan -c gunicorn_config.py prod.py
+autostart=true
+autorestart=true
+redirect_stderr=true
+stdout_logfile = /home/{{ paddles_user }}/paddles.out.log
+stderr_logfile = /home/{{ paddles_user }}/paddles.err.log
--- /dev/null
+---
+paddles_extra_packages:
+ # The following is a requirement of ansible's postgresql module
+ - python-psycopg2
+ # The following packages are requirements for running paddles
+ - git-all
+ - python-dev
+ - python-pip
+ - python-virtualenv
+ - postgresql
+ - postgresql-contrib
+ - postgresql-server-dev-all
+ - supervisor
+
+supervisor_conf_d: /etc/supervisor/conf.d
+supervisor_conf_suffix: conf