02_manager_ops.ymlΒΆ

---
- name: "πŸ”Ž Check if host-specific config.yaml exists in {{ DASHBOARD_CONFIG_INV_PATH }}"
  stat:
    path: "{{ DASHBOARD_CONFIG_INV_PATH }}"
  delegate_to: localhost
  become: false
  register: config_file

- name: πŸ“„ Load menu categories
  include_vars:
    file: "menu_categories.yml"

- name: 🧩 Load docker cards
  set_fact:
    portfolio_cards: "{{ lookup('docker_cards', 'roles') }}"

- name: πŸ” Probe Simple Icons reachability per card slug (on the stack host)
  uri_probe_batch:
    urls: "{{ DASHBOARD_SIMPLEICONS_PROBE_URLS }}"
    method: HEAD
    status_codes: [200, 404]
    attempts: 3
    delay: 2
    timeout: "{{ lookup('timeout', 10) | int }}"
    validate_certs: false
    follow_redirects: safe
    workers: 16
  register: dashboard_simpleicons_probe
  delegate_to: "{{ STACK_HOST }}"
  run_once: true
  when: DASHBOARD_SIMPLEICONS_ENABLED | bool
  changed_when: false

- name: "πŸ“„ Render one Dashboard config per network"
  include_tasks: _instance_config.yml
  loop: "{{ DASHBOARD_INSTANCES }}"
  loop_control:
    loop_var: dashboard_instance
  vars:
    domain: "{{ DASHBOARD_INSTANCE_DOMAIN }}"

- name: ⏳ Wait for branding assets this deployment serves
  when: DASHBOARD_ASSET_ENABLED | bool
  block:
    - name: 🧩 Load rendered dashboard config before first compose start
      slurp:
        src: "{{ DASHBOARD_CONFIG_YML_DEST }}"
      register: dashboard_rendered_config_raw
      vars:
        domain: "{{ lookup('domain', DASHBOARD_APPLICATION_ID) }}"

    - name: πŸ“Š Collect branding asset URLs served by the shared file service
      set_fact:
        dashboard_branding_asset_urls: >-
          {{
            [
              (
                dashboard_platform_logo_source
                if dashboard_platform_logo_source.startswith(dashboard_asset_url_base)
                else ''
              ),
              (
                dashboard_platform_favicon_source
                if dashboard_platform_favicon_source.startswith(dashboard_asset_url_base)
                else ''
              ),
              (
                dashboard_company_logo_source
                if dashboard_company_logo_source.startswith(dashboard_asset_url_base)
                else ''
              )
            ]
            | select('string')
            | reject('equalto', '')
            | unique
            | list
          }}
      vars:
        dashboard_rendered_config: "{{ dashboard_rendered_config_raw.content | b64decode | from_yaml }}"
        dashboard_asset_url_base: "{{ lookup('config', 'web-svc-asset', 'services.asset.url') }}"
        dashboard_platform_logo_source: "{{ ((dashboard_rendered_config.get('platform') or {}).get('logo') or {}).get('source', '') }}"
        dashboard_platform_favicon_source: "{{ ((dashboard_rendered_config.get('platform') or {}).get('favicon') or {}).get('source', '') }}"
        dashboard_company_logo_source: "{{ ((dashboard_rendered_config.get('company') or {}).get('logo') or {}).get('source', '') }}"
      changed_when: false

    - name: ⏳ Wait for dashboard branding assets before first compose start
      uri_retry:
        url: "{{ item }}"
        status_code: 200
        validate_certs: false
      register: dashboard_branding_asset_http
      retries: 60
      delay: 5
      until: dashboard_branding_asset_http.status == 200
      loop: "{{ dashboard_branding_asset_urls }}"
      loop_control:
        label: "{{ item }}"
      delegate_to: "{{ STACK_HOST }}"
      run_once: true

- name: "🚿 Flush compose handlers"
  meta: flush_handlers

- name: "βœ… Ensure Simple Icons is reachable and refresh dashboard cards"
  when: DASHBOARD_SIMPLEICONS_ENABLED | bool
  block:
    - name: βœ… Ensure shared Simple Icons service is loaded before refresh
      include_tasks: utils/load/app.yml
      vars:
        load_app_id: web-svc-simpleicons

    - name: 🚿 Flush handlers after loading shared Simple Icons service
      meta: flush_handlers

    - name: πŸ”„ Refresh dashboard cards after Simple Icons becomes reachable
      include_tasks: "03_simpleicons_refresh.yml"

- name: ⏳ Wait for every Dashboard instance (so all logos can download during init)
  uri_retry:
    url: "http://{{ DOCKER_REACH_HOST }}:{{ lookup('config', DASHBOARD_APPLICATION_ID, 'services.dashboard.ports.local.' ~ ('http' | labelled(dashboard_instance.label,
      '_'))) }}/"
    status_code: 200
  register: dashboard_http
  retries: 60
  delay: 5
  until: dashboard_http.status == 200
  loop: "{{ DASHBOARD_INSTANCES }}"
  loop_control:
    loop_var: dashboard_instance
    label: "{{ dashboard_instance.network }}"
  delegate_to: "{{ STACK_HOST }}"
  run_once: true