From 2eb8ab2057f89da052617ec1920e711fba2f58ce Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 22 Jul 2008 16:12:01 +0000 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. --- ChangeLog | 8 +++++++ src/virsh.c | 14 ++++++++++++ tests/Makefile.am | 1 + tests/undefine | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100755 tests/undefine diff --git a/ChangeLog b/ChangeLog index eb9b036d47..a91cc3fefd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Tue Jul 22 18:11:13 CEST 2008 Jim Meyering + + 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. + Mon Jul 21 15:31:52 CEST 2008 Daniel Veillard * src/openvz_conf.c src/openvz_driver.c: patch from Evgeniy Sokolov diff --git a/src/virsh.c b/src/virsh.c index f1296ec5df..620f103919 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 2fc5a2fbbe..5686678c70 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 0000000000..3936e22d39 --- /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 . + +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