]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: escape ipv6 for ceph mon hosts to librados
authorYi Li <yili@winhong.com>
Sun, 28 Apr 2019 02:29:53 +0000 (10:29 +0800)
committerJán Tomko <jtomko@redhat.com>
Tue, 18 Jun 2019 15:14:17 +0000 (17:14 +0200)
Hosts for rbd are ceph monitor daemons. These have fixed IP addresses,
so they are often referenced by IP rather than hostname for
convenience, or to avoid relying on DNS. Using IPv4 addresses as the
host name works already, but IPv6 addresses require rbd-specific
escaping because the colon is used as an option separator in the
string passed to librados.

Escape these colons, and enclose the IPv6 address in square brackets
so it is distinguished from the port, which is currently mandatory.

Signed-off-by: Yi Li <yili@winhong.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
docs/schemas/storagepool.rng
src/storage/storage_backend_rbd.c
tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml [new file with mode: 0644]
tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml [new file with mode: 0644]
tests/storagepoolxml2xmltest.c

index 3ca8e790ea60419fff40b62a5acedba881ce5665..976a02baeb66092e0071ab2666855bca07cd5140 100644 (file)
     <oneOrMore>
       <element name='host'>
         <attribute name='name'>
-          <text/>
+          <choice>
+            <ref name="dnsName"/>
+            <ref name="ipAddr"/>
+          </choice>
         </attribute>
         <optional>
           <attribute name='port'>
index f8c968e682ae3c2d25105fa2166d13e1caa49489..bd6e3d509d2b21fc3f7e6c67975652955102669d 100644 (file)
@@ -261,6 +261,7 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     VIR_DEBUG("Found %zu RADOS cluster monitors in the pool configuration",
               source->nhost);
 
+    /* combine host and port into portal */
     for (i = 0; i < source->nhost; i++) {
         if (source->hosts[i].name != NULL &&
             !source->hosts[i].port) {
@@ -268,7 +269,15 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
                               source->hosts[i].name);
         } else if (source->hosts[i].name != NULL &&
             source->hosts[i].port) {
-            virBufferAsprintf(&mon_host, "%s:%d,",
+            const char *incFormat;
+            if (virSocketAddrNumericFamily(source->hosts[i].name) == AF_INET6) {
+                /* IPv6 address must be escaped in brackets on the cmd line */
+                incFormat = "[%s]:%d";
+            } else {
+                /* listenAddress is a hostname or IPv4 */
+                incFormat = "%s:%d";
+            }
+            virBufferAsprintf(&mon_host, incFormat,
                               source->hosts[i].name,
                               source->hosts[i].port);
         } else {
diff --git a/tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml b/tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml
new file mode 100644 (file)
index 0000000..0744b33
--- /dev/null
@@ -0,0 +1,13 @@
+<pool type='rbd'>
+  <name>ceph</name>
+  <uuid>47c1faee-0207-e741-f5ae-d9b019b98fe2</uuid>
+  <source>
+    <name>rbd</name>
+    <host name='localhost' port='6789'/>
+    <host name='localhost' port='6790'/>
+    <host name='2205::192:168:205:141' port='6789'/>
+    <auth username='admin' type='ceph'>
+      <secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
+    </auth>
+  </source>
+</pool>
diff --git a/tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml b/tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml
new file mode 100644 (file)
index 0000000..cc2a379
--- /dev/null
@@ -0,0 +1,16 @@
+<pool type='rbd'>
+  <name>ceph</name>
+  <uuid>47c1faee-0207-e741-f5ae-d9b019b98fe2</uuid>
+  <capacity unit='bytes'>0</capacity>
+  <allocation unit='bytes'>0</allocation>
+  <available unit='bytes'>0</available>
+  <source>
+    <host name='localhost' port='6789'/>
+    <host name='localhost' port='6790'/>
+    <host name='2205::192:168:205:141' port='6789'/>
+    <name>rbd</name>
+    <auth type='ceph' username='admin'>
+      <secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
+    </auth>
+  </source>
+</pool>
index 2ae514f346313047eb15c3c61b445682c7dbbe7d..b6f4cb422642fcac2ccd3b8a2f2e20c27e124170 100644 (file)
@@ -95,6 +95,7 @@ mymain(void)
     DO_TEST("pool-zfs-sourcedev");
     DO_TEST("pool-rbd");
 #ifdef WITH_STORAGE_RBD
+    DO_TEST("pool-rbd-ipv6");
     DO_TEST("pool-rbd-refresh-volume-allocation");
     DO_TEST("pool-rbd-ns-configopts");
 #endif