[GSoC] Take migration in Salt virt module to the next level
Cedric Bosdonnat
CBosdonnat at suse.com
Tue Sep 1 06:58:06 UTC 2020
Hey Radostin,
Thanks again for all the work you did on the Salt virt migration to
make it cleaner and better tested!
--
Cédric
On Sat, 2020-08-29 at 10:06 +0100, Radostin Stoyanov wrote:
> Hello again libvirt community!
>
> This summer, I once again worked on a GSoC project with libvirt. This
> time, the goal of my project was to improve the libvirt integration with
> SaltStack and, in particular, the support for VM migration.
>
> SaltStack is an incredibly valuable tool that helps with automation and
> infrastructure management. This is accomplished with master/minion
> topology where a master acts as a central control bus for the clients
> (minions), and the minions connect back to the master. The Salt virt
> module provides support for core cloud operations such as VM lifecycle
> management, including VM migration, by allowing minions to connect with
> libvirt virtualization host.
>
> The Salt virt.migrate interface allows users to migrate a VM from one
> host to another. However, the implementation of this function used to be
> based on the virsh command-line tool (instead of the libvirt Python API
> bindings), which had resulted in an increased code complexity (e.g.,
> string concatenation, invoking Popen.subprocess, etc) and had a limited
> number of migration options exposed to users.
>
> My project was roughly separated into three phases. The aim of the first
> phase was to improve the test coverage of the virt module by increasing
> the number of integration tests (i.e., before applying any major code
> changes). However, SaltStack is designed to run on different platforms,
> and it has been extended over the years to support many applications and
> tools. Consequently, the SaltStack test suite has grown in complexity
> and number of dependencies as well. As a result, not all of them (e.g.,
> libvirt and qemu) are available in the Jenkins CI environment. In
> addition, our goal was to only be able to effectively test VM lifecycle
> management features (start, destroy, list, etc.) but also to test VM
> migration. To achieve this we packaged libvirt, qemu, and all required
> SaltStack minion dependencies in a container image that allows us to
> spawn multiple virtualization host instances on a single machine (with
> low virtualization overhead).
>
> In the second phase of the project, now with a test environment in
> place, we were able to refactor the virt.migrate implementation to
> utilize the Python bindings of libvirt and add support for additional
> migration options (described in the “What's new?” section below).
>
> The third phase was primarily focused on refining the set patches,
> resolving merge conflicts with upstream changes or other related PRs.
> One of the major challenges was to revisit the set of tests to make them
> compatible with pytest as well to collaborate with the SaltStack
> community to ensure that all proposed changes will be easy to maintain
> in the future.
>
>
> Contributions
> ============
> Although the development work was done in several iterations, with code
> reviews on regular basis, the final result was consolidated in a single
> GitHub pull request: https://github.com/saltstack/salt/pull/57947
>
>
> What’s new?
> ===========
>
> https://docs.saltstack.com/en/master/ref/modules/all/salt.modules.virt.html#salt.modules.virt.migrate
>
> The virt.migrate interface of SaltStack has been extended to support
> target URI format:
> $ salt src virt.migrate guest qemu+ssh://dst/system
> $ salt src virt.migrate guest qemu+tcp://dst/system
> $ salt src virt.migrate guest qemu+tls://dst/system
>
> with preserved backward compatibility:
> $ salt src virt.migrate guest dst
> $ salt src virt.migrate guest dst True
>
> Support for the following migration options was introduced:
>
> Disable live migration
> $ salt src virt.migrate guest qemu+ssh://dst/system live=False
>
> Leave the migrated VM transient on destination host
> $ salt src virt.migrate guest qemu+ssh://dst/system persistent=False
>
> Leave the domain defined on the source host
> $ salt src virt.migrate guest qemu+ssh://dst/system undefinesource=False
>
> Offline migration
> $ salt src virt.migrate guest qemu+ssh://dst/system offline=False
>
> Set maximum bandwidth (in MiB/s)
> $ salt src virt.migrate guest qemu+tls://dst/system max_bandwidth=10
>
> Set maximum tolerable downtime for live-migration (i.e. a number of
> milliseconds the VM is allowed to be down at the end of live migration)
> $ salt src virt.migrate guest qemu+tls://dst/system max_downtime=100
>
> Set a number of parallel network connections for live migration
> $ salt src virt.migrate guest qemu+tls://dst/system parallel_connections=10
>
> Live migration with enabled compression
> $ salt src virt.migrate guest qemu+tls://dst/system \
> compressed=True \
> comp_methods=mt \
> comp_mt_level=5 \
> comp_mt_threads=4 \
> comp_mt_dthreads=4
>
> $ salt src virt.migrate guest qemu+tls://dst/system \
> compressed=True \
> comp_methods=xbzrle \
> comp_xbzrle_cache=1024
>
> Migrate non-shared storage
> (Full disk copy)
> $ salt src virt.migrate guest qemu+tls://dst/system copy_storage=all
>
> (Incremental copy)
> $ salt src virt.migrate guest qemu+tls://dst/system copy_storage=inc
>
> Using post-copy migration
> $ salt src virt.migrate guest qemu+tls://dst/system postcopy=True
> $ salt src virt.migrate_start_postcopy guest
>
> Using post-copy migration with bandwidth limit (MiB/s)
> $ salt src virt.migrate guest qemu+tls://dst/system \
> postcopy=True \
> postcopy_bandwidth=1
> $ salt src virt.migrate_start_postcopy guest
>
>
> Acknowledgments
> ===============
> I would like to sincerely thank all those who provided me with their
> time, assistance, and guidance during the course of this project, for
> which I am enormously grateful.
>
> I would like to thank Cedric Bosdonnat (cbosdo), Pedro Algarvio
> (s0undt3ch), Wayne Werner (waynew), Charles McMarrow (cmcmarrow) and
> Daniel Wozniak (dwoz) who offered a huge amount of support, expertise,
> guidance and code reviews.
>
> I would also like to thank Michal Privoznik (mprivozn), Martin
> Kletzander (mkletzan) and the rest of the libvirt and SaltStack
> communities who have been extremely supportive.
>
>
> Best wishes,
> Radostin
>
More information about the libvir-list
mailing list