From: Adam Julis Date: Tue, 9 Jul 2024 15:23:31 +0000 (+0200) Subject: network: allow "modify" option for DNS-Txt records X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7a9e9dfb182451b26846f5595dd8470d13042769;p=libvirt.git network: allow "modify" option for DNS-Txt records The "modify" command allows to replace an existing record (its text value). The primary key is the name of the record. If duplicity or missing record detected, throw error. Tests in networkxml2xmlupdatetest.c contain replacements of an existing DNS-text record and failure due to non-existing record. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/639 Signed-off-by: Adam Julis Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 8e7a739d78..68eee367c4 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -3353,12 +3353,6 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, bool isAdd = (command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); - if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("DNS TXT records cannot be modified, only added or deleted")); - goto cleanup; - } - if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "txt") < 0) goto cleanup; @@ -3397,6 +3391,18 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, virNetworkDNSTxtDefClear(&dns->txts[foundIdx]); VIR_DELETE_ELEMENT(dns->txts, foundIdx, dns->ntxts); + } else if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) { + + if (foundIdx == dns->ntxts) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("couldn't locate a matching DNS TXT record in network %1$s"), + def->name); + goto cleanup; + } + + VIR_FREE(dns->txts[foundIdx].value); + dns->txts[foundIdx].value = g_steal_pointer(&txt.value); + } else { virNetworkDefUpdateUnknownCommand(command); goto cleanup; diff --git a/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml b/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml new file mode 100644 index 0000000000..75ed475fe1 --- /dev/null +++ b/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml @@ -0,0 +1 @@ + diff --git a/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml b/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml new file mode 100644 index 0000000000..e16c352253 --- /dev/null +++ b/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml @@ -0,0 +1 @@ + diff --git a/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml b/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml new file mode 100644 index 0000000000..4b4dda094a --- /dev/null +++ b/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml @@ -0,0 +1,26 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/networkxml2xmlupdatetest.c b/tests/networkxml2xmlupdatetest.c index 59e6ce98e5..875cede035 100644 --- a/tests/networkxml2xmlupdatetest.c +++ b/tests/networkxml2xmlupdatetest.c @@ -306,6 +306,15 @@ mymain(void) "dns-txt-record-snowman", "nat-network-dns-txt-record", VIR_NETWORK_UPDATE_COMMAND_DELETE); + DO_TEST("modify-dns-txt-record", + "dns-txt-record-modify-success", + "nat-network-dns-txt-record", + "nat-network-dns-txt-modify-ok", + VIR_NETWORK_UPDATE_COMMAND_MODIFY); + DO_TEST_FAIL("modify-missing-dns-txt-record", + "dns-txt-record-modify-fail", + "nat-network-dns-txt-record", + VIR_NETWORK_UPDATE_COMMAND_MODIFY); section = VIR_NETWORK_SECTION_DNS_SRV;