]> xenbits.xensource.com Git - libvirt.git/commitdiff
network: allow "modify" option for DNS-Txt records
authorAdam Julis <ajulis@redhat.com>
Tue, 9 Jul 2024 15:23:31 +0000 (17:23 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Jul 2024 08:29:00 +0000 (10:29 +0200)
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 <ajulis@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/network_conf.c
tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml [new file with mode: 0644]
tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml [new file with mode: 0644]
tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml [new file with mode: 0644]
tests/networkxml2xmlupdatetest.c

index 8e7a739d788f7fa8962be98f6a61c04672027120..68eee367c43ae49f86f32fd7ae6cecb9f568f8a0 100644 (file)
@@ -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 (file)
index 0000000..75ed475
--- /dev/null
@@ -0,0 +1 @@
+<txt name='notexisted' value='modified example'/>
diff --git a/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml b/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml
new file mode 100644 (file)
index 0000000..e16c352
--- /dev/null
@@ -0,0 +1 @@
+<txt name='example' value='modified example'/>
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 (file)
index 0000000..4b4dda0
--- /dev/null
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0'/>
+  <dns>
+    <txt name='example' value='modified example'/>
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254'/>
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10'/>
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11'/>
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
index 59e6ce98e563865229388cb25d63d11562ca6adc..875cede035313a3811c96c1bcf9a595b3bb7b9e5 100644 (file)
@@ -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;