storage: Add connection for autostart storage pool

Add a privileged field to storageDriverState

Use the privileged value in order to generate a connection which could
be passed to the various storage backend drivers.

In particular, the iSCSI driver will need a connect in order to perform
pool authentication using the 'chap' secrets and the RBD driver utilizes
the connection during pool refresh for pools using 'ceph' secrets.

For now that connection will be to be to qemu driver until a mechanism
is devised to get a connection to just the secret driver without qemu.
This commit is contained in:
John Ferlan 2013-07-15 16:26:10 -04:00
parent c2257d2ef9
commit a873b496da
2 changed files with 17 additions and 4 deletions

View File

@ -354,6 +354,7 @@ struct _virStorageDriverState {
char *configDir; char *configDir;
char *autostartDir; char *autostartDir;
bool privileged;
}; };
typedef struct _virStoragePoolSourceList virStoragePoolSourceList; typedef struct _virStoragePoolSourceList virStoragePoolSourceList;

View File

@ -68,6 +68,14 @@ static void storageDriverUnlock(virStorageDriverStatePtr driver)
static void static void
storageDriverAutostart(virStorageDriverStatePtr driver) { storageDriverAutostart(virStorageDriverStatePtr driver) {
size_t i; size_t i;
virConnectPtr conn = NULL;
/* XXX Remove hardcoding of QEMU URI */
if (driverState->privileged)
conn = virConnectOpen("qemu:///system");
else
conn = virConnectOpen("qemu:///session");
/* Ignoring NULL conn - let backends decide */
for (i = 0; i < driver->pools.count; i++) { for (i = 0; i < driver->pools.count; i++) {
virStoragePoolObjPtr pool = driver->pools.objs[i]; virStoragePoolObjPtr pool = driver->pools.objs[i];
@ -82,7 +90,7 @@ storageDriverAutostart(virStorageDriverStatePtr driver) {
} }
if (backend->checkPool && if (backend->checkPool &&
backend->checkPool(NULL, pool, &started) < 0) { backend->checkPool(conn, pool, &started) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to initialize storage pool '%s': %s"), VIR_ERROR(_("Failed to initialize storage pool '%s': %s"),
pool->def->name, err ? err->message : pool->def->name, err ? err->message :
@ -95,7 +103,7 @@ storageDriverAutostart(virStorageDriverStatePtr driver) {
pool->autostart && pool->autostart &&
!virStoragePoolObjIsActive(pool)) { !virStoragePoolObjIsActive(pool)) {
if (backend->startPool && if (backend->startPool &&
backend->startPool(NULL, pool) < 0) { backend->startPool(conn, pool) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to autostart storage pool '%s': %s"), VIR_ERROR(_("Failed to autostart storage pool '%s': %s"),
pool->def->name, err ? err->message : pool->def->name, err ? err->message :
@ -107,10 +115,10 @@ storageDriverAutostart(virStorageDriverStatePtr driver) {
} }
if (started) { if (started) {
if (backend->refreshPool(NULL, pool) < 0) { if (backend->refreshPool(conn, pool) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
if (backend->stopPool) if (backend->stopPool)
backend->stopPool(NULL, pool); backend->stopPool(conn, pool);
VIR_ERROR(_("Failed to autostart storage pool '%s': %s"), VIR_ERROR(_("Failed to autostart storage pool '%s': %s"),
pool->def->name, err ? err->message : pool->def->name, err ? err->message :
_("no error message found")); _("no error message found"));
@ -121,6 +129,9 @@ storageDriverAutostart(virStorageDriverStatePtr driver) {
} }
virStoragePoolObjUnlock(pool); virStoragePoolObjUnlock(pool);
} }
if (conn)
virConnectClose(conn);
} }
/** /**
@ -152,6 +163,7 @@ storageStateInitialize(bool privileged,
if (!base) if (!base)
goto error; goto error;
} }
driverState->privileged = privileged;
/* Configuration paths are either $USER_CONFIG_HOME/libvirt/storage/... (session) or /* Configuration paths are either $USER_CONFIG_HOME/libvirt/storage/... (session) or
* /etc/libvirt/storage/... (system). * /etc/libvirt/storage/... (system).