https://bugzilla.redhat.com/show_bug.cgi?id=1581670
During storage driver backend initialization, let's save
which backends are available in the storage pool capabilities.
In order to format those, we need add a connectGetCapabilities
processor to the storageHypervisorDriver. This allows a storage
connection, such as "storage:///system" to find the API and
format the results, such as:
virsh -c storage:///system capabilities
<capabilities>
<pool>
<enum name='type'>
<value>dir</value>
<value>fs</value>
<value>netfs</value>
<value>logical</value>
<value>iscsi</value>
<value>iscsi-direct</value>
<value>scsi</value>
<value>mpath</value>
<value>disk</value>
<value>rbd</value>
<value>sheepdog</value>
<value>gluster</value>
<value>zfs</value>
</enum>
</pool>
</capabilities>
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/conf/virstorageobj.h | 5 +++++
src/storage/storage_backend.c | 16 ++++++++++++++++
src/storage/storage_backend.h | 3 +++
src/storage/storage_driver.c | 20 ++++++++++++++++++++
4 files changed, 44 insertions(+)
diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h
index 1106aa71bd..c41d4c16ad 100644
--- a/src/conf/virstorageobj.h
+++ b/src/conf/virstorageobj.h
@@ -24,6 +24,8 @@
# include "storage_conf.h"
+# include "capabilities.h"
+
typedef struct _virStoragePoolObj virStoragePoolObj;
typedef virStoragePoolObj *virStoragePoolObjPtr;
@@ -45,6 +47,9 @@ struct _virStorageDriverState {
/* Immutable pointer, self-locking APIs */
virObjectEventStatePtr storageEventState;
+
+ /* Immutable pointer, read only after initialized */
+ virCapsPtr caps;
};
typedef bool
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index a54c338cf0..df37d94831 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -187,3 +187,19 @@ virStorageBackendForType(int type)
type, NULLSTR(virStoragePoolTypeToString(type)));
return NULL;
}
+
+
+virCapsPtr
+virStorageBackendGetCapabilities(void)
+{
+ virCapsPtr caps;
+ size_t i;
+
+ if (!(caps = virCapabilitiesNew(VIR_ARCH_NONE, false, false)))
+ return NULL;
+
+ for (i = 0; i < virStorageBackendsCount; i++)
+ virCapabilitiesAddStoragePool(caps, virStorageBackends[i]->type);
+
+ return caps;
+}
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index 2b178494ae..c670c66287 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -126,4 +126,7 @@ int virStorageBackendDriversRegister(bool allmodules);
int virStorageBackendRegister(virStorageBackendPtr backend);
+virCapsPtr
+virStorageBackendGetCapabilities(void);
+
#endif /* LIBVIRT_STORAGE_BACKEND_H */
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 34634e97d9..f2bc24370d 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -296,6 +296,12 @@ storageStateInitialize(bool privileged,
driver->storageEventState = virObjectEventStateNew();
+ /* Only one load of storage driver plus backends exists. Unlike
+ * domains where new binaries could change the capabilities. A
+ * new/changed backend requires a reinitialization. */
+ if (!(driver->caps = virStorageBackendGetCapabilities()))
+ goto error;
+
storageDriverUnlock();
return 0;
@@ -360,6 +366,7 @@ storageStateCleanup(void)
storageDriverLock();
+ virObjectUnref(driver->caps);
virObjectUnref(driver->storageEventState);
/* free inactive pools */
@@ -569,6 +576,18 @@ storageConnectListStoragePools(virConnectPtr conn,
names, maxnames);
}
+
+static char *
+storageConnectGetCapabilities(virConnectPtr conn)
+{
+
+ if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
+ return NULL;
+
+ return virCapabilitiesFormatXML(driver->caps);
+}
+
+
static int
storageConnectNumOfDefinedStoragePools(virConnectPtr conn)
{
@@ -2819,6 +2838,7 @@ static virHypervisorDriver storageHypervisorDriver = {
.connectIsEncrypted = storageConnectIsEncrypted, /* 4.1.0 */
.connectIsSecure = storageConnectIsSecure, /* 4.1.0 */
.connectIsAlive = storageConnectIsAlive, /* 4.1.0 */
+ .connectGetCapabilities = storageConnectGetCapabilities, /* 5.1.0 */
};
static virConnectDriver storageConnectDriver = {
--
2.20.1