---
### tags:
###   update_config
###   update_deployment
###   update-metrics
###   grafana-user-update

- name: "Create/Resize LVM for datadir"
  include_role:
    name: lvm_with_hetzner_volumes
  vars:
    lvm_with_hetzner_volumes__volprefix: prometheus_datadir
    lvm_with_hetzner_volumes__volsize: "{{ prometheus_lvm_hcloudvol_size }}"
    lvm_with_hetzner_volumes__volcount: "{{ prometheus_lvm_hcloudvol_count }}"
    lvm_with_hetzner_volumes__mountpath: "{{ prometheus_lvm_hcloudvol_mountpath }}"

- name: "Setup DNS configuration for <{{ inventory_hostname }}>"
  include_role:
    name: hetzner-ansible-dns
  vars:
    record_data: "{{ stage_server_ip }}"
    record_name: "{{ item }}"
  loop: "{{ prometheus_service_names | reject('match', '^$') | list }}"

- 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: hetzner-ansible-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: "Updating prometheus configuration"
  include_tasks: _update_config.yml
  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: "Reload prometheus configuration"
  include_tasks: _reload_config.yml
  tags:
    - update_config

- name: Create or update Grafana users
  community.grafana.grafana_user:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    name: "{{ item.name }}"
    email: "{{ item.email }}"
    login: "{{ item.login }}"
    password: "{{ item.password }}"
    is_admin: false
    state: present
  loop: "{{ grafana_users }}"
  tags:
    - grafana-user-update
  when:
    - prometheus_grafana_enabled

- name: "Get all Dashboard uids from {{ http_s }}://{{ inventory_hostname }}-grafana.{{ domain }}"
  uri:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}/api/search"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    force_basic_auth: yes
    method: GET
    status_code: 200
    return_content: yes
  register: grafana_dashboards_plain
  until: grafana_dashboards_plain.status == 200
  retries: 10
  delay: 60
  tags:
    - grafana-user-update
  when:
    - prometheus_grafana_enabled

- name: "Get all existing Dashboard uids"
  set_fact:
    grafana_dashboards: "{{ grafana_dashboards_plain.json | json_query('[].{uid: uid, type: type, title: title}') if prometheus_grafana_enabled else [] }}"
  tags:
    - grafana-user-update

- name: "Printing Grafana Dashboards"
  debug:
    msg: "{{ grafana_dashboards }}"
  tags:
    - grafana-user-update
  when:
    - debug
    - prometheus_grafana_enabled

- name: Restrict admin dashboard permissions
  uri:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}/api/dashboards/uid/{{ item.uid }}/permissions"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    force_basic_auth: yes
    method: POST
    headers:
      Content-Type: application/json
    body_format: json
    body:
      items:
        - role: Admin
          permission: 4
    return_content: yes
  loop: "{{ grafana_dashboards }}"
  when:
    - item.type == 'dash-db'
    - item.uid not in grafana_dashboard_whitelist
    - prometheus_grafana_enabled
  tags:
    - grafana-user-update

- name: Allow viewer dashboard permissions
  uri:
    url: "{{ http_s }}://{{ grafana_id }}.{{ domain }}/api/dashboards/uid/{{ item.uid }}/permissions"
    url_username: "{{ grafana_admin_username }}"
    url_password: "{{ grafana_admin_password }}"
    force_basic_auth: yes
    method: POST
    headers:
      Content-Type: application/json
    body_format: json
    body:
      items:
        - role: Viewer
          permission: 1
    return_content: yes
  loop: "{{ grafana_dashboards }}"
  when:
    - item.type == 'dash-db'
    - item.uid in grafana_dashboard_whitelist
    - prometheus_grafana_enabled
  tags:
    - grafana-user-update

- name: "Create digitalocean api metric script from template"
  template:
    src: digitalocean_api.sh.j2
    dest: /root/digitalocean_api.sh
    mode: 0700
    owner: root
    group: root
  tags:
    - update-metrics

- name: "Create cronjob to exec digitalocean api metric script"
  ansible.builtin.cron:
    name: "update replication table"
    minute: "*"
    job: /root/digitalocean_api.sh
  tags:
    - update-metrics

- name: "Create cronjob to exec digitalocean api metric script"
  ansible.builtin.cron:
    name: "update digitalocean metrics"
    minute: "*"
    job: /root/digitalocean_api.sh
  tags:
    - update-metrics

- name: "Create hetzner api metric script from template"
  template:
    src: hetzner_api.py.j2
    dest: /root/hetzner_api.py
    mode: 0700
    owner: root
    group: root
  tags:
    - update-metrics

- name: "Create cronjob to exec hetzner api metric script"
  ansible.builtin.cron:
    name: "update hetzner metrics"
    minute: "*"
    job: /root/hetzner_api.py
  tags:
    - update-metrics
