tests: drivermodule: Make sure that all compiled storage backends can be loaded

Add a new storage driver registration function that will force the
backend code to fail if any of the storage backend modules can't be
loaded. This will make sure that they work and are present.
This commit is contained in:
Peter Krempa 2017-02-07 18:58:39 +01:00
parent 0a6d3e51b4
commit 93a3f516ee
6 changed files with 33 additions and 9 deletions

View File

@ -87,7 +87,8 @@ static size_t virStorageFileBackendsCount;
static int
virStorageDriverLoadBackendModule(const char *name,
const char *regfunc)
const char *regfunc,
bool forceload)
{
char *modfile = NULL;
int ret;
@ -100,7 +101,14 @@ virStorageDriverLoadBackendModule(const char *name,
"LIBVIRT_STORAGE_BACKEND_DIR")))
return 1;
ret = virDriverLoadModuleFull(modfile, regfunc, NULL);
if ((ret = virDriverLoadModuleFull(modfile, regfunc, NULL)) != 0) {
if (forceload) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("failed to load storage backend module '%s'"),
name);
ret = -1;
}
}
VIR_FREE(modfile);
@ -109,7 +117,7 @@ virStorageDriverLoadBackendModule(const char *name,
# define VIR_STORAGE_BACKEND_REGISTER(func, module) \
if (virStorageDriverLoadBackendModule(module, #func) < 0) \
if (virStorageDriverLoadBackendModule(module, #func, allbackends) < 0) \
return -1
#else
# define VIR_STORAGE_BACKEND_REGISTER(func, module) \
@ -118,7 +126,7 @@ virStorageDriverLoadBackendModule(const char *name,
#endif
int
virStorageBackendDriversRegister(void)
virStorageBackendDriversRegister(bool allbackends ATTRIBUTE_UNUSED)
{
#if WITH_STORAGE_DIR || WITH_STORAGE_FS
VIR_STORAGE_BACKEND_REGISTER(virStorageBackendFsRegister, "fs");

View File

@ -198,7 +198,7 @@ struct _virStorageFileBackend {
virStorageFileBackendChown storageFileChown;
};
int virStorageBackendDriversRegister(void);
int virStorageBackendDriversRegister(bool allmodules);
int virStorageBackendRegister(virStorageBackendPtr backend);
int virStorageBackendFileRegister(virStorageFileBackendPtr backend);

View File

@ -2838,9 +2838,10 @@ static virStateDriver stateDriver = {
.stateReload = storageStateReload,
};
int storageRegister(void)
static int
storageRegisterFull(bool allbackends)
{
if (virStorageBackendDriversRegister() < 0)
if (virStorageBackendDriversRegister(allbackends) < 0)
return -1;
if (virSetSharedStorageDriver(&storageDriver) < 0)
return -1;
@ -2850,6 +2851,20 @@ int storageRegister(void)
}
int
storageRegister(void)
{
return storageRegisterFull(false);
}
int
storageRegisterAll(void)
{
return storageRegisterFull(true);
}
/* ----------- file handlers cooperating with storage driver --------------- */
static bool
virStorageFileIsInitialized(const virStorageSource *src)

View File

@ -70,5 +70,6 @@ char *virStoragePoolObjBuildTempFilePath(virStoragePoolObjPtr pool,
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int storageRegister(void);
int storageRegisterAll(void);
#endif /* __VIR_STORAGE_DRIVER_H__ */

View File

@ -71,7 +71,7 @@ mymain(void)
TEST("interface");
#endif
#ifdef WITH_STORAGE
TEST("storage");
TEST_FULL("storage", "storageRegisterAll");
#endif
#ifdef WITH_NODE_DEVICES
TEST("nodedev");

View File

@ -732,7 +732,7 @@ mymain(void)
virStorageSourcePtr chain2; /* short for chain->backingStore */
virStorageSourcePtr chain3; /* short for chain2->backingStore */
if (virStorageBackendDriversRegister() < 0)
if (virStorageBackendDriversRegister(false) < 0)
return -1;
/* Prep some files with qemu-img; if that is not found on PATH, or