]> xenbits.xensource.com Git - libvirt.git/commitdiff
network: allow "modify" option for DNS-Srv records
authorAdam Julis <ajulis@redhat.com>
Tue, 9 Jul 2024 15:23:18 +0000 (17:23 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Jul 2024 08:28:58 +0000 (10:28 +0200)
The "modify" command allows to replace an existing Srv record
(some of its elements respectively: port, priority and weight).
The primary key used to choose the modify record is the remaining
parameters, only one of them is required. Not using some of these
parameters may cause duplicate records and error message. This
logic is there because of the previous implementation (Add and
Delete options) in the function.

Tests in networkxml2xmlupdatetest.c contain replacements of an
existing DNS-Srv record and failure due to non-existing record.

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/639
Signed-off-by: Adam Julis <ajulis@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/network_conf.c
tests/networkxml2xmlupdatein/srv-not-existing.xml [new file with mode: 0644]
tests/networkxml2xmlupdatein/srv-record-modify-few.xml [new file with mode: 0644]
tests/networkxml2xmlupdateout/nat-network-dns-srv-modify-few.xml [new file with mode: 0644]
tests/networkxml2xmlupdatetest.c

index 3c19ff4ca56b4efbfa8614d9abcbeb4d879fc905..8e7a739d788f7fa8962be98f6a61c04672027120 100644 (file)
@@ -3257,12 +3257,6 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def,
                   command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST);
     int foundCt = 0;
 
-    if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
-        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-                       _("DNS SRV records cannot be modified, only added or deleted"));
-        goto cleanup;
-    }
-
     if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "srv") < 0)
         goto cleanup;
 
@@ -3312,6 +3306,27 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def,
         virNetworkDNSSrvDefClear(&dns->srvs[foundIdx]);
         VIR_DELETE_ELEMENT(dns->srvs, foundIdx, dns->nsrvs);
 
+    } else if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
+
+        if (foundCt == 0) {
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                           _("couldn't locate a matching DNS SRV record in network %1$s"),
+                           def->name);
+            goto cleanup;
+        }
+
+        if (foundCt > 1) {
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                           _("multiple DNS SRV records matching all specified fields were found in network %1$s"),
+                           def->name);
+            goto cleanup;
+        }
+
+        virNetworkDNSSrvDefClear(&dns->srvs[foundIdx]);
+
+        memcpy(&dns->srvs[foundIdx], &srv, sizeof(virNetworkDNSSrvDef));
+        memset(&srv, 0, sizeof(virNetworkDNSSrvDef));
+
     } else {
         virNetworkDefUpdateUnknownCommand(command);
         goto cleanup;
diff --git a/tests/networkxml2xmlupdatein/srv-not-existing.xml b/tests/networkxml2xmlupdatein/srv-not-existing.xml
new file mode 100644 (file)
index 0000000..401e14c
--- /dev/null
@@ -0,0 +1 @@
+<srv service='name' protocol='tcp' domain='unknown-domain' target='.' port='666' priority='99' weight='10'/>
diff --git a/tests/networkxml2xmlupdatein/srv-record-modify-few.xml b/tests/networkxml2xmlupdatein/srv-record-modify-few.xml
new file mode 100644 (file)
index 0000000..88ec1b9
--- /dev/null
@@ -0,0 +1 @@
+<srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1221' priority='42' weight='69'/>
diff --git a/tests/networkxml2xmlupdateout/nat-network-dns-srv-modify-few.xml b/tests/networkxml2xmlupdateout/nat-network-dns-srv-modify-few.xml
new file mode 100644 (file)
index 0000000..a7e5fcf
--- /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>
+    <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1221' priority='42' weight='69'/>
+  </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 383cbf85ce35b4c2ad0abbc55c99c52a53a4be8f..59e6ce98e563865229388cb25d63d11562ca6adc 100644 (file)
@@ -328,7 +328,6 @@ mymain(void)
             "nat-network-dns-srv-record",
             "nat-network-dns-srv-records",
             VIR_NETWORK_UPDATE_COMMAND_ADD_LAST);
-
     DO_TEST_FAIL("delete-missing-srv-record-service",
                  "srv-record-service",
                  "nat-network",
@@ -351,6 +350,15 @@ mymain(void)
             "nat-network-dns-srv-record",
             "nat-network",
             VIR_NETWORK_UPDATE_COMMAND_DELETE);
+    DO_TEST("modify-srv-record-protocol",
+            "srv-record-modify-few",
+            "nat-network-dns-srv-record",
+            "nat-network-dns-srv-modify-few",
+            VIR_NETWORK_UPDATE_COMMAND_MODIFY);
+    DO_TEST_FAIL("modify-not-existing-srv-record",
+                 "srv-not-existing",
+                 "nat-network-dns-srv-record",
+                 VIR_NETWORK_UPDATE_COMMAND_MODIFY);
 
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;