File libvirt-rbd-support-namespace.patch of Package libvirt

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index 0000ebbd07..b12cd26b95 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -891,6 +891,9 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src,
     g_autoptr(virJSONValue) authmodes = NULL;
     g_autoptr(virJSONValue) mode = NULL;
     const char *keysecret = NULL;
+    char *namespace = NULL;
+    char *image = NULL;
+    char *p;
 
     if (src->nhosts > 0 &&
         !(servers = qemuBlockStorageSourceBuildHostsJSONInetSocketAddress(src)))
@@ -911,18 +914,28 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src,
             return NULL;
     }
 
+    if ((p = strchr(src->path, '/'))) {
+        namespace = g_strndup(src->path, p - src->path);
+        image = g_strdup(p + 1);
+    } else {
+        namespace = g_strdup("");
+        image = g_strdup(src->path);
+    }
+
     if (virJSONValueObjectCreate(&ret,
                                  "s:pool", src->volume,
-                                 "s:image", src->path,
+                                 "s:namespace", namespace,
+                                 "s:image", image,
                                  "S:snapshot", src->snapshot,
                                  "S:conf", src->configFile,
                                  "A:server", &servers,
                                  "S:user", username,
                                  "A:auth-client-required", &authmodes,
-                                 "S:key-secret", keysecret,
-                                 NULL) < 0)
-        return NULL;
-
+                                 "S:key-secret", keysecret, NULL) < 0) {
+        ret = NULL;
+    }
+    g_free(image);
+    g_free(namespace);
     return ret;
 }
 
diff --git a/src/storage_file/storage_source_backingstore.c b/src/storage_file/storage_source_backingstore.c
index 5e2db3d390..8f445c352a 100644
--- a/src/storage_file/storage_source_backingstore.c
+++ b/src/storage_file/storage_source_backingstore.c
@@ -944,12 +944,14 @@ virStorageSourceParseBackingJSONRBD(virStorageSourcePtr src,
 {
     const char *filename;
     const char *pool = virJSONValueObjectGetString(json, "pool");
+    const char *namespace = virJSONValueObjectGetString(json, "namespace");
     const char *image = virJSONValueObjectGetString(json, "image");
     const char *conf = virJSONValueObjectGetString(json, "conf");
     const char *snapshot = virJSONValueObjectGetString(json, "snapshot");
     virJSONValuePtr servers = virJSONValueObjectGetArray(json, "server");
     size_t nservers;
     size_t i;
+    char *namespaced_image;
 
     src->type = VIR_STORAGE_TYPE_NETWORK;
     src->protocol = VIR_STORAGE_NET_PROTOCOL_RBD;
@@ -965,8 +967,14 @@ virStorageSourceParseBackingJSONRBD(virStorageSourcePtr src,
         return -1;
     }
 
+    if (namespace == NULL || STREQ(namespace, "")) {
+        namespaced_image = g_strdup(image);
+    } else {
+        namespaced_image = g_strdup_printf("%s/%s", namespace, image);
+    }
+
     src->volume = g_strdup(pool);
-    src->path = g_strdup(image);
+    src->path = namespaced_image;
     src->snapshot = g_strdup(snapshot);
     src->configFile = g_strdup(conf);
 
diff --git a/tests/qemublocktestdata/imagecreate/network-rbd-qcow2.json b/tests/qemublocktestdata/imagecreate/network-rbd-qcow2.json
index 67e2679dae..a05434ab2e 100644
--- a/tests/qemublocktestdata/imagecreate/network-rbd-qcow2.json
+++ b/tests/qemublocktestdata/imagecreate/network-rbd-qcow2.json
@@ -3,6 +3,7 @@ protocol:
   "driver": "rbd",
   "location": {
     "pool": "asdf",
+    "namespace": "",
     "image": "i.qcow2",
     "server": [
       {
diff --git a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe-srconly.json b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe-srconly.json
index 0fb0b8eff9..eff6985fb4 100644
--- a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe-srconly.json
+++ b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe-srconly.json
@@ -3,6 +3,7 @@
   {
     "driver": "rbd",
     "pool": "rbdpool",
+    "namespace": "",
     "image": "rbdimg",
     "server": [
       {
@@ -19,6 +20,7 @@
   json:{"file":{
     "driver": "rbd",
     "pool": "rbdpool",
+    "namespace": "",
     "image": "rbdimg",
     "server": [
       {
diff --git a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe.json b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe.json
index 9ee18dba51..e7723ee8e8 100644
--- a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe.json
+++ b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-cache-unsafe.json
@@ -12,6 +12,7 @@
 {
   "driver": "rbd",
   "pool": "rbdpool",
+  "namespace": "",
   "image": "rbdimg",
   "server": [
     {
diff --git a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth-srconly.json b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth-srconly.json
index 777a372471..7e1383ee2a 100644
--- a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth-srconly.json
+++ b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth-srconly.json
@@ -3,6 +3,7 @@
   {
     "driver": "rbd",
     "pool": "rbdpool",
+    "namespace": "",
     "image": "rbdimg",
     "server": [
       {
@@ -19,6 +20,7 @@
   json:{"file":{
     "driver": "rbd",
     "pool": "rbdpool",
+    "namespace": "",
     "image": "rbdimg",
     "server": [
       {
diff --git a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth.json b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth.json
index fb19641982..c6458896d8 100644
--- a/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth.json
+++ b/tests/qemublocktestdata/xml2json/network-qcow2-backing-chain-encryption_auth.json
@@ -12,6 +12,7 @@
 {
   "driver": "rbd",
   "pool": "rbdpool",
+  "namespace": "",
   "image": "rbdimg",
   "server": [
     {
diff --git a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args
index 927b338380..adca3bc8d1 100644
--- a/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-latest.args
@@ -85,7 +85,7 @@ id=virtio-disk2 \
 -object secret,id=libvirt-14-storage-auth-secret0,\
 data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
 keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\
 "auth-client-required":["cephx","none"],\
diff --git a/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args
index ff63722cb6..68153fbc99 100644
--- a/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/disk-network-rbd.x86_64-latest.args
@@ -29,7 +29,7 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
 -no-acpi \
 -boot strict=on \
 -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],\
 "node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \
@@ -37,13 +37,13 @@ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
 "file":"libvirt-6-storage"}' \
 -device virtio-blk-pci,bus=pci.0,addr=0x2,drive=libvirt-6-format,\
 id=virtio-disk0,bootindex=1 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"asdf",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image","snapshot":"asdf",\
 "node-name":"libvirt-5-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-5-format","read-only":false,"driver":"raw",\
 "file":"libvirt-5-storage"}' \
 -device virtio-blk-pci,bus=pci.0,addr=0x3,drive=libvirt-5-format,\
 id=virtio-disk1 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"foo",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image","snapshot":"foo",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],\
 "node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \
@@ -51,7 +51,7 @@ id=virtio-disk1 \
 "file":"libvirt-4-storage"}' \
 -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=libvirt-4-format,\
 id=virtio-disk2 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image","snapshot":"foo",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image","snapshot":"foo",\
 "conf":"/blah/test.conf","node-name":"libvirt-3-storage","auto-read-only":true,\
 "discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw",\
@@ -61,7 +61,7 @@ id=virtio-disk3 \
 -object secret,id=libvirt-2-storage-auth-secret0,\
 data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
 keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\
 "auth-client-required":["cephx","none"],\
@@ -71,7 +71,7 @@ keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
 "file":"libvirt-2-storage"}' \
 -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=libvirt-2-format,\
 id=virtio-disk4 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"::1","port":"6321"},{"host":"example.org","port":"6789"},\
 {"host":"ffff:1234:567:abc::0f","port":"6322"},\
 {"host":"2001:db8::ff00:42:8329","port":"6322"}],\
diff --git a/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args
index 0efbc386c3..73c01bc2bc 100644
--- a/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/disk-network-source-auth.x86_64-latest.args
@@ -43,7 +43,7 @@ id=virtio-disk0,bootindex=1 \
 -object secret,id=libvirt-2-storage-auth-secret0,\
 data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
 keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\
 "auth-client-required":["cephx","none"],\
@@ -56,7 +56,7 @@ id=virtio-disk1 \
 -object secret,id=libvirt-1-storage-auth-secret0,\
 data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
 keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image2",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image2",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],"user":"myname",\
 "auth-client-required":["cephx","none"],\
diff --git a/tests/qemuxml2argvdata/luks-disks-source-qcow2.x86_64-latest.args b/tests/qemuxml2argvdata/luks-disks-source-qcow2.x86_64-latest.args
index c78d138fd9..7b5b5e32a4 100644
--- a/tests/qemuxml2argvdata/luks-disks-source-qcow2.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/luks-disks-source-qcow2.x86_64-latest.args
@@ -78,7 +78,7 @@ id=virtio-disk3 \
 -object secret,id=libvirt-3-format-encryption-secret0,\
 data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
 keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--blockdev '{"driver":"rbd","pool":"pool","image":"image",\
+-blockdev '{"driver":"rbd","pool":"pool","namespace":"","image":"image",\
 "server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\
 "port":"6322"},{"host":"mon3.example.org","port":"6322"}],\
 "node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap"}' \
openSUSE Build Service is sponsored by