From 91274da7ce184055f0c5c5581e5862cfb578fe6b Mon Sep 17 00:00:00 2001 From: Yi Li Date: Thu, 25 Apr 2019 13:06:28 +0800 Subject: [PATCH] storage: escape ipv6 for ceph mon hosts to librados 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 --- docs/schemas/storagepool.rng | 5 ++++- src/storage/storage_backend_rbd.c | 13 ++++++++++--- tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml | 13 +++++++++++++ tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml | 16 ++++++++++++++++ tests/storagepoolxml2xmltest.c | 1 + 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml create mode 100644 tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng index 3ca8e79..976a02b 100644 --- a/docs/schemas/storagepool.rng +++ b/docs/schemas/storagepool.rng @@ -305,7 +305,10 @@ - + + + + diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c index f8c968e..3056563 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -268,9 +268,16 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, source->hosts[i].name); } else if (source->hosts[i].name != NULL && source->hosts[i].port) { - virBufferAsprintf(&mon_host, "%s:%d,", - source->hosts[i].name, - source->hosts[i].port); + /* assume host containing : is ipv6 */ + if (strchr(source->hosts[i].name, ':')) { + virBufferAsprintf(&mon_host, "[%s]:%d,", + source->hosts[i].name, + source->hosts[i].port); + } else { + virBufferAsprintf(&mon_host, "%s:%d,", + source->hosts[i].name, + source->hosts[i].port); + } } else { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("received malformed monitor, check the XML definition")); diff --git a/tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml b/tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml new file mode 100644 index 0000000..0744b33 --- /dev/null +++ b/tests/storagepoolxml2xmlin/pool-rbd-ipv6.xml @@ -0,0 +1,13 @@ + + ceph + 47c1faee-0207-e741-f5ae-d9b019b98fe2 + + rbd + + + + + + + + diff --git a/tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml b/tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml new file mode 100644 index 0000000..cc2a379 --- /dev/null +++ b/tests/storagepoolxml2xmlout/pool-rbd-ipv6.xml @@ -0,0 +1,16 @@ + + ceph + 47c1faee-0207-e741-f5ae-d9b019b98fe2 + 0 + 0 + 0 + + + + + rbd + + + + + diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c index 2ae514f..b6f4cb4 100644 --- a/tests/storagepoolxml2xmltest.c +++ b/tests/storagepoolxml2xmltest.c @@ -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 -- 2.7.5