On Thu, Jun 18, 2026 at 09:58:17 +0200, Michal Privoznik via Devel wrote:
From: Michal Privoznik <mprivozn@redhat.com>
The detach-interface virsh command requires domain (obviously) and --type to identify <interface/>. Optionally, --mac can be provided to chose from multiple interfaces. Well, that renders --type argument redundant. I mean, if there are but unique MACs within domain XML, then interface type is implied. If there are duplicate MACs then --type can help to differentiate, though at that point detach-device seems like a better fit.
Long story short, make --type optional.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- docs/manpages/virsh.rst | 2 +- tools/virsh-domain.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 39d91d8375..2992495ecb 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5586,7 +5586,7 @@ detach-interface
::
- detach-interface domain type [--mac mac] + detach-interface domain [--type type] [--mac mac]
The syntax for an optional positional argument is: [<type>] per what our help prints: SYNOPSIS detach-interface <domain> [<type>] [--mac <string>] [--persistent] [--config] [--live] [--current] [--print-xml]
[[[--live] [--config] | [--current]] | [--persistent]] [--print-xml]
Detach a network interface from a domain. diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index f9de3b42a9..8a6f868e34 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -12782,7 +12782,6 @@ static const vshCmdOptDef opts_detach_interface[] = { {.name = "type", .type = VSH_OT_STRING, .positional = true, - .required = true, .help = N_("network interface type") }, {.name = "mac", @@ -12816,7 +12815,7 @@ virshDomainDetachInterface(char *doc, g_autoptr(xmlDoc) xml = NULL; g_autoptr(xmlXPathContext) ctxt = NULL; g_autofree char *detach_xml = NULL; - g_autofree char *xpath = g_strdup_printf("/domain/devices/interface[@type='%s']", type); + g_autofree char *xpath = NULL; g_autofree xmlNodePtr *nodes = NULL; ssize_t nnodes; xmlNodePtr matchNode = NULL; @@ -12827,8 +12826,16 @@ virshDomainDetachInterface(char *doc, return false; }
+ if (type) + xpath = g_strdup_printf("/domain/devices/interface[@type='%s']", type); + else + xpath = g_strdup("/domain/devices/interface"); + if ((nnodes = virXPathNodeSet(xpath, ctxt, &nodes)) <= 0) { - vshError(ctl, _("No interface found whose type is %1$s"), type); + if (type) + vshError(ctl, _("No interface found whose type is %1$s"), type); + else + vshError(ctl, "%s", _("Domain has no interfaces"));
Looking at the code, if neither 'mac' nor 'type' are specified it detaches the only interface if there's exactly one. I think I'd reword the man page section: Detach a network interface from a domain. *type* can be either *network* to indicate a physical network device or *bridge* to indicate a bridge to a device. It is recommended to use the *mac* option to distinguish between the interfaces if more than one are present on the domain. to something like: *type* and/or *mac* can be used to narrow Detach a network interface from a domain. In case when multiple interfaces are present in the *type* and/or *--mac* must be used to narrow down the selection to 1 interface. *type* can be either *network* to indicate a physical network device *bridge* to indicate a bridge to a device. *--mac* can select the interface based on the configured MAC address. Reviewed-by: Peter Krempa <pkrempa@redhat.com>