---
# It is recommended that this role be played with serial set to 1 because
# There is a bug with initializing multiple nodes in the HA cluster at once
# http://rabbitmq.1065348.n5.nabble.com/Rabbitmq-boot-failure-with-quot-tables-not-present-quot-td24494.html

- name: trust rabbit repository
  apt_key: url={{ rabbitmq_apt_key }} state=present

- name: install python-software-properties if debian
  apt: pkg={{ ",".join(rabbitmq_debian_pkgs) }} state=present

- name: add rabbit repository
  apt_repository_1.8: repo="{{ rabbitmq_repository }}" state=present update_cache=yes validate_certs=no

- name: fetch the rabbitmq server deb
  get_url: >
    url={{ rabbitmq_pkg_url }}
    dest=/var/tmp/{{ rabbitmq_pkg_url|basename }}

- name: check if rabbit is installed
  shell: >
    dpkg -s rabbitmq-server >/dev/null 2>&1 || echo "not installed"
  register: is_installed

- name: install rabbit package using gdebi
  shell: >
    gdebi --n {{ rabbitmq_pkg_url|basename }}
    chdir=/var/tmp
  when: is_installed.stdout is defined and is_installed.stdout == "not installed"

- name: stop rabbit cluster
  service: name=rabbitmq-server state=stopped

# in case there are lingering processes, ignore errors
# silently
- name: send sigterm to any running rabbitmq processes
  shell: pkill -u rabbitmq || true

# Create the rabbitmq directories
- name: create rabbitmq edx directories
  file:
    path={{ item }}
    owner={{ rabbitmq_user }}
    mode=0755
    state=directory
  with_items:
    - "{{ rabbitmq_app_dir }}"
    - "{{ rabbitmq_log_dir }}"

- name: add queue monitoring script
  template:
    src="edx/app/rabbitmq/log-rabbitmq-queues.sh.j2"
    dest="{{ rabbitmq_app_dir }}/log-rabbitmq-queues.sh"
    owner="{{ rabbitmq_user }}"
    group="{{ rabbitmq_group }}"
    mode=0755

- name: set up a cron job to run the script
  cron:
    name: "log-queue-lenghts"
    job: "{{ rabbitmq_app_dir }}/log-rabbitmq-queues.sh >/dev/null 2>&1"

# Defaulting to /var/lib/rabbitmq
- name: create cookie directory
  file: >
    path={{ rabbitmq_cookie_dir }}
    owner=rabbitmq group=rabbitmq mode=0755 state=directory

- name: add rabbitmq erlang cookie
  template: >
    src=erlang.cookie.j2 dest={{ rabbitmq_cookie_location }}
    owner=rabbitmq group=rabbitmq mode=0400
  register: erlang_cookie

# Defaulting to /etc/rabbitmq
- name: create rabbitmq config directory
  file: >
    path={{ rabbitmq_config_dir }}
    owner=root group=root mode=0755 state=directory

- name: add rabbitmq environment configuration
  template: >
    src=rabbitmq-env.conf.j2 dest={{ rabbitmq_config_dir }}/rabbitmq-env.conf
    owner=root group=root mode=0644

- name: add rabbitmq cluster configuration
  template: >
    src=etc/rabbitmq/rabbitmq.config.j2
    dest={{ rabbitmq_config_dir }}/rabbitmq.config
    owner=root group=root mode=0644
  register: cluster_configuration

- name: install plugins
  rabbitmq_plugin:
    names={{",".join(rabbitmq_plugins)}} state=enabled

# When rabbitmq starts up it creates a folder of metadata at '/var/lib/rabbitmq/mnesia'.
# This folder should be deleted before clustering is setup because it retains data
# that can conflict with the clustering information.
- name: remove mnesia configuration
  file: path={{ rabbitmq_mnesia_folder }} state=absent
  when: erlang_cookie.changed or cluster_configuration.changed or rabbitmq_refresh

- name: start rabbit nodes
  service: name=rabbitmq-server state=restarted

- name: wait for rabbit to start
  wait_for: port={{ rabbitmq_management_port }} delay=2

- name: remove guest user
  rabbitmq_user: user="guest" state=absent

- name: add vhosts
  rabbitmq_vhost: name={{ item }} state=present
  with_items: RABBITMQ_VHOSTS
  tags:
    - vhosts
    - maintenance

- name: add admin users
  rabbitmq_user: >
    user='{{item[0].name}}' password='{{item[0].password}}'
    read_priv='.*' write_priv='.*'
    configure_priv='.*' tags="administrator" state=present
    vhost={{ item[1] }}
  with_nested:
    - "{{rabbitmq_auth_config.admins}}"
    - RABBITMQ_VHOSTS
  when: "'admins' in rabbitmq_auth_config"
  tags:
    - users
    - maintenance

- name: make queues mirrored
  shell: "/usr/sbin/rabbitmqctl set_policy HA '^(?!amq\\.).*' '{\"ha-mode\": \"all\"}'"
  when: RABBITMQ_CLUSTERED or rabbitmq_clustered_hosts|length > 1
  tags:
    - ha
    - maintenance

#
# Depends upon the management plugin
#
- name: install admin tools
  get_url: >
    url=http://localhost:{{ rabbitmq_management_port }}/cli/rabbitmqadmin
    dest=/usr/local/bin/rabbitmqadmin

- name: ensure rabbitmqadmin attributes
  file: >
    path=/usr/local/bin/rabbitmqadmin owner=root
    group=root mode=0655