---
- name: Ensuring config directories exist
  file:
    path: "{{ node_config_directory }}/{{ item.key }}"
    state: "directory"
    owner: "{{ config_owner_user }}"
    group: "{{ config_owner_group }}"
    mode: "0770"
  become: true
  when:
    - inventory_hostname in groups[item.value.group]
    - item.value.enabled | bool
  with_dict: "{{ keystone_services }}"

- name: Check if policies shall be overwritten
  stat:
    path: "{{ item }}"
  delegate_to: localhost
  run_once: True
  register: keystone_policy
  with_first_found:
    - files: "{{ supported_policy_format_list }}"
      paths:
        - "{{ node_custom_config }}/keystone/"
      skip: true

- name: Set keystone policy file
  set_fact:
    keystone_policy_file: "{{ keystone_policy.results.0.stat.path | basename }}"
    keystone_policy_file_path: "{{ keystone_policy.results.0.stat.path }}"
  when:
    - keystone_policy.results

- name: Check if Keystone domain-specific config is supplied
  stat:
    path: "{{ node_custom_config }}/keystone/domains"
  delegate_to: localhost
  run_once: True
  register: keystone_domain_directory

- include_tasks: copy-certs.yml
  when:
    - kolla_copy_ca_into_containers | bool or keystone_enable_tls_backend | bool

- name: Copying over config.json files for services
  template:
    src: "{{ item.key }}.json.j2"
    dest: "{{ node_config_directory }}/{{ item.key }}/config.json"
    mode: "0660"
  become: true
  with_dict: "{{ keystone_services }}"
  when:
    - inventory_hostname in groups[item.value.group]
    - item.value.enabled | bool
  notify:
    - Restart {{ item.key }} container

- name: Copying over keystone.conf
  vars:
    service_name: "{{ item.key }}"
  merge_configs:
    sources:
      - "{{ role_path }}/templates/keystone.conf.j2"
      - "{{ node_custom_config }}/global.conf"
      - "{{ node_custom_config }}/keystone.conf"
      - "{{ node_custom_config }}/keystone/{{ item.key }}.conf"
      - "{{ node_custom_config }}/keystone/{{ inventory_hostname }}/keystone.conf"
    dest: "{{ node_config_directory }}/{{ item.key }}/keystone.conf"
    mode: "0660"
  become: true
  with_dict: "{{ keystone_services }}"
  when:
    - inventory_hostname in groups[item.value.group]
    - item.key in [ "keystone", "keystone-fernet" ]
    - item.value.enabled | bool
  notify:
    - Restart {{ item.key }} container

- name: Copying keystone-startup script for keystone
  vars:
    keystone: "{{ keystone_services['keystone'] }}"
  template:
    src: "keystone-startup.sh.j2"
    dest: "{{ node_config_directory }}/keystone/keystone-startup.sh"
    mode: "0660"
  become: true
  when:
    - inventory_hostname in groups[keystone.group]
    - keystone.enabled | bool
  notify:
    - Restart keystone container

- name: Create Keystone domain-specific config directory
  vars:
    keystone: "{{ keystone_services.keystone }}"
  file:
    dest: "{{ node_config_directory }}/keystone/domains/"
    state: "directory"
    mode: "0770"
  become: true
  when:
    - inventory_hostname in groups[keystone.group]
    - keystone.enabled | bool
    - keystone_domain_directory.stat.exists

- name: Get file list in custom domains folder
  find:
    path: "{{ node_custom_config }}/keystone/domains"
    recurse: no
    file_type: file
  delegate_to: localhost
  register: keystone_domains
  when: keystone_domain_directory.stat.exists

- name: Copying Keystone Domain specific settings
  vars:
    keystone: "{{ keystone_services.keystone }}"
  template:
    src: "{{ item.path }}"
    dest: "{{ node_config_directory }}/keystone/domains/"
    mode: "0660"
  become: true
  register: keystone_domains
  when:
    - inventory_hostname in groups[keystone.group]
    - keystone.enabled | bool
    - keystone_domain_directory.stat.exists
  with_items: "{{ keystone_domains.files | default([]) }}"
  notify:
    - Restart keystone container

- name: Copying over existing policy file
  template:
    src: "{{ keystone_policy_file_path }}"
    dest: "{{ node_config_directory }}/{{ item.key }}/{{ keystone_policy_file }}"
    mode: "0660"
  become: true
  when:
    - inventory_hostname in groups[item.value.group]
    - item.key in [ "keystone", "keystone-fernet" ]
    - item.value.enabled | bool
    - keystone_policy_file is defined
  with_dict: "{{ keystone_services }}"
  notify:
    - Restart {{ item.key }} container

- include_tasks: config-federation-oidc.yml
  when:
    - keystone_enable_federation_openid | bool

- name: Copying over wsgi-keystone.conf
  vars:
    keystone: "{{ keystone_services.keystone }}"
  template:
    src: "{{ item }}"
    dest: "{{ node_config_directory }}/keystone/wsgi-keystone.conf"
    mode: "0660"
  become: true
  when:
    - inventory_hostname in groups[keystone.group]
    - keystone.enabled | bool
  with_first_found:
    - "{{ node_custom_config }}/keystone/{{ inventory_hostname }}/wsgi-keystone.conf"
    - "{{ node_custom_config }}/keystone/wsgi-keystone.conf"
    - "wsgi-keystone.conf.j2"
  notify:
    - Restart keystone container

- name: Checking whether keystone-paste.ini file exists
  vars:
    keystone: "{{ keystone_services.keystone }}"
  stat:
    path: "{{ node_custom_config }}/keystone/keystone-paste.ini"
  delegate_to: localhost
  run_once: True
  register: check_keystone_paste_ini
  when:
    - keystone.enabled | bool

- name: Copying over keystone-paste.ini
  vars:
    keystone: "{{ keystone_services.keystone }}"
  template:
    src: "{{ node_custom_config }}/keystone/keystone-paste.ini"
    dest: "{{ node_config_directory }}/keystone/keystone-paste.ini"
    mode: "0660"
  become: true
  when:
    - inventory_hostname in groups[keystone.group]
    - keystone.enabled | bool
    - check_keystone_paste_ini.stat.exists
  notify:
    - Restart keystone container

- name: Generate the required cron jobs for the node
  command: >
    {{ ansible_playbook_python }} {{ role_path }}/files/fernet_rotate_cron_generator.py
    -t {{ (fernet_key_rotation_interval | int) // 60 }}
    -i {{ groups['keystone'].index(inventory_hostname) }}
    -n {{ (groups['keystone'] | length) }}
  changed_when: false
  check_mode: false
  register: cron_jobs_json
  connection: local
  delegate_to: localhost

- name: Set fact with the generated cron jobs for building the crontab later
  set_fact:
    cron_jobs: "{{ (cron_jobs_json.stdout | from_json).cron_jobs }}"
  ignore_errors: "{{ ansible_check_mode }}"

- name: Copying files for keystone-fernet
  vars:
    keystone_fernet: "{{ keystone_services['keystone-fernet'] }}"
  template:
    src: "{{ item.src }}"
    dest: "{{ node_config_directory }}/keystone-fernet/{{ item.dest }}"
    mode: "0660"
  become: true
  ignore_errors: "{{ ansible_check_mode }}"
  with_items:
    - { src: "crontab.j2", dest: "crontab" }
    - { src: "fernet-rotate.sh.j2", dest: "fernet-rotate.sh" }
    - { src: "fernet-node-sync.sh.j2", dest: "fernet-node-sync.sh" }
    - { src: "fernet-push.sh.j2", dest: "fernet-push.sh" }
    - { src: "fernet-healthcheck.sh.j2", dest: "fernet-healthcheck.sh" }
    - { src: "id_rsa", dest: "id_rsa" }
    - { src: "ssh_config.j2", dest: "ssh_config" }
  when:
    - inventory_hostname in groups[keystone_fernet.group]
    - keystone_fernet.enabled | bool
  notify:
    - Restart keystone-fernet container

- name: Copying files for keystone-ssh
  vars:
    keystone_ssh: "{{ keystone_services['keystone-ssh'] }}"
  template:
    src: "{{ item.src }}"
    dest: "{{ node_config_directory }}/keystone-ssh/{{ item.dest }}"
    mode: "0660"
  become: true
  with_items:
    - { src: "sshd_config.j2", dest: "sshd_config" }
    - { src: "id_rsa.pub", dest: "id_rsa.pub" }
  when:
    - inventory_hostname in groups[keystone_ssh.group]
    - keystone_ssh.enabled | bool
  notify:
    - Restart keystone-ssh container
