From nobody Wed May 15 09:05:25 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710752682873682.7962977744213; Mon, 18 Mar 2024 02:04:42 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 929DB1C5B; Mon, 18 Mar 2024 05:04:41 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 9F4C81AAC; Mon, 18 Mar 2024 05:02:55 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 554AC1ADA; Fri, 15 Mar 2024 16:21:25 -0400 (EDT) Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E48C71AB4 for ; Fri, 15 Mar 2024 16:21:20 -0400 (EDT) Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-1dd9b6098aeso18917805ad.0 for ; Fri, 15 Mar 2024 13:21:20 -0700 (PDT) Received: from iuseotherswifi.notpua ([218.185.248.66]) by smtp.gmail.com with ESMTPSA id c7-20020a170902d48700b001dc3916853csm2295962plg.73.2024.03.15.13.21.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 13:21:18 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710534079; x=1711138879; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/CWE2Cxcyj3axuvHxU4AnvCyxukZl7razn+yL+PbkBU=; b=mh9ypdFCHhBodDX3NvukEDGjd2NPsedk+u5VdGS3gcIlMosTxaKefjyhBSznrowcmE qZH7/sgQGS/2ahaSygBDJquIkw+CWMJRjE0Xv/rrnSRxRGRL/dthZpgBu/8RQY1aAyI+ 9cfV6PQArYG9zYUzu+Nc++O+v9n8kK7z5NJSZEIKO/M6SHwtXj0bIAq9S93Kwh3ep9Fv DckwWePyfVinaJO/vrAYsSI8dA0N1UASoE7NF9yDZbdQQJJ4vITqeg/Utavrl/Ib3Szo tExtUnYfyBtkNLeN1uUmFOtbAHe4Klm6A/+OaSOIHcm10WgWnvMiSmfA8Q0j9zsLM7z8 p20A== X-Gm-Message-State: AOJu0YzPpzeMK0XZOVgyVUcR9qH236HlOtbs20KmesdmKp/Duxb/QlGv +Agxxo+kfH+nz++OKro5Bw1u9llSvs/fjCP84+yq66Lusc2TIkENjI9sZvIB+E7ZAEXw X-Google-Smtp-Source: AGHT+IEf8+LdETv+oaU33fZjGF8auOZEcvJytYG0SygidZHpo4w7A1cf2sedk3zd+/IpF874B+c95g== X-Received: by 2002:a17:902:e882:b0:1dd:8271:e4bb with SMTP id w2-20020a170902e88200b001dd8271e4bbmr7296211plg.52.1710534078656; Fri, 15 Mar 2024 13:21:18 -0700 (PDT) From: Abhiram Tilak To: devel@lists.libvirt.org Subject: [PATCH] network: add modify-or-add feature to net-update Date: Sat, 16 Mar 2024 01:43:52 +0530 Message-ID: <20240315201349.31068-4-atp.exp@gmail.com> X-Mailer: git-send-email 2.42.1 MIME-Version: 1.0 X-MailFrom: atp.exp@gmail.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 Message-ID-Hash: SMFEUQOFVE2ADGV2D2UFVPA3Y7CJ2XLM X-Message-ID-Hash: SMFEUQOFVE2ADGV2D2UFVPA3Y7CJ2XLM X-Mailman-Approved-At: Mon, 18 Mar 2024 09:02:53 -0400 CC: Abhiram Tilak X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710752683906100001 The current way of updating a network configuration uses `virsh net-update` to add, delete or modify entries. But with such a mechansim one should know if an entry with current info already exists. Adding modify-or-add option automatically performs either modify or add depending on the current state. Fixes: https://gitlab.com/libvirt/libvirt/-/issues/363 Signed-off-by: Abhiram Tilak --- docs/manpages/virsh.rst | 5 +- include/libvirt/libvirt-network.h | 2 + src/conf/network_conf.c | 148 ++++++++++++++++++++++++------ tools/virsh-network.c | 4 +- 4 files changed, 126 insertions(+), 33 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 115b802c45..dc91ba895c 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5908,7 +5908,10 @@ changes optionally taking effect immediately, withou= t needing to destroy and re-start the network. =20 *command* is one of "add-first", "add-last", "add" (a synonym for -add-last), "delete", or "modify". +add-last), "delete", "modify", "modify-or-add" (modify + add-last), +"modify-or-add-first". The 'modify-or-add' commands perform modify or +add operation depending on the given state, and can be useful for +scripting. =20 *section* is one of "bridge", "domain", "ip", "ip-dhcp-host", "ip-dhcp-range", "forward", "forward-interface", "forward-pf", diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-ne= twork.h index 58591be7ac..a6e132f407 100644 --- a/include/libvirt/libvirt-network.h +++ b/include/libvirt/libvirt-network.h @@ -181,6 +181,8 @@ typedef enum { VIR_NETWORK_UPDATE_COMMAND_DELETE =3D 2, /* delete an existing elem= ent (Since: 0.10.2) */ VIR_NETWORK_UPDATE_COMMAND_ADD_LAST =3D 3, /* add an element at end o= f list (Since: 0.10.2) */ VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST =3D 4, /* add an element at start= of list (Since: 0.10.2) */ + VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_LAST =3D 5, /* if exists modi= fy or add an element at end of list (Since: 0.10.2) */ + VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_FIRST =3D 6, /* if exists mod= ify or add an element at start of list (Since: 0.10.2) */ # ifdef VIR_ENUM_SENTINELS VIR_NETWORK_UPDATE_COMMAND_LAST /* (Since: 0.10.2) */ # endif diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index cc92ed0b03..2835395385 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2721,6 +2721,9 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDef *def, virNetworkDHCPHostDef host =3D { 0 }; bool partialOkay =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_DELETE= ); =20 + /* added for modify-or-add feature */ + bool modified =3D false; + if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "host") < 0) goto cleanup; =20 @@ -2826,7 +2829,34 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDef *def, virNetworkDHCPHostDefClear(&ipdef->hosts[i]); VIR_DELETE_ELEMENT(ipdef->hosts, i, ipdef->nhosts); =20 - } else { + } else if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_LA= ST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_FI= RST)) { + + /* find entries with matching name/address/ip */ + for (i =3D 0; i < ipdef->nhosts; i++) { + if ((host.mac && ipdef->hosts[i].mac && + !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) || + (host.name && + STREQ_NULLABLE(host.name, ipdef->hosts[i].name)) || + (VIR_SOCKET_ADDR_VALID(&host.ip) && + virSocketAddrEqual(&host.ip, &ipdef->hosts[i].ip))) { + + modified =3D true; + break; + } + } + + /* if element is found then modify, or else add to beginning/end o= f list */ + if (modified) { + virNetworkDHCPHostDefClear(&ipdef->hosts[i]); + ipdef->hosts[i] =3D host; + memset(&host, 0, sizeof(host)); + } else if (VIR_INSERT_ELEMENT(ipdef->hosts, + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_O= R_ADD_FIRST + ? 0 : ipdef->nhosts, + ipdef->nhosts, host) < 0) + goto cleanup; + } else { virNetworkDefUpdateUnknownCommand(command); goto cleanup; } @@ -2885,7 +2915,9 @@ virNetworkDefUpdateIPDHCPRange(virNetworkDef *def, } =20 if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || - (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) { + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_LAST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_FIRST)) { =20 if (virNetworkDefUpdateCheckMultiDHCP(def, ipdef) < 0) return -1; @@ -2894,17 +2926,24 @@ virNetworkDefUpdateIPDHCPRange(virNetworkDef *def, g_autofree char *startip =3D virSocketAddrFormat(&range.addr.s= tart); g_autofree char *endip =3D virSocketAddrFormat(&range.addr.end= ); =20 - virReportError(VIR_ERR_OPERATION_INVALID, - _("there is an existing dhcp range entry in net= work '%1$s' that matches \"\""), - def->name, - startip ? startip : "unknown", - endip ? endip : "unknown"); + + if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) + virReportError(VIR_ERR_OPERATION_INVALID, + _("there is an existing dhcp range entry in= network '%1$s' that matches \"\""), + def->name, + startip ? startip : "unknown", + endip ? endip : "unknown"); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("dhcp ranges cannot be modified, only add= ed or deleted")); return -1; } =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(ipdef->ranges, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= MODIFY_OR_ADD_FIRST) ? 0 : ipdef->nranges, ipdef->nranges, range) < 0) return -1; @@ -2981,18 +3020,26 @@ virNetworkDefUpdateForwardInterface(virNetworkDef *= def, } =20 if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || - (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) { + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_LAST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_FIRST)) { =20 if (i < def->forward.nifs) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("there is an existing interface entry in netw= ork '%1$s' that matches \"\""), - def->name, iface.device.dev); + if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) + virReportError(VIR_ERR_OPERATION_INVALID, + _("there is an existing interface entry in = network '%1$s' that matches \"\""), + def->name, iface.device.dev); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("forward interface entries cannot be modi= fied, only added or deleted")); goto cleanup; } =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(def->forward.ifs, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= MODIFY_OR_ADD_FIRST) ? 0 : def->forward.nifs, def->forward.nifs, iface) < 0) goto cleanup; @@ -3056,6 +3103,9 @@ virNetworkDefUpdatePortGroup(virNetworkDef *def, int ret =3D -1; virPortGroupDef portgroup =3D { 0 }; =20 + /* added for modify-or-add feature */ + bool modified =3D false; + if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "portgroup") = < 0) goto cleanup; =20 @@ -3097,6 +3147,17 @@ virNetworkDefUpdatePortGroup(virNetworkDef *def, goto cleanup; } =20 + /* modify found entries for modify-or-add command */ + if (foundName >=3D 0 && (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MOD= IFY_OR_ADD_LAST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_FIRST)) { + + /* replace existing entry */ + virPortGroupDefClear(&def->portGroups[foundName]); + def->portGroups[foundName] =3D portgroup; + memset(&portgroup, 0, sizeof(portgroup)); + modified =3D true; + } + if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY) { =20 /* replace existing entry */ @@ -3105,11 +3166,14 @@ virNetworkDefUpdatePortGroup(virNetworkDef *def, memset(&portgroup, 0, sizeof(portgroup)); =20 } else if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || - (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) { + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) || + (!modified && command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_= ADD_LAST) || + (!modified && command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_= ADD_FIRST)) { =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(def->portGroups, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_M= ODIFY_OR_ADD_FIRST) ? 0 : def->nPortGroups, def->nPortGroups, portgroup) < 0) goto cleanup; @@ -3144,7 +3208,9 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def, virNetworkDNSDef *dns =3D &def->dns; virNetworkDNSHostDef host =3D { 0 }; bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= LAST); int foundCt =3D 0; =20 if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY) { @@ -3185,15 +3251,21 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def, if (isAdd) { =20 if (foundCt > 0) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("there is already at least one DNS HOST recor= d with a matching field in network %1$s"), - def->name); + if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) + virReportError(VIR_ERR_OPERATION_INVALID, + _("there is already at least one DNS HOST r= ecord with a matching field in network %1$s"), + def->name); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("DNS HOST records cannot be modified, onl= y added or deleted")); goto cleanup; } =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(dns->hosts, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= MODIFY_OR_ADD_FIRST) ? 0 : dns->nhosts, dns->nhosts, host) < 0) goto cleanup; } else if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_DELETE) { @@ -3240,7 +3312,9 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def, virNetworkDNSDef *dns =3D &def->dns; virNetworkDNSSrvDef srv =3D { 0 }; bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= LAST); int foundCt =3D 0; =20 if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY) { @@ -3268,15 +3342,21 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def, if (isAdd) { =20 if (foundCt > 0) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("there is already at least one DNS SRV record= matching all specified fields in network %1$s"), - def->name); + if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) + virReportError(VIR_ERR_OPERATION_INVALID, + _("there is already at least one DNS SRV re= cord matching all specified fields in network %1$s"), + def->name); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("DNS SRV records cannot be modified, only= added or deleted")); goto cleanup; } =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(dns->srvs, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= MODIFY_OR_ADD_FIRST) ? 0 : dns->nsrvs, dns->nsrvs, srv) < 0) goto cleanup; } else if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_DELETE) { @@ -3322,7 +3402,9 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, virNetworkDNSDef *dns =3D &def->dns; virNetworkDNSTxtDef txt =3D { 0 }; bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY_OR_ADD_= LAST); =20 if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_MODIFY) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", @@ -3344,15 +3426,21 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, if (isAdd) { =20 if (foundIdx < dns->ntxts) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("there is already a DNS TXT record with name = '%1$s' in network %2$s"), - txt.name, def->name); + if ((command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) || + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST)) + virReportError(VIR_ERR_OPERATION_INVALID, + _("there is already a DNS TXT record with n= ame '%1$s' in network %2$s"), + txt.name, def->name); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("DNS TXT records cannot be modified, only= added or deleted")); goto cleanup; } =20 /* add to beginning/end of list */ if (VIR_INSERT_ELEMENT(dns->txts, - command =3D=3D VIR_NETWORK_UPDATE_COMMAND_A= DD_FIRST + (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= ADD_FIRST || + command =3D=3D VIR_NETWORK_UPDATE_COMMAND_= MODIFY_OR_ADD_FIRST) ? 0 : dns->ntxts, dns->ntxts, txt) < 0) goto cleanup; } else if (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_DELETE) { diff --git a/tools/virsh-network.c b/tools/virsh-network.c index 597e3d4530..c30305ac50 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -1231,7 +1231,7 @@ static const vshCmdOptDef opts_network_update[] =3D { .positional =3D true, .required =3D true, .completer =3D virshNetworkUpdateCommandCompleter, - .help =3D N_("type of update (add-first, add-last (add), delete, or m= odify)") + .help =3D N_("type of update (add-first, add-last (add), delete, modi= fy, modify-or-add, or modify-or-add-first)") }, {.name =3D "section", .type =3D VSH_OT_STRING, @@ -1260,7 +1260,7 @@ static const vshCmdOptDef opts_network_update[] =3D { =20 VIR_ENUM_IMPL(virshNetworkUpdateCommand, VIR_NETWORK_UPDATE_COMMAND_LAST, - "none", "modify", "delete", "add-last", "add-first"); + "none", "modify", "delete", "add-last", "add-first", "modify= -or-add", "modify-or-add-first"); =20 VIR_ENUM_IMPL(virshNetworkSection, VIR_NETWORK_SECTION_LAST, --=20 2.44.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org