]> git.apps.os.sepia.ceph.com Git - ceph-cm-ansible.git/commitdiff
paddles: Add new paddles role
authorZack Cerza <zack@redhat.com>
Wed, 30 Sep 2015 22:38:49 +0000 (16:38 -0600)
committerZack Cerza <zack@redhat.com>
Thu, 1 Oct 2015 22:40:23 +0000 (16:40 -0600)
Signed-off-by: Zack Cerza <zack@redhat.com>
16 files changed:
cephlab.yml
paddles.yml [new file with mode: 0644]
roles/paddles/README.rst [new file with mode: 0644]
roles/paddles/defaults/main.yml [new file with mode: 0644]
roles/paddles/meta/main.yml [new file with mode: 0644]
roles/paddles/tasks/apt_systems.yml [new file with mode: 0644]
roles/paddles/tasks/main.yml [new file with mode: 0644]
roles/paddles/tasks/setup_db.yml [new file with mode: 0644]
roles/paddles/tasks/setup_paddles.yml [new file with mode: 0644]
roles/paddles/tasks/setup_service.yml [new file with mode: 0644]
roles/paddles/tasks/setup_user.yml [new file with mode: 0644]
roles/paddles/tasks/yum_systems.yml [new file with mode: 0644]
roles/paddles/templates/prod.py [new file with mode: 0644]
roles/paddles/templates/supervisor.conf [new file with mode: 0644]
roles/paddles/vars/apt_systems.yml [new file with mode: 0644]
roles/paddles/vars/yum_systems.yml [new file with mode: 0644]

index 5ade9ed0815587a4b9b3abc51b4bcd49741ae5ae..5b6f0551a55336adebfa266c196471766536c8ce 100644 (file)
@@ -13,5 +13,8 @@
 # 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
diff --git a/paddles.yml b/paddles.yml
new file mode 100644 (file)
index 0000000..17e91ea
--- /dev/null
@@ -0,0 +1,5 @@
+---
+- hosts: paddles
+  roles:
+    - common
+    - paddles
diff --git a/roles/paddles/README.rst b/roles/paddles/README.rst
new file mode 100644 (file)
index 0000000..bba6403
--- /dev/null
@@ -0,0 +1,9 @@
+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
diff --git a/roles/paddles/defaults/main.yml b/roles/paddles/defaults/main.yml
new file mode 100644 (file)
index 0000000..db99d13
--- /dev/null
@@ -0,0 +1,10 @@
+---
+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
diff --git a/roles/paddles/meta/main.yml b/roles/paddles/meta/main.yml
new file mode 100644 (file)
index 0000000..1e71b66
--- /dev/null
@@ -0,0 +1,5 @@
+---
+dependencies:
+  - role: secrets
+  - role: sudo
+  - role: users
diff --git a/roles/paddles/tasks/apt_systems.yml b/roles/paddles/tasks/apt_systems.yml
new file mode 100644 (file)
index 0000000..19e0f06
--- /dev/null
@@ -0,0 +1,15 @@
+---
+- 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
diff --git a/roles/paddles/tasks/main.yml b/roles/paddles/tasks/main.yml
new file mode 100644 (file)
index 0000000..c5be705
--- /dev/null
@@ -0,0 +1,37 @@
+---
+- 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
diff --git a/roles/paddles/tasks/setup_db.yml b/roles/paddles/tasks/setup_db.yml
new file mode 100644 (file)
index 0000000..37b31fe
--- /dev/null
@@ -0,0 +1,42 @@
+---
+- 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 }}"
diff --git a/roles/paddles/tasks/setup_paddles.yml b/roles/paddles/tasks/setup_paddles.yml
new file mode 100644 (file)
index 0000000..6b4bfa9
--- /dev/null
@@ -0,0 +1,30 @@
+---
+- 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
diff --git a/roles/paddles/tasks/setup_service.yml b/roles/paddles/tasks/setup_service.yml
new file mode 100644 (file)
index 0000000..5d10c59
--- /dev/null
@@ -0,0 +1,20 @@
+---
+- 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 }}"
diff --git a/roles/paddles/tasks/setup_user.yml b/roles/paddles/tasks/setup_user.yml
new file mode 100644 (file)
index 0000000..58811fd
--- /dev/null
@@ -0,0 +1,8 @@
+---
+- name: Create user
+  user:
+    name: "{{ paddles_user }}"
+    state: present
+    shell: /bin/bash
+  tags:
+    - user
diff --git a/roles/paddles/tasks/yum_systems.yml b/roles/paddles/tasks/yum_systems.yml
new file mode 100644 (file)
index 0000000..3d78686
--- /dev/null
@@ -0,0 +1,4 @@
+---
+- name: Fail on yum systems as support is not implemented
+  fail:
+    msg: "yum systems are not supported at this time"
diff --git a/roles/paddles/templates/prod.py b/roles/paddles/templates/prod.py
new file mode 100644 (file)
index 0000000..98ed567
--- /dev/null
@@ -0,0 +1,63 @@
+# {{ 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')
+        }
+    }
+}
diff --git a/roles/paddles/templates/supervisor.conf b/roles/paddles/templates/supervisor.conf
new file mode 100644 (file)
index 0000000..a1fb596
--- /dev/null
@@ -0,0 +1,11 @@
+# {{ 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
diff --git a/roles/paddles/vars/apt_systems.yml b/roles/paddles/vars/apt_systems.yml
new file mode 100644 (file)
index 0000000..c5a7fd4
--- /dev/null
@@ -0,0 +1,16 @@
+---
+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
diff --git a/roles/paddles/vars/yum_systems.yml b/roles/paddles/vars/yum_systems.yml
new file mode 100644 (file)
index 0000000..ed97d53
--- /dev/null
@@ -0,0 +1 @@
+---