[libvirt] [PATCH] repeat lookup by name in LookupByID

Jim Meyering jim at meyering.net
Fri Jul 18 10:27:03 UTC 2008


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Thu, Jul 17, 2008 at 01:20:59PM +0400, Evgeniy Sokolov wrote:
...
>> Index: virsh.c
>> ===================================================================
>> RCS file: /data/cvs/libvirt/src/virsh.c,v
>> retrieving revision 1.155
>> diff -u -p -r1.155 virsh.c
>> --- virsh.c	29 May 2008 14:56:12 -0000	1.155
>> +++ virsh.c	17 Jul 2008 09:04:17 -0000
>> @@ -978,7 +978,8 @@ cmdUndefine(vshControl * ctl, vshCmd * c
>>      if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
>>          return FALSE;
>>
>> -    if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", &name)))
>> +    if (!(dom = vshCommandOptDomainBy(ctl, cmd, "domain", &name,
>> +                                      VSH_BYNAME|VSH_BYUUID)))

Before this change, we'd get a hint that undefining a running domain
is not possible:

    $ virsh -q -c test:///default undefine 1
    virsh # libvir: Test error test: internal error Domain is still running
    error: Failed to undefine domain 1
    virsh #

Now, the hint is gone, and the new diagnostics are misleading,
since domain "1" certainly does exist:

    $ ./virsh -q -c test:///default undefine 1
    virsh # libvir: Test error : Domain not found
    error: failed to get domain '1'
    virsh #

With the patch below virsh tells what's wrong:

    $ ./virsh -q -c test:///default undefine 1
    error: a running domain like 1 cannot be undefined;
    to undefine, first shutdown then undefine using its name or UUID
    [Exit 1]

My first attempt called vshCommandOptDomainBy-with-BYID only upon failure
of the with-VSH_BYNAME|VSH_BYUUID call, but then you'd still get this
misleading diagnostic:

    error: failed to get domain '1'

It also adds a test that essentially does this:

    $ ./virsh -q -c test:///default undefine 1
    error: a running domain like 1 cannot be undefined;
    to undefine, first shutdown then undefine using its name or UUID
    [Exit 1]
    $ ./virsh -q -c test:///default undefine test
    libvir: Test error test: internal error Domain is still running
    error: Failed to undefine domain test
    [Exit 1]
    $ ./virsh -q -c test:///default 'shutdown 1; undefine test'
    Domain 1 is being shutdown
    Domain test has been undefined

>From d8a30f1f4da5db63b0c3cef2a67183a76c7dc989 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Fri, 18 Jul 2008 10:53:25 +0200
Subject: [PATCH] better diagnostic when failing to undefine a running domain via ID

* src/virsh.c (cmdUndefine): Tell user to shutdown and then use name or UUID.
* tests/undefine: New test.  Exercise virsh's undefine command.
* tests/Makefile.am (test_scripts): Add undefine.
---
 src/virsh.c       |   14 +++++++++++++
 tests/Makefile.am |    1 +
 tests/undefine    |   55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+), 0 deletions(-)
 create mode 100755 tests/undefine

diff --git a/src/virsh.c b/src/virsh.c
index f1296ec..620f103 100644
--- a/src/virsh.c
+++ b/src/virsh.c
@@ -974,10 +974,24 @@ cmdUndefine(vshControl * ctl, vshCmd * cmd)
     virDomainPtr dom;
     int ret = TRUE;
     char *name;
+    int found;
+    int id;

     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;

+    name = vshCommandOptString(cmd, "domain", &found);
+    if (!found)
+        return FALSE;
+
+    if (name && virStrToLong_i(name, NULL, 10, &id) == 0
+        && id >= 0 && (dom = virDomainLookupByID(ctl->conn, id))) {
+        vshError(ctl, FALSE, _("a running domain like %s cannot be undefined;\n"
+                               "to undefine, first shutdown then undefine"
+                               " using its name or UUID"), name);
+        virDomainFree(dom);
+        return FALSE;
+    }
     if (!(dom = vshCommandOptDomainBy(ctl, cmd, "domain", &name,
                                       VSH_BYNAME|VSH_BYUUID)))
         return FALSE;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2fc5a2f..5686678 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -51,6 +51,7 @@ test_scripts += \
 	int-overflow \
 	read-bufsiz \
 	read-non-seekable \
+	undefine \
 	vcpupin
 endif

diff --git a/tests/undefine b/tests/undefine
new file mode 100755
index 0000000..3936e22
--- /dev/null
+++ b/tests/undefine
@@ -0,0 +1,55 @@
+#!/bin/sh
+# exercise virsh's "undefine" command
+
+# Copyright (C) 2008 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+if test "$VERBOSE" = yes; then
+  set -x
+  virsh --version
+fi
+
+. $srcdir/test-lib.sh
+
+fail=0
+
+# Attempt to undefine a running domain, by domain name.
+virsh -q -c test:///default undefine test > out 2>&1
+test $? = 1 || fail=1
+cat <<\EOF > exp || fail=1
+libvir: Test error test: internal error Domain is still running
+error: Failed to undefine domain test
+EOF
+compare out exp || fail=1
+
+# A different diagnostic when specifying a domain ID
+virsh -q -c test:///default undefine 1 > out 2>&1
+test $? = 1 || fail=1
+cat <<\EOF > exp || fail=1
+error: a running domain like 1 cannot be undefined;
+to undefine, first shutdown then undefine using its name or UUID
+EOF
+compare out exp || fail=1
+
+# Succeed, now: first shut down, then undefine, both via name.
+virsh -q -c test:///default 'shutdown test; undefine test' > out 2>&1
+test $? = 0 || fail=1
+cat <<\EOF > exp || fail=1
+Domain test is being shutdown
+Domain test has been undefined
+EOF
+compare out exp || fail=1
+
+(exit $fail); exit $fail
--
1.5.6.3.440.ge3a8d




More information about the libvir-list mailing list