[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] [PATCH 3/5] rbd: support usernames, for cephx authentication



---
 generator/actions.ml |   13 +++++++------
 src/drives.c         |   18 +++++++++++-------
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/generator/actions.ml b/generator/actions.ml
index 0bb04be..daea6b6 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -1352,6 +1352,7 @@ See also: L<guestfs(3)/NETWORK BLOCK DEVICE>.
 
 Connect to the Ceph (librbd/RBD) server.
 The C<server> parameter must also be supplied - see below.
+The C<username> parameter may be supplied.  See below.
 
 See also: L<guestfs(3)/CEPH>.
 
@@ -1401,13 +1402,13 @@ for the protocol is used (see C</etc/services>).
 
 =item C<username>
 
-For the C<ssh> protocol only, this specifies the remote username.
+For the C<ssh> and C<rbd> protocols only, this specifies the remote username.
 
-If not given, then the local username is used.  But note this sometimes
-may give unexpected results, for example if using the libvirt backend
-and if the libvirt backend is configured to start the qemu appliance
-as a special user such as C<qemu.qemu>.  If in doubt, specify the
-remote username you want.
+If not given, then the local username is used for C<ssh>, and 'admin' is used
+for C<rbd>.  But note this sometimes may give unexpected results, for example
+if using the libvirt backend and if the libvirt backend is configured to start
+the qemu appliance as a special user such as C<qemu.qemu>.  If in doubt,
+specify the remote username you want.
 
 =back" };
 
diff --git a/src/drives.c b/src/drives.c
index 0a6d956..a510e1e 100644
--- a/src/drives.c
+++ b/src/drives.c
@@ -221,11 +221,6 @@ create_drive_rbd (guestfs_h *g,
 {
   size_t i;
 
-  if (username != NULL) {
-    error (g, _("rbd: you cannot specify a username with this protocol"));
-    return NULL;
-  }
-
   if (nr_servers == 0) {
     error (g, _("rbd: you must specify one or more servers"));
     return NULL;
@@ -1088,7 +1083,8 @@ 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;
+    CLEANUP_FREE char *mon_host = NULL, *username = NULL;
+    char *auth;
     size_t n = 0;
     for (int i = 0; i < src->nr_servers; i++) {
       n += strlen (src->servers[i].u.hostname);
@@ -1115,7 +1111,15 @@ guestfs___drive_source_qemu_param (guestfs_h *g, const struct drive_source *src)
     }
     mon_host[n] = '\0';
 
-    return safe_asprintf (g, "rbd:%s:mon_host=%s", src->u.exportname, mon_host);
+    if (src->username)
+        username = safe_asprintf (g, ":id=%s", src->username);
+    if (username)
+        auth = ":auth_supported=cephx\\;none";
+    else
+        auth = ":auth_supported=none";
+
+    return safe_asprintf (g, "rbd:%s:mon_host=%s%s%s", src->u.exportname, mon_host,
+            username ? username : "", auth);
   }
 
   case drive_protocol_sheepdog:
-- 
1.7.9.5


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]