Thanks for explaining how this was going to work on IRC. Stepping back I think the problem is we're shoehorning features into a tool (virt-v2v) which was designed to do cold conversions, and was never meant to do either warm or in-place conversions. The tool was hacked a while back for in-place but that mode is very awkward to use and we have never enabled it in RHEL for good reason. What would a tool which reused virt-v2v code and did what we really want look like? The basic flow of objects in existing v2v/v2v.ml is: * let input, output = parse_cmdline () The -i and -o options from the command line are parsed, and "input" and "output" objects constructed. * let source = open_source input The input metadata is read (eg. libvirt XML, VMware VMX) and an internal "source" object is created which models this metadata, plus (almost as a side-effect) links to the disks. In the following discussion remember that "source" == "metadata". * let overlays = create_overlays source.s_disks in let g = Guestfs.guestfs () in populate_overlays g overlays The overlays are created and added as disks to a guestfs handle * let inspect = Inspect_source.inspect_source g in let guestcaps = do_convert g inspect output in This does inspection + conversion. (The real do_convert function takes the source struct as parameter, but it is not really used.) * let targets = output#prepare_targets overlays in copy_targets targets input output This creates the target disks and copies them. (The real output#prepare_targets method takes the source struct as a parameter, but the actual objects only use the source.s_name and .s_hypervisor fields). * output#create_metadata source targets guestcaps inspect This creates the target metadata. What you want -- copy done elsewhere, convert in place, create metadata -- is a very different flow. It could look something like this: * let overlays = create_overlays source.s_disks in let g = Guestfs.guestfs () in populate_overlays g overlays let inspect = Inspect_source.inspect_source g in let guestcaps = do_convert g inspect output in let targets = output#prepare_targets overlays in for each overlay: qemu-img commit it output#create_metadata source targets guestcaps inspect We need the source (ie. metadata) struct in the last step in order to create the metadata, so that still needs to be read from somewhere, and maybe -i libvirtxml is as good a place as any. I was going to come to a proper conclusion here, but I'm not yet sure what it is at the moment. I'll think about this a bit more. If you have any comments I'd like to hear them. However there are some action items: (1) do_convert does not need the source parameter. I think it could just be passed the .s_name field instead. (2) output#prepare_targets doesn't really need the source struct, but could probably get away with being passed just the .s_name field and maybe .s_hypervisor. (3) source.s_disks and the rest of the source struct seem to have sufficiently different usage that we can consider separating them. These changes would reduce coupling between stages. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html