mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
storage: Process storage pool capabilities
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@redhat.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
05fe03505a
commit
642c06fd63
@ -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
|
||||
|
@ -182,3 +182,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;
|
||||
}
|
||||
|
@ -126,4 +126,7 @@ int virStorageBackendDriversRegister(bool allmodules);
|
||||
|
||||
int virStorageBackendRegister(virStorageBackendPtr backend);
|
||||
|
||||
virCapsPtr
|
||||
virStorageBackendGetCapabilities(void);
|
||||
|
||||
#endif /* LIBVIRT_STORAGE_BACKEND_H */
|
||||
|
@ -298,6 +298,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;
|
||||
@ -346,6 +352,7 @@ storageStateCleanup(void)
|
||||
|
||||
storageDriverLock();
|
||||
|
||||
virObjectUnref(driver->caps);
|
||||
virObjectUnref(driver->storageEventState);
|
||||
|
||||
/* free inactive pools */
|
||||
@ -555,6 +562,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)
|
||||
{
|
||||
@ -2805,6 +2824,7 @@ static virHypervisorDriver storageHypervisorDriver = {
|
||||
.connectIsEncrypted = storageConnectIsEncrypted, /* 4.1.0 */
|
||||
.connectIsSecure = storageConnectIsSecure, /* 4.1.0 */
|
||||
.connectIsAlive = storageConnectIsAlive, /* 4.1.0 */
|
||||
.connectGetCapabilities = storageConnectGetCapabilities, /* 5.2.0 */
|
||||
};
|
||||
|
||||
static virConnectDriver storageConnectDriver = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user