The path at the protocol level is:
pool/disk
(with no leading '/' character). This is now what you have to pass to
guestfs_add_drive_opts.
Also Ceph can be called with no explicit servers (it uses the contents
of /etc/ceph/ceph.conf instead). So allow zero servers to be used.
---
generator/actions.ml | 2 +-
src/drives.c | 9 ++-------
src/guestfs.pod | 2 +-
src/launch-direct.c | 10 +++++-----
tests/disks/test-qemu-drive.sh | 10 +++++++++-
5 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/generator/actions.ml b/generator/actions.ml
index d331988..fa1a2c5 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -1440,7 +1440,7 @@ is a list of server(s).
gluster Exactly one
iscsi Exactly one
nbd Exactly one
- rbd One or more
+ rbd Zero or more
sheepdog Zero or more
ssh Exactly one
diff --git a/src/drives.c b/src/drives.c
index 4f8a7c5..9646b08 100644
--- a/src/drives.c
+++ b/src/drives.c
@@ -323,11 +323,6 @@ create_drive_rbd (guestfs_h *g,
{
size_t i;
- if (nr_servers == 0) {
- error (g, _("rbd: you must specify one or more servers"));
- return NULL;
- }
-
for (i = 0; i < nr_servers; ++i) {
if (servers[i].transport != drive_transport_none &&
servers[i].transport != drive_transport_tcp) {
@@ -345,8 +340,8 @@ create_drive_rbd (guestfs_h *g,
return NULL;
}
- if (exportname[0] != '/') {
- error (g, _("rbd: image name must begin with a '/'"));
+ if (exportname[0] == '/') {
+ error (g, _("rbd: image name must not begin with a '/'"));
return NULL;
}
diff --git a/src/guestfs.pod b/src/guestfs.pod
index 1f0a324..292c97e 100644
--- a/src/guestfs.pod
+++ b/src/guestfs.pod
@@ -684,7 +684,7 @@ To do this, set the optional C<protocol> and C<server>
parameters of
L</guestfs_add_drive_opts> like this:
char **servers = { "ceph1.example.org:3000", /* ... */, NULL };
- guestfs_add_drive_opts (g, "/pool/image",
+ guestfs_add_drive_opts (g, "pool/image",
GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "rbd",
GUESTFS_ADD_DRIVE_OPTS_SERVER, servers,
diff --git a/src/launch-direct.c b/src/launch-direct.c
index c2a6885..6eaee63 100644
--- a/src/launch-direct.c
+++ b/src/launch-direct.c
@@ -1299,12 +1299,12 @@ guestfs___drive_source_qemu_param (guestfs_h *g, const struct
drive_source *src)
}
case drive_protocol_rbd: {
- /* build the list of all the mon hosts */
CLEANUP_FREE char *mon_host = NULL, *username = NULL, *secret = NULL;
const char *auth;
size_t n = 0;
size_t i, j;
+ /* build the list of all the mon hosts */
for (i = 0; i < src->nr_servers; i++) {
n += strlen (src->servers[i].u.hostname);
n += 8; /* for slashes, colons, & port numbers */
@@ -1340,10 +1340,10 @@ guestfs___drive_source_qemu_param (guestfs_h *g, const struct
drive_source *src)
else
auth = ":auth_supported=none";
- /* Skip the mandatory leading '/' character on exportname. */
- return safe_asprintf (g, "rbd:%s:mon_host=%s%s%s%s",
- &src->u.exportname[1],
- mon_host,
+ return safe_asprintf (g, "rbd:%s%s%s%s%s%s",
+ src->u.exportname,
+ src->nr_servers > 0 ? ":mon_host=" :
"",
+ src->nr_servers > 0 ? mon_host : "",
username ? username : "",
auth,
secret ? secret : "");
diff --git a/tests/disks/test-qemu-drive.sh b/tests/disks/test-qemu-drive.sh
index 3709c95..627d8e0 100755
--- a/tests/disks/test-qemu-drive.sh
+++ b/tests/disks/test-qemu-drive.sh
@@ -47,7 +47,7 @@ rm -f "$DEBUG_QEMU_FILE"
# Ceph (RBD).
$guestfish <<EOF ||:
- add "/abc-def/ghi-jkl" "format:raw" "protocol:rbd" \
+ add "abc-def/ghi-jkl" "format:raw" "protocol:rbd" \
"server:1.2.3.4:1234 1.2.3.5:1235 1.2.3.6:1236"
run
EOF
@@ -55,6 +55,14 @@ check_output
grep -sq -- '-drive
file=rbd:abc-def/ghi-jkl:mon_host=1.2.3.4\\:1234\\;1.2.3.5\\:1235\\;1.2.3.6\\:1236:auth_supported=none,'
"$DEBUG_QEMU_FILE" || fail
rm "$DEBUG_QEMU_FILE"
+$guestfish <<EOF ||:
+ add "abc-def/ghi-jkl" "format:raw" "protocol:rbd"
+ run
+EOF
+check_output
+grep -sq -- '-drive file=rbd:abc-def/ghi-jkl:auth_supported=none,'
"$DEBUG_QEMU_FILE" || fail
+rm "$DEBUG_QEMU_FILE"
+
# HTTP.
$guestfish <<EOF ||:
--
1.8.4.2