
Daniel Veillard wrote:
On Wed, Jul 11, 2007 at 08:07:48AM -0700, Dan Smith wrote:
AL> The goal is to eliminate the distinction between savevm/migrate since AL> they are really the same thing (savevm just pauses the VM first).
But from a high level, there are (at least) two distinct management operations in my mind: relocation and checkpointing. Relocation implies that a guest leaves the source machine and appears on the destination. Checkpointing implies that the domain doesn't move. If we take these two actions, can we not still provide for all the cases? For example:
/* Migrate explicitly undefines the host */ virDomainMigrate(dom, "host"); /* Xen case */ virDomainMigrate(dom, "tcp://host"); /* qemu case */ virDomainMigrate(dom, "lvm://foo"); /* qemu error case */
This is not sufficient for KVM. The Xen notion of migration is fundamentally broken. The architecture is such that on any arbitrary machine you can just issue a command and with no other information and it can migrate to any other Xen machine. It completely ignores issues like authentication and authorization. For a saner migration implementation, at least the following is needed: 1) a way to tell a destination machine that it can receive a particular migration 2) a way to tell the source machine to migrate to that destination 3) a way to pass credential requests through to the caller of libvirt #1 is not needed for Xen b/c Xen's migration is broken. For KVM, this may be needed to actually make sure a QEMU instance is listening for an incoming migration. This step is not strictly needed for the ssh:// protocol but is strictly needed for the tcp:// protocol. #3 is needed by the ssh:// migration protocol. One can imagine libvirt making wrappers to tunnel Xen migration traffic too in which case both #1 and #3 would also be needed.
/* Checkpoint does not undefine the host */ virDomainCheckpoint(dom, "foo"); /* Xen unimplemented case */ virDomainCheckpoint(dom, "lvm://foo"); /* qemu case */
Is that not sane?
I really would not mix the two at the API level. W.r.t. the virDomainMigrate please recheck what I suggested initially, you really want a pointer to an existing connection, not an URI and hostname. Sure you could get the virConnectPtr based on the URI, but it's better to rely on the user to do that step independantly.
You need a URI. It's not always just a hostname and a port. Consider the two current ways of KVM migration ssh://[user@]host/ and tcp://host:port. The best interface for QEMU/KVM would be a: virDomainSend(dom, "url://...."); and a: virDomainReceive(conn, "url://..."); For tcp://, recv would launch a qemu instance listening on the right port. For ssh://, recv would be a nop. Such an interface could easily support checkpointing, save, resume, etc. If you wanted to introduce a higher level interface for Migrate and Checkpoint, that would be fine too provided it just used these lower level functions and constructed appropriate URIs. Regards, Anthony Liguori
Daniel