---
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

- name: Create/Setup known indexes in Elasticsearch
  hosts: "elastic-logstash[0]"
  become: true

  vars:
    elastic_refresh_interval: "{{ (elasticsearch_number_of_replicas | int) * 5 }}"

  vars_files:
    - vars/variables.yml

  environment: "{{ deployment_environment_variables | default({}) }}"

  roles:
    - role: elastic_retention

  post_tasks:
    - name: Create basic indexes
      uri:
        url: http://127.0.0.1:9200/{{ item.name }}
        method: PUT
        body: "{{ item.index_options | to_json }}"
        status_code: 200,400
        body_format: json
      register: elk_indexes
      until: elk_indexes is success
      retries: 3
      delay: 10
      with_items:
        - name: "osprofiler-notifications"
          index_options:
            settings:
              index:
                codec: "best_compression"
                mapping:
                  total_fields:
                    limit: "10000"
                refresh_interval: "5s"
        - name: "_all/_settings?preserve_existing=true"
          index_options:
            index.queries.cache.enabled: "true"
            indices.queries.cache.size: "5%"
        - name: "_all/_settings"
          index_options:
            index.number_of_replicas: "{{ elasticsearch_number_of_replicas | int }}"
            index.translog.durability: "async"
            index.refresh_interval: "{{ ((elastic_refresh_interval | int) > 30) | ternary(30, elastic_refresh_interval) }}s"

    - name: Check for basic index template
      uri:
        url: http://127.0.0.1:9200/_template/basic-index-template
        method: HEAD
      failed_when: false
      register: check_basicIndexTemplate
      register: check_basicIndexTemplate
      until: check_basicIndexTemplate is success
      retries: 3
      delay: 10

    - name: Check for basic index template
      uri:
        url: http://127.0.0.1:9200/_template/basic-index-template
        method: DELETE
        status_code: 200
      register: delete_basicIndexTemplate
      until: delete_basicIndexTemplate is success
      retries: 3
      delay: 10
      when:
        - check_basicIndexTemplate.status == 200

    - name: Create basic index template
      uri:
        url: http://127.0.0.1:9200/_template/basic-index-template
        method: PUT
        body: "{{ index_option | to_json }}"
        status_code: 200
        body_format: json
      register: create_basicIndexTemplate
      until: create_basicIndexTemplate is success
      retries: 3
      delay: 10
      vars:
        index_option:
          index_patterns: >-
            {{
              (elastic_beat_retention_policy_hosts.keys() | list)
                | map('regex_replace', '(.*)', '\1-' ~ '*')
                | list
            }}
          settings:
            number_of_replicas: "{{ elasticsearch_number_of_replicas | int }}"
            index:
              mapping:
                total_fields:
                  limit: "3072"

    - name: Create custom monitoring index template
      uri:
        url: http://127.0.0.1:9200/_template/custom_monitoring
        method: PUT
        body: "{{ index_option | to_json }}"
        status_code: 200
        body_format: json
      register: create_basicIndexTemplate
      until: create_basicIndexTemplate is success
      retries: 3
      delay: 10
      vars:
        index_option:
          template: ".monitoring-*"
          order: 1
          settings:
            number_of_replicas: "{{ elasticsearch_number_of_replicas | int }}"
            number_of_shards: "{{ ((elasticsearch_number_of_replicas | int) * 2) + 1 }}"