[libvirt] [PATCH v3] virsh-edit: Make force editing usable

Martin Kletzander mkletzan at redhat.com
Fri Feb 20 07:10:16 UTC 2015


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 at redhat.com>
---
v3:
 - turn 'v' into an 'i' (as in "Ignore validation")
 - fix translation

v2:
 - make a special case 'v' for turning off validation

 tools/virsh-domain.c |  6 ++++++
 tools/virsh-edit.c   | 21 +++++++++++++++++++--
 tools/virsh.c        | 28 ++++++++++++++++++++--------
 tools/virsh.h        |  4 ++--
 4 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 2506b89..1b8d473 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -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));
diff --git a/tools/virsh-edit.c b/tools/virsh-edit.c
index 41a6d53..1b39cb7 100644
--- a/tools/virsh-edit.c
+++ b/tools/virsh-edit.c
@@ -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;
diff --git a/tools/virsh.c b/tools/virsh.c
index aba34ce..9ecddf3 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -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"));
diff --git a/tools/virsh.h b/tools/virsh.h
index 7d5d8a2..df2ea7f 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -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);
--
2.3.0




More information about the libvir-list mailing list