From 5ee592208cbed9d617bb5bc8120a44a3209b7e40 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Wed, 17 Mar 2010 17:18:36 +0100 Subject: [PATCH] Add migrate-setmaxdowntime command to virsh --- tools/virsh.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/virsh.pod | 6 +++++ 2 files changed, 72 insertions(+) diff --git a/tools/virsh.c b/tools/virsh.c index 97145eb7d2..32895b26ac 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -227,6 +227,8 @@ static vshCmdOpt *vshCommandOpt(const vshCmd *cmd, const char *name); static int vshCommandOptInt(const vshCmd *cmd, const char *name, int *found); static char *vshCommandOptString(const vshCmd *cmd, const char *name, int *found); +static long long vshCommandOptLongLong(const vshCmd *cmd, const char *name, + int *found); #if 0 static int vshCommandOptStringList(const vshCmd *cmd, const char *name, char ***data); #endif @@ -2827,6 +2829,51 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd) return ret; } +/* + * "migrate-setmaxdowntime" command + */ +static const vshCmdInfo info_migrate_setmaxdowntime[] = { + {"help", N_("set maximum tolerable downtime")}, + {"desc", N_("Set maximum tolerable downtime of a domain which is being live-migrated to another host.")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_migrate_setmaxdowntime[] = { + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, + {"downtime", VSH_OT_DATA, VSH_OFLAG_REQ, N_("maximum tolerable downtime (in milliseconds) for migration")}, + {NULL, 0, 0, NULL} +}; + +static int +cmdMigrateSetMaxDowntime(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom = NULL; + long long downtime; + int found; + int ret = FALSE; + + if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) + return FALSE; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return FALSE; + + downtime = vshCommandOptLongLong(cmd, "downtime", &found); + if (!found || downtime < 1) { + vshError(ctl, "%s", _("migrate: Invalid downtime")); + goto done; + } + + if (virDomainMigrateSetMaxDowntime(dom, downtime, 0)) + goto done; + + ret = TRUE; + +done: + virDomainFree(dom); + return ret; +} + /* * "net-autostart" command */ @@ -7767,6 +7814,7 @@ static const vshCmdDef commands[] = { {"hostname", cmdHostname, NULL, info_hostname}, {"list", cmdList, opts_list, info_list}, {"migrate", cmdMigrate, opts_migrate, info_migrate}, + {"migrate-setmaxdowntime", cmdMigrateSetMaxDowntime, opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime}, {"net-autostart", cmdNetworkAutostart, opts_network_autostart, info_network_autostart}, {"net-create", cmdNetworkCreate, opts_network_create, info_network_create}, @@ -8107,6 +8155,24 @@ vshCommandOptString(const vshCmd *cmd, const char *name, int *found) return arg && arg->data && *arg->data ? arg->data : NULL; } +/* + * Returns option as long long + */ +static long long +vshCommandOptLongLong(const vshCmd *cmd, const char *name, int *found) +{ + vshCmdOpt *arg = vshCommandOpt(cmd, name); + int num_found = FALSE; + long long res = 0; + char *end_p = NULL; + + if ((arg != NULL) && (arg->data != NULL)) + num_found = !virStrToLong_ll(arg->data, &end_p, 10, &res); + if (found) + *found = num_found; + return res; +} + #if 0 static int vshCommandOptStringList(const vshCmd *cmd, const char *name, char ***data) diff --git a/tools/virsh.pod b/tools/virsh.pod index 8f6df191b4..a6298dd980 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -334,6 +334,12 @@ leaves the domain paused on the destination host. The I is the connection URI of the destination host, and I is the migration URI, which usually can be omitted. +=item B I I + +Set maximum tolerable downtime for a domain which is being live-migrated to +another host. The I is a number of milliseconds the guest is allowed +to be down at the end of live migration. + =item B I Reboot a domain. This acts just as if the domain had the B -- GitLab