diff --git a/src/infrafoundry/providers/proxmox/templates/proxmox/ova_vms.tf.j2 b/src/infrafoundry/providers/proxmox/templates/proxmox/ova_vms.tf.j2 index cb6820e..319a30c 100644 --- a/src/infrafoundry/providers/proxmox/templates/proxmox/ova_vms.tf.j2 +++ b/src/infrafoundry/providers/proxmox/templates/proxmox/ova_vms.tf.j2 @@ -48,11 +48,17 @@ resource "terraform_data" "ova_vm_{{ vm_tf_name }}" { provisioner "local-exec" { command = <<-EOT ${local.ssh_cmd} ${var.proxmox_ssh_user}@{{ ssh_target }} " + set -e cd /tmp/ova-${self.triggers_replace.name} DISK_INDEX=0 for VMDK in \$(ls -1 *.vmdk 2>/dev/null | sort); do - qm disk import ${self.triggers_replace.vmid} \$VMDK {{ vm.config.disk_storage | default('local-lvm') }} --format qcow2 - DISK_PATH=\$(qm config ${self.triggers_replace.vmid} | grep \"^unused0:\" | sed 's/^unused[0-9]*: //') + IMPORT_OUT=\$(qm disk import ${self.triggers_replace.vmid} \$VMDK {{ vm.config.disk_storage | default('local-lvm') }} --format qcow2 2>&1) + echo \"\$IMPORT_OUT\" + DISK_PATH=\$(echo \"\$IMPORT_OUT\" | grep 'successfully imported' | sed \"s/.*'\\(.*\\)'.*/\\1/\") + if [ -z \"\$DISK_PATH\" ]; then + echo \"ERROR: Failed to import disk \$VMDK\" >&2 + exit 1 + fi qm set ${self.triggers_replace.vmid} --${self.triggers_replace.disk_bus}\$${DISK_INDEX} \$DISK_PATH DISK_INDEX=\$((DISK_INDEX + 1)) done diff --git a/tests/unit/providers/proxmox/test_ova_vms.py b/tests/unit/providers/proxmox/test_ova_vms.py index d36a03b..7884071 100644 --- a/tests/unit/providers/proxmox/test_ova_vms.py +++ b/tests/unit/providers/proxmox/test_ova_vms.py @@ -101,19 +101,19 @@ def test_disk_bus_in_attach_command(self, provider): content = _render_ova_vms(provider, vms) assert "${self.triggers_replace.disk_bus}" in content - def test_unused_disk_always_greps_index_zero(self, provider): - """Grep for unused disk should always use unused0, not an incrementing index. + def test_disk_path_parsed_from_import_output(self, provider): + """Disk path should be parsed from qm disk import output, not qm config. - Proxmox renumbers unused disks when one is attached (unused1 becomes - unused0, etc.), so the grep must always look for unused0. + Parsing 'successfully imported' from stdout is reliable for multi-disk + imports, unlike grepping unused0 from qm config which breaks when + multiple disks are imported in sequence. """ vms = [_make_ova_vm()] content = _render_ova_vms(provider, vms) - assert 'grep \\"^unused0:\\"' in content - # Ensure no incrementing unused index pattern exists - assert "unused${DISK_INDEX}" not in content - assert "unused\\${DISK_INDEX}" not in content - assert "unused\\$${DISK_INDEX}" not in content + assert "successfully imported" in content + assert "IMPORT_OUT" in content + # Ensure the old fragile unused0 pattern is not used + assert "unused0" not in content class TestOVADiskStorage: