virsh-edit: Make force editing usable

When editing a domain with 'virsh edit' and failing validation, the
usual message pops up:

  Failed. Try again? [y,n,f,?]:

Turning off validation can be useful, mainly for testing (but other
purposes too), so this patch adds support for relaxing definition in
virsh-edit and makes 'virsh edit <domain>' more usable.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2015-02-19 14:16:39 +01:00
parent 675fa6b360
commit 1bb1de83b2
4 changed files with 47 additions and 12 deletions

View File

@ -11265,7 +11265,13 @@ cmdEdit(vshControl *ctl, const vshCmd *cmd)
} while (0)
#define EDIT_DEFINE \
(dom_edited = vshDomainDefine(ctl->conn, doc_edited, define_flags))
#define EDIT_RELAX \
do { \
define_flags &= ~VIR_DOMAIN_DEFINE_VALIDATE; \
} while (0);
#include "virsh-edit.c"
#undef EDIT_RELAX
vshPrint(ctl, _("Domain %s XML configuration edited.\n"),
virDomainGetName(dom_edited));

View File

@ -1,7 +1,7 @@
/*
* virsh-edit.c: Implementation of generic virsh *-edit intelligence
*
* Copyright (C) 2012 Red Hat, Inc.
* Copyright (C) 2012, 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -62,6 +62,7 @@ do {
char *doc_reread = NULL;
const char *msg = NULL;
bool edit_success = false;
bool relax_avail = false;
/* Get the XML configuration of the object. */
doc = (EDIT_GET_XML);
@ -74,6 +75,11 @@ do {
goto edit_cleanup;
reedit:
#ifdef EDIT_RELAX
relax_avail = true;
#endif
/* Start the editor. */
if (vshEditFile(ctl, tmp) == -1)
goto edit_cleanup;
@ -112,7 +118,7 @@ do {
msg = _("Failed.");
if (msg) {
int c = vshAskReedit(ctl, msg);
int c = vshAskReedit(ctl, msg, relax_avail);
switch (c) {
case 'y':
goto reedit;
@ -126,6 +132,17 @@ do {
goto edit_cleanup;
break;
#ifdef EDIT_RELAX
case 'i':
if (relax_avail) {
EDIT_RELAX;
relax_avail = false;
goto redefine;
break;
}
/* fall-through */
#endif
default:
vshError(ctl, "%s", msg);
break;

View File

@ -1,7 +1,7 @@
/*
* virsh.c: a shell to exercise the libvirt API
*
* Copyright (C) 2005, 2007-2014 Red Hat, Inc.
* Copyright (C) 2005, 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -512,13 +512,14 @@ vshPrintRaw(vshControl *ctl, ...)
* edited file.
*
* Returns 'y' if he wants to
* 'f' if he forcibly wants to
* 'n' if he doesn't want to
* 'i' if he wants to try defining it again while ignoring validation
* 'f' if he forcibly wants to
* -1 on error
* 0 otherwise
*/
int
vshAskReedit(vshControl *ctl, const char *msg)
vshAskReedit(vshControl *ctl, const char *msg, bool relax_avail)
{
int c = -1;
@ -531,9 +532,8 @@ vshAskReedit(vshControl *ctl, const char *msg)
return -1;
while (true) {
/* TRANSLATORS: For now, we aren't using LC_MESSAGES, and the user
* choices really are limited to just 'y', 'n', 'f' and '?' */
vshPrint(ctl, "\r%s %s", msg, _("Try again? [y,n,f,?]:"));
vshPrint(ctl, "\r%s %s %s: ", msg, _("Try again?"),
relax_avail ? "[y,n,i,f,?]" : "[y,n,f,?]");
c = c_tolower(getchar());
if (c == '?') {
@ -541,11 +541,21 @@ vshAskReedit(vshControl *ctl, const char *msg)
"",
_("y - yes, start editor again"),
_("n - no, throw away my changes"),
NULL);
if (relax_avail) {
vshPrintRaw(ctl,
_("i - turn off validation and try to redefine again"),
NULL);
}
vshPrintRaw(ctl,
_("f - force, try to redefine again"),
_("? - print this help"),
NULL);
continue;
} else if (c == 'y' || c == 'n' || c == 'f') {
} else if (c == 'y' || c == 'n' || c == 'f' ||
(relax_avail && c == 'i')) {
break;
}
}
@ -557,7 +567,9 @@ vshAskReedit(vshControl *ctl, const char *msg)
}
#else /* WIN32 */
int
vshAskReedit(vshControl *ctl, const char *msg ATTRIBUTE_UNUSED)
vshAskReedit(vshControl *ctl,
const char *msg ATTRIBUTE_UNUSED,
bool relax_avail ATTRIBUTE_UNUSED)
{
vshDebug(ctl, VSH_ERR_WARNING, "%s", _("This function is not "
"supported on WIN32 platform"));

View File

@ -1,7 +1,7 @@
/*
* virsh.h: a shell to exercise the libvirt API
*
* Copyright (C) 2005, 2007-2014 Red Hat, Inc.
* Copyright (C) 2005, 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -359,7 +359,7 @@ char *vshGetTypedParamValue(vshControl *ctl, virTypedParameterPtr item)
char *vshEditWriteToTempFile(vshControl *ctl, const char *doc);
int vshEditFile(vshControl *ctl, const char *filename);
char *vshEditReadBackFile(vshControl *ctl, const char *filename);
int vshAskReedit(vshControl *ctl, const char *msg);
int vshAskReedit(vshControl *ctl, const char *msg, bool relax_avail);
int vshStreamSink(virStreamPtr st, const char *bytes, size_t nbytes,
void *opaque);
double vshPrettyCapacity(unsigned long long val, const char **unit);