[libvirt] [PATCH] qemu: escape ipv6 for rbd network disk hosts
Josh Durgin
josh.durgin at inktank.com
Fri Jan 25 03:07:49 UTC 2013
On 01/23/2013 08:20 PM, Osier Yang wrote:
> On 2013年01月24日 10:15, Josh Durgin wrote:
>> 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 qemu.
>>
>> Escape these colons, and enclose the IPv6 address in square brackets
>> if a port is specified.
>
> Actually the IPv6 address is always enclosed in the code.
Indeed.
>>
>> Signed-off-by: Josh Durgin<josh.durgin at inktank.com>
>> ---
>> docs/schemas/domaincommon.rng | 5 ++-
>> src/qemu/qemu_command.c | 34
>> +++++++++++++++----
>> tests/qemuargv2xmltest.c | 1 +
>> .../qemuxml2argv-disk-drive-network-rbd-ipv6.args | 9 +++++
>> .../qemuxml2argv-disk-drive-network-rbd-ipv6.xml | 36
>> ++++++++++++++++++++
>> tests/qemuxml2argvtest.c | 2 +
>> 6 files changed, 79 insertions(+), 8 deletions(-)
>> create mode 100644
>> tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.args
>> create mode 100644
>> tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.xml
>>
>> diff --git a/docs/schemas/domaincommon.rng
>> b/docs/schemas/domaincommon.rng
>> index 7f3320e..273e54c 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -1099,7 +1099,10 @@
>> </attribute>
>> </optional>
>> <attribute name="name">
>> -<ref name="dnsName"/>
>> +<choice>
>> +<ref name="dnsName"/>
>> +<ref name="ipAddr"/>
>> +</choice>
>> </attribute>
>> <attribute name="port">
>> <ref name="unsignedInt"/>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 02fe015..dfc042b 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -34,6 +34,7 @@
>> #include "virerror.h"
>> #include "virutil.h"
>> #include "virfile.h"
>> +#include "virstring.h"
>> #include "viruuid.h"
>> #include "c-ctype.h"
>> #include "domain_nwfilter.h"
>> @@ -1937,13 +1938,16 @@ qemuBuildRBDString(virConnectPtr conn,
>> if (i) {
>> virBufferAddLit(opt, "\\;");
>> }
>> - if (disk->hosts[i].port) {
>> - virBufferAsprintf(opt, "%s\\:%s",
>> - disk->hosts[i].name,
>> - disk->hosts[i].port);
>> +
>> + /* assume host containing : is ipv6 */
>> + if (strchr(disk->hosts[i].name, ':')) {
>> + virBufferEscape(opt, '\\', ":", "[%s]",
>> disk->hosts[i].name);
>> } else {
>> virBufferAsprintf(opt, "%s", disk->hosts[i].name);
>> }
>> + if (disk->hosts[i].port) {
>> + virBufferAsprintf(opt, "\\:%s", disk->hosts[i].port);
>> + }
>> }
>> }
>>
>> @@ -1961,15 +1965,26 @@ error:
>> static int qemuAddRBDHost(virDomainDiskDefPtr disk, char *hostport)
>> {
>> char *port;
>> + size_t skip;
>> + char **parts;
>>
>> disk->nhosts++;
>> if (VIR_REALLOC_N(disk->hosts, disk->nhosts)< 0)
>> goto no_memory;
>>
>> - port = strstr(hostport, "\\:");
>> + if (strchr(hostport, ']')) {
>> + /* ipv6, strip brackets */10000 / 384 =
>> + hostport += 1;
>> + port = strstr(hostport, "]\\:");
>
> This can be simplified as (no need to get the same address
> twice):
>
> if ((port = strchr(hostport, ']'))) {
> hostport += 1;
> skip = 3;
> } else {
> ...
> }
>
> Others looks pretty neat. ACK.
Good point, I'd forgotten that the port is mandatory when a name is
specified. Sending a v2.
Thanks!
Josh
More information about the libvir-list
mailing list