- hosts:
    - master[0]
  name: get noded label
  tasks:
    - name: cleanup previous label cache
      shell: "rm -rf /root/.ascend_deployer/dl_yaml/label/groups/"

    - name: get pods info
      command: kubectl get pod -Ao wide
      register: pods_info
      until: pods_info.rc == 0
      retries: 5
      delay: 5
      ignore_errors: yes
      changed_when: false

    - name: get noded info
      set_fact:
        noded_label: "{{ 'on' if (pods_info.stdout.splitlines() | select('search', '^\\S+\\s+.*noded.*$') |
                      list | length > 0) else '' }}"

- hosts:
    - worker
  name: label node in k8s
  tasks:
    - name: set noded label
      set_fact:
        noded_label: "{{ hostvars[groups['master'][0]].noded_label | default('')}}"

    - name: get label
      label_node:
        step: 'get_label'
        ansible_run_tags: "{{ ansible_run_tags }}"
        node_name: "{{ NODE_NAME }}"
        master_node: "{{ inventory_hostname in groups['master'] }}"
        worker_node: "{{ inventory_hostname in groups['worker'] }}"
        noded_label: "{{ noded_label | default('') }}"

    - name: save node label to yaml
      run_once: yes
      label_node:
        step: 'save_label'
        nodes_label: "{{ (groups['master'] | map('extract', hostvars, 'node_label') | map('default', {}) | list) |
                combine((groups['worker'] | map('extract', hostvars, 'node_label') | map('default', {}) | list),
                recursive=True) }}"
      delegate_to: "{{ groups['worker'][0] }}"

# ===== Play 1:在 Worker 复制文件 =====
- hosts: worker[0]
  name: copy label yaml from worker[0] to controller
  gather_facts: no
  tasks:
    - name: copy label yaml from worker[0] to controller
      scp:
        ip: "{{ inventory_hostname }}"
        port: "{{ hostvars[inventory_hostname].ansible_ssh_port | default('22') }}"
        remote_user: "{{ ansible_ssh_user }}"
        passwd: "{{ ansible_ssh_pass | default(omit) }}"
        src: "/root/.ascend_deployer/dl_yaml/label/label_node.json"
        dest: "/tmp/ascend_label_cache/{{ inventory_hostname }}/"
        fetch: 'true'
      delegate_to: localhost

# ===== Play 2:在 Master 上创建目录并=====
- hosts: master[0]
  name: create directory and fetch label json on master
  gather_facts: no
  vars:
    worker_ip: "{{ groups['worker'][0] }}"
  tasks:
    - name: create group directory on master
      file:
        path: "/root/.ascend_deployer/dl_yaml/label/groups/{{ worker_ip }}"
        state: directory
        mode: '0644'

# ===== Play 3:在 localhost 上复制到 Master =====
- hosts: localhost
  connection: local
  name: copy label yaml from controller to master[0]
  gather_facts: no
  vars:
    worker_ip: "{{ groups['worker'][0] }}"
    master_ip: "{{ groups['master'][0] }}"
  tasks:
    - name: copy label yaml from controller to master[0]
      scp:
        ip: "{{ master_ip }}"
        port: "{{ hostvars[master_ip].ansible_ssh_port | default('22') }}"
        remote_user: "{{ hostvars[master_ip].ansible_ssh_user | default('root') }}"
        passwd: "{{ hostvars[master_ip].ansible_ssh_pass | default(omit) }}"
        src: "/tmp/ascend_label_cache/{{ worker_ip }}/label_node.json"
        dest: "/root/.ascend_deployer/dl_yaml/label/groups/{{ worker_ip }}/label_node.json"
        fetch: 'false'
    
    - name: remove ascend_label_cache directory
      file:
        path: "/tmp/ascend_label_cache"
        state: absent

# ===== Play 4:在 worker[0] 上执行等待和标签操作 =====
- hosts: worker[0]
  name: wait and label worker nodes
  tasks:
    - name: Wait for all group directories to be ready
      shell: |
        count=$(ls -d /root/.ascend_deployer/dl_yaml/label/groups/*/ 2>/dev/null | wc -l)
        echo "Current group count: $count, Expected: {{ sub_group_count | default(1) | int }}"
        [ $count -ge {{ sub_group_count | default(1) | int }} ] && exit 0 || exit 1
      register: wait_result
      until: wait_result.rc == 0
      retries: 60
      delay: 10
      delegate_to: "{{ groups['master'][0] }}"
      when: sub_group_idx | default(1) | int == 1

    - name: label worker nodes
      label_node:
        step: 'label'
        group_count: "{{ sub_group_count | default(1) | int }}"
      delegate_to: "{{ groups['master'][0] }}"
      register: label_result
      when: sub_group_idx | default(1) | int == 1

- hosts:
    - master
  name: label master nodes
  tasks:
    - name: label master nodes
      command: kubectl label --overwrite node {{ NODE_NAME }} masterselector=dls-master-node
      delegate_to: "{{ groups['master'][0] }}"
      register: label_result
      when: sub_group_idx | default(1) | int == 1