If the domain has managed state file, and --managed-state is
not specified, then it fails with error prompt to tell user
there is managed state file exists.
And the domain has managed state file, and --managed-state is
specified, it invokes virDomainUndefineFlags, if
virDomainUndefineFlag fails, then it trys to remove the managed
state file using virDomainManagedSaveRemove first, with
invoking virDomainUndefine following. (For compatibility between
new virsh with this patch and older libvirt without this fix)
Simliar if the domain has no managed state. See the codes for
detail.
---
tools/virsh.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
tools/virsh.pod | 6 +++++-
2 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 4af8fea..8a62612 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1409,6 +1409,7 @@ static const vshCmdInfo info_undefine[] = {
static const vshCmdOptDef opts_undefine[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name or
uuid")},
+ {"managed-state", VSH_OT_BOOL, 0, N_("remove domain managed state
file")},
{NULL, 0, 0, NULL}
};
@@ -1419,6 +1420,16 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
bool ret = true;
const char *name = NULL;
int id;
+ int flags = 0;
+ int managed_state = vshCommandOptBool(cmd, "managed-state");
+ int has_managed_state = 0;
+ int rc = -1;
+
+ if (managed_state)
+ flags |= VIR_DOMAIN_UNDEFINE_MANAGED_STATE;
+
+ if (!managed_state)
+ flags = -1;
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
@@ -1440,7 +1451,37 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
VSH_BYNAME|VSH_BYUUID)))
return false;
- if (virDomainUndefine(dom) == 0) {
+ has_managed_state = virDomainHasManagedSaveImage(dom, 0);
+ if (has_managed_state < 0)
+ return false;
+
+ if (flags == -1) {
+ if (has_managed_state == 1) {
+ vshError(ctl,
+ _("Refusing to undefine with managed state "
+ "file exists"));
+ return false;
+ }
+
+ rc = virDomainUndefine(dom);
+ } else {
+ rc = virDomainUndefineFlags(dom, flags);
+
+ /* It might fail for virDomainUndefineFlags is not
+ * supported on older libvirt, try to undefine the
+ * domain with combo virDomainManagedSaveRemove and
+ * virDomainUndefine.
+ */
+ if (rc < 0) {
+ if (has_managed_state &&
+ virDomainManagedSaveRemove(dom, 0) < 0)
+ return false;
+
+ rc = virDomainUndefine(dom);
+ }
+ }
+
+ if (rc == 0) {
vshPrint(ctl, _("Domain %s has been undefined\n"), name);
} else {
vshError(ctl, _("Failed to undefine domain %s"), name);
@@ -2424,6 +2465,7 @@ cmdDominfo(vshControl *ctl, const vshCmd *cmd)
VIR_FREE(seclabel);
}
}
+
virDomainFree(dom);
return ret;
}
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 52f1549..68cc484 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -805,11 +805,15 @@ hypervisor.
Output the device used for the TTY console of the domain. If the information
is not available the processes will provide an exit code of 1.
-=item B<undefine> I<domain-id>
+=item B<undefine> I<domain-id> I<--managed-state>
Undefine the configuration for an inactive domain. Since it's not running
the domain name or UUID must be used as the I<domain-id>.
+The I<--managed-save> flag guarantees that any managed state (see the
+B<managesave> command) is also cleaned up. Without the flag, attempts
+to undefine a domain with managed state will fail.
+
=item B<vcpucount> I<domain-id> optional I<--maximum>
I<--current>
I<--config> I<--live>
--
1.7.6