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 "storage_conf.h"
|
||||||
|
|
||||||
|
# include "capabilities.h"
|
||||||
|
|
||||||
typedef struct _virStoragePoolObj virStoragePoolObj;
|
typedef struct _virStoragePoolObj virStoragePoolObj;
|
||||||
typedef virStoragePoolObj *virStoragePoolObjPtr;
|
typedef virStoragePoolObj *virStoragePoolObjPtr;
|
||||||
|
|
||||||
@ -45,6 +47,9 @@ struct _virStorageDriverState {
|
|||||||
|
|
||||||
/* Immutable pointer, self-locking APIs */
|
/* Immutable pointer, self-locking APIs */
|
||||||
virObjectEventStatePtr storageEventState;
|
virObjectEventStatePtr storageEventState;
|
||||||
|
|
||||||
|
/* Immutable pointer, read only after initialized */
|
||||||
|
virCapsPtr caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef bool
|
typedef bool
|
||||||
|
@ -182,3 +182,19 @@ virStorageBackendForType(int type)
|
|||||||
type, NULLSTR(virStoragePoolTypeToString(type)));
|
type, NULLSTR(virStoragePoolTypeToString(type)));
|
||||||
return NULL;
|
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);
|
int virStorageBackendRegister(virStorageBackendPtr backend);
|
||||||
|
|
||||||
|
virCapsPtr
|
||||||
|
virStorageBackendGetCapabilities(void);
|
||||||
|
|
||||||
#endif /* LIBVIRT_STORAGE_BACKEND_H */
|
#endif /* LIBVIRT_STORAGE_BACKEND_H */
|
||||||
|
@ -298,6 +298,12 @@ storageStateInitialize(bool privileged,
|
|||||||
|
|
||||||
driver->storageEventState = virObjectEventStateNew();
|
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();
|
storageDriverUnlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -346,6 +352,7 @@ storageStateCleanup(void)
|
|||||||
|
|
||||||
storageDriverLock();
|
storageDriverLock();
|
||||||
|
|
||||||
|
virObjectUnref(driver->caps);
|
||||||
virObjectUnref(driver->storageEventState);
|
virObjectUnref(driver->storageEventState);
|
||||||
|
|
||||||
/* free inactive pools */
|
/* free inactive pools */
|
||||||
@ -555,6 +562,18 @@ storageConnectListStoragePools(virConnectPtr conn,
|
|||||||
names, maxnames);
|
names, maxnames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
storageConnectGetCapabilities(virConnectPtr conn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return virCapabilitiesFormatXML(driver->caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
storageConnectNumOfDefinedStoragePools(virConnectPtr conn)
|
storageConnectNumOfDefinedStoragePools(virConnectPtr conn)
|
||||||
{
|
{
|
||||||
@ -2805,6 +2824,7 @@ static virHypervisorDriver storageHypervisorDriver = {
|
|||||||
.connectIsEncrypted = storageConnectIsEncrypted, /* 4.1.0 */
|
.connectIsEncrypted = storageConnectIsEncrypted, /* 4.1.0 */
|
||||||
.connectIsSecure = storageConnectIsSecure, /* 4.1.0 */
|
.connectIsSecure = storageConnectIsSecure, /* 4.1.0 */
|
||||||
.connectIsAlive = storageConnectIsAlive, /* 4.1.0 */
|
.connectIsAlive = storageConnectIsAlive, /* 4.1.0 */
|
||||||
|
.connectGetCapabilities = storageConnectGetCapabilities, /* 5.2.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virConnectDriver storageConnectDriver = {
|
static virConnectDriver storageConnectDriver = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user