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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list