]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: block: Add support for RBD authentication for blockdev
authorPeter Krempa <pkrempa@redhat.com>
Mon, 9 Jul 2018 14:05:16 +0000 (16:05 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 10 Jul 2018 11:37:51 +0000 (13:37 +0200)
To allow using -blockdev with RBD we need to support the recently added
RBD authentication.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_block.c
tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe.json
tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth.json

index 0ebf2d2aff40a6d79242ba3c552155434113c62c..7ad79c7e7d596bc5305c3d552c33af7987f4d220 100644 (file)
@@ -906,13 +906,33 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src)
     virJSONValuePtr servers = NULL;
     virJSONValuePtr ret = NULL;
     const char *username = NULL;
+    virJSONValuePtr authmodes = NULL;
+    virJSONValuePtr mode = NULL;
+    const char *keysecret = NULL;
 
     if (src->nhosts > 0 &&
         !(servers = qemuBlockStorageSourceBuildHostsJSONInetSocketAddress(src)))
         return NULL;
 
-    if (src->auth)
+    if (src->auth) {
         username = srcPriv->secinfo->s.aes.username;
+        keysecret = srcPriv->secinfo->s.aes.alias;
+        /* the auth modes are modelled after our old command line generator */
+        if (!(authmodes = virJSONValueNewArray()))
+            goto cleanup;
+
+        if (!(mode = virJSONValueNewString("cephx")) ||
+            virJSONValueArrayAppend(authmodes, mode) < 0)
+            goto cleanup;
+
+        mode = NULL;
+
+        if (!(mode = virJSONValueNewString("none")) ||
+            virJSONValueArrayAppend(authmodes, mode) < 0)
+            goto cleanup;
+
+        mode = NULL;
+    }
 
     if (virJSONValueObjectCreate(&ret,
                                  "s:driver", "rbd",
@@ -922,10 +942,14 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src)
                                  "S:conf", src->configFile,
                                  "A:server", &servers,
                                  "S:user", username,
+                                 "A:auth-client-required", &authmodes,
+                                 "S:key-secret", keysecret,
                                  NULL) < 0)
         goto cleanup;
 
  cleanup:
+    virJSONValueFree(authmodes);
+    virJSONValueFree(mode);
     virJSONValueFree(servers);
     return ret;
 }
index 80a694eee442625550b8fead99badcb6a964ef68..e66f62d24b792964624b84731e468c08d0a7b0f4 100644 (file)
     }
   ],
   "user": "testuser-rbd",
+  "auth-client-required": [
+    "cephx",
+    "none"
+  ],
+  "key-secret": "node-a-s-secalias",
   "node-name": "node-a-s",
   "cache": {
     "direct": false,
index fdb6f2ab1af6c68ef9aae673b3e9b9703ca86a6b..921cb3ea6957112d5fe36d9897becc4181dc07ed 100644 (file)
     }
   ],
   "user": "testuser-rbd",
+  "auth-client-required": [
+    "cephx",
+    "none"
+  ],
+  "key-secret": "node-a-s-secalias",
   "node-name": "node-a-s",
   "read-only": false,
   "discard": "unmap"