This is just an example. Unlike the previous patch, this one
of course is not ready for committing.
* include/libvirt/libvirt.h.in: Add VIR_MIGRATE_TUNNELLED.
* src/libvirt.c: Implement non-support for VIR_MIGRATE_TUNNELLED.
* src/virsh.c: Add --tunnelled arg to virsh migrate.
---
include/libvirt/libvirt.h.in | 3 ++-
src/libvirt.c | 14 +++++++++++---
tools/virsh.c | 4 ++++
3 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 4e63e48..fa54be1 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -336,7 +336,8 @@ typedef virDomainInterfaceStatsStruct *virDomainInterfaceStatsPtr;
/* Domain migration flags. */
typedef enum {
- VIR_MIGRATE_LIVE = 1, /* live migration */
+ VIR_MIGRATE_LIVE = (1 << 0), /* live migration */
+ VIR_MIGRATE_TUNNELLED = (1 << 1), /* tunnel migration data over
libvirtd connection */
} virDomainMigrateFlags;
/* Domain migration. */
diff --git a/src/libvirt.c b/src/libvirt.c
index f0ec640..811c50d 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -2918,6 +2918,8 @@ virDomainMigrateVersion1 (virDomainPtr domain,
char *cookie = NULL;
int cookielen = 0;
+ assert (!(flags & VIR_MIGRATE_TUNNELLED));
+
/* Prepare the migration.
*
* The destination host may return a cookie, or leave cookie as
@@ -2982,6 +2984,8 @@ virDomainMigrateVersion2 (virDomainPtr domain,
char *dom_xml = NULL;
int cookielen = 0, ret;
+ assert (!(flags & VIR_MIGRATE_TUNNELLED));
+
/* Prepare the migration.
*
* The destination host may return a cookie, or leave cookie as
@@ -3098,7 +3102,9 @@ virDomainMigrateP2P (virDomainPtr domain,
*
* dconn can be NULL. Then the uri parameter will then be a
* valid libvirt connection URI, by which the source libvirt
- * driver can connect to the destination libvirt.
+ * driver can connect to the destination libvirt. If this
+ * scheme is used and the hypervisor supports it, the
+ * VIR_MIGRATE_TUNNELLED flag can also be set.
*
* If the dconn argument is set, the URI parameter takes a
* hypervisor specific format. The hypervisor capabilities XML
@@ -3192,13 +3198,15 @@ virDomainMigrate (virDomainPtr domain,
protocol = VIR_DRV_FEATURE_MIGRATION_P2P;
/* For these, migration has to be supported by both drivers. */
- else if (VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
+ else if (!(flags & VIR_MIGRATE_TUNNELLED) &&
+ VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V1) &&
VIR_DRV_SUPPORTS_FEATURE (dconn->driver, dconn,
VIR_DRV_FEATURE_MIGRATION_V1))
protocol = VIR_DRV_FEATURE_MIGRATION_V1;
- else if (VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
+ else if (!(flags & VIR_MIGRATE_TUNNELLED) &&
+ VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V2) &&
VIR_DRV_SUPPORTS_FEATURE (dconn->driver, dconn,
VIR_DRV_FEATURE_MIGRATION_V2))
diff --git a/tools/virsh.c b/tools/virsh.c
index a3d92df..55b1d76 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -2462,6 +2462,7 @@ static const vshCmdInfo info_migrate[] = {
static const vshCmdOptDef opts_migrate[] = {
{"live", VSH_OT_BOOL, 0, gettext_noop("live migration")},
+ {"tunnelled", VSH_OT_BOOL, 0, gettext_noop("tunnelled
migration")},
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id
or uuid")},
{"desturi", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("connection URI
of the destination host")},
{"migrateuri", VSH_OT_DATA, 0, gettext_noop("migration URI, usually
can be omitted")},
@@ -2499,6 +2500,9 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
if (vshCommandOptBool (cmd, "live"))
flags |= VIR_MIGRATE_LIVE;
+ if (vshCommandOptBool (cmd, "tunnelled"))
+ flags |= VIR_MIGRATE_TUNNELLED;
+
if (migrateuri == NULL) {
/* Let libvirt handle opening the connection if necessary. */
ddom = virDomainMigrate (dom, NULL, flags, dname, desturi, 0);
--
1.6.2.5