Enable virtualbox-* builders to preserve .vdi format when chaining templates so disks can be resized in later stages

On our CI system, we’ve used a layered, template-chaining approach to building VMs, wherein we:

  • build base_images from iso with virtualbox-iso
    • currently these are being exported as ovf
  • build more “layers” of base images from the above .ovf using virtualbox-ovf
  • build final customized user images from any of the above .ovf using virtualbox-ovf
    • customization includes expanding the virtual disk included in the .ovf

Following this approach it does not initially appear possible to resize the virtual disk in the final virtualbox-ovf build stage because:

  • virtualbox-iso exports as .ovf/.ova, which more or less requires VMware’s .vdmk format
  • vboxmanage modifymedium --resize only supports .vdi/.vhd formats

I see that the virtualbox-iso stepCreateDisk function hard-codes the virtual disk format to VDI. This is good because I think I can now assume that the only reason I’m getting a .vmdk is that I’m exporting to .ovf.

Without exporting from virtualbox-iso/importing into virtualbox-ovf, how can I “chain” packer virtualbox builds, while preserving the vdi file format?

I have gathered minor pieces of this puzzle, such as:

  1. I know I can skip_export but I don’t see how I can import the machine with converting to ovf.
  2. I know I can vboxmanage and vboxmanage-post any commands I want, but finding the right sequence eludes me. I could clone the .vmdk as a .vdi in any build stage, but I don’t understand what builder can accept a .vdi as input. They only seems to support importing ovf, which only seems to support .vdmk. :confused:

This just feels like a lot of work to figure out how to do something quite simple. FWIW I implemented this same idea effortlessly using vsphere-iso/vsphere-clone builders - all I had to do was specify the disk size in the downstream vsphere-clone builder.

Anyone have any ideas or suggestions?

Off the top of my head I think you want to use the keep_registered flag in the virtualbox-iso build and then use the virtualbox-vm builder rather than the virtualbox-ovf builder. You don’t even need to pass in the .vdi file, just reference the name given to the vm in the prior build by setting vm_name.