---

### tags:
###   update_config
###   update_deployment

- name: "Setup DNS configuration for <{{ inventory_hostname }}>"
  include_role:
    name: sma_digitalocean
    tasks_from: domain
  vars:
    record_data: "{{ stage_server_ip }}"
    record_name: "{{ item }}"
  loop:
    - "{{ prometheus_id }}"
    - "{{ grafana_id }}"
    - "{{ alertmanager_id }}"

- name: "Check if {{ inventory_hostname }}/docker-compose.yml exists"
  stat:
    path: '{{ service_base_path }}/{{ inventory_hostname }}/docker-compose.yml'
  register: check_docker_compose_file
  tags:
    - update_config
    - update_deployment

- name: "Stop {{ inventory_hostname }}"
  community.docker.docker_compose:
    project_src: '{{ service_base_path }}/{{ inventory_hostname }}'
    state: absent
  when: check_docker_compose_file.stat.exists
  tags:
    - update_deployment

- name: "Deploy docker templates for {{ inventory_hostname }}"
  include_role:
    name: sma_deploy
    tasks_from: templates
  vars:
    current_config: "_docker"
    current_base_path: "{{ service_base_path }}"
    current_destination: "{{ inventory_hostname }}"
    current_owner: "{{ docker_owner }}"
    current_group: "{{ docker_group }}"
    current_docker: "{{ prometheus_docker }}"
  tags:
    - update_deployment

- name: "Deploy service templates for {{ inventory_hostname }}"
  include_role:
    name: sma_deploy
    tasks_from: templates
  vars:
    current_config: "prometheus"
    current_base_path: "{{ service_base_path }}"
    current_destination: "{{ inventory_hostname }}"
    current_owner: "{{ docker_owner }}"
    current_group: "{{ docker_group }}"
  tags:
    - update_config

- name: "Update {{ inventory_hostname }}"
  community.docker.docker_compose:
    project_src: '{{ service_base_path }}/{{ inventory_hostname }}'
    state: present
    pull: yes
  tags:
    - update_deployment

- name: "Wait for <{{ http_s }}://{{ prometheus_id }}.{{ domain }}>"
  uri:
    url: "{{ http_s }}://{{ prometheus_id }}.{{ domain }}"
    method: GET
    status_code: 200
    return_content: yes
  register: prometheus_stats
  until: prometheus_stats.status == 200
  retries: 10
  delay: 60
  tags:
    - update_config

- name: "Reload prometheus configuration"
  uri:
    url: "{{ http_s }}://{{ prometheus_id }}.{{ domain }}/-/reload"
    method: POST
    timeout: 300 # blocks until reload configuration is complete
    status_code: 200
  tags:
    - update_config

- name: "Wait for {{ http_s }}://{{ inventory_hostname }}-grafana.{{ domain }}"
  uri:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}/api/admin/stats"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    force_basic_auth: yes
    method: GET
    status_code: 200
    return_content: yes
  register: grafana_stats
  until: grafana_stats.status == 200
  retries: 10
  delay: 60

- name: Create grafana users
  uri:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}/api/admin/users"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    force_basic_auth: yes
    method: POST
    status_code: 200
    body_format: json
    body: "{\"name\":\"{{ item.name }}\", \"email\":\"{{ item.email }}\", \"login\":\"{{ item.login }}\", \"password\":\"{{ item.password }}\" }"
    headers:
      Content-Type: application/json
  loop:
     - {
      name: "{{ grafana_user_smardigo_login }}",
      login: "{{ grafana_user_smardigo_login }}",
      password: "{{ grafana_user_smardigo_password }}",
      email: "smardigo@netgo.de"
     }
  when: grafana_stats.json.users == 1
