# Issue: Add Performance Optimizations **Status**: Open **Priority**: Medium **Component**: proxmox/tasks **Assignee**: Junior Dev ## Description The Proxmox role could benefit from performance optimizations, particularly for image downloads and repeated operations. ## Current Performance Issues - Sequential image downloads (no parallelization) - No caching of repeated operations - No async operations for long-running tasks - Inefficient fact gathering ## Required Changes ### Step 1: Add parallel downloads Use async for image downloads to run concurrently. ### Step 2: Implement caching Add fact caching for repeated operations. ### Step 3: Add conditional execution Skip tasks when results are already present. ## Implementation Steps ### Example 1: Parallel Image Downloads ```yaml - name: Download Cloud Init Isos in parallel ansible.builtin.include_tasks: 42_download_isos.yaml loop: "{{ proxmox_cloud_init_images | dict | map(attribute='value') }}" loop_control: loop_var: distro async: 3600 # 1 hour timeout poll: 0 register: download_tasks - name: Check download status ansible.builtin.async_status: jid: "{{ item.ansible_job_id }}" register: download_results until: download_results.finished retries: 30 delay: 10 loop: "{{ download_tasks.results }}" loop_control: loop_var: item ``` ### Example 2: Add Fact Caching ```yaml # In ansible.cfg or playbook [defaults] fact_caching = jsonfile fact_caching_connection = /tmp/ansible_facts fact_caching_timeout = 86400 # In tasks - name: Gather facts with caching ansible.builtin.setup: cacheable: yes ``` ### Example 3: Conditional Task Execution ```yaml - name: Check if image already exists ansible.builtin.stat: path: "{{ proxmox_dirs.isos }}/{{ distro.name }}" register: image_stat changed_when: false - name: Download image only if missing ansible.builtin.get_url: url: "{{ distro.url }}" dest: "{{ proxmox_dirs.isos }}/{{ distro.name }}" mode: "0644" when: not image_stat.stat.exists register: download_result - name: Skip conversion if raw image exists ansible.builtin.stat: path: "{{ proxmox_dirs.isos }}/{{ raw_image_name }}" register: raw_image_stat changed_when: false - name: Convert to raw only if needed ansible.builtin.command: cmd: "qemu-img convert -O raw {{ proxmox_dirs.isos }}/{{ distro.name }} {{ proxmox_dirs.isos }}/{{ raw_image_name }}" when: - download_result is changed or not raw_image_stat.stat.exists - image_stat.stat.exists ``` ### Example 4: Batch VM Operations ```yaml - name: Create VMs in batches ansible.builtin.include_tasks: 55_create_vm.yaml loop: "{{ vms | batch(3) | flatten }}" loop_control: loop_var: "vm" throttle: 3 ``` ## Testing Requirements - Measure performance before and after changes - Verify parallel operations don't cause conflicts - Test caching works correctly - Confirm conditional execution skips appropriately ## Acceptance Criteria - [ ] Image downloads run in parallel - [ ] Fact caching implemented and working - [ ] Tasks skip when results already exist - [ ] Performance metrics show improvement - [ ] No race conditions in parallel operations - [ ] Documentation updated with performance notes