Replace the authType, chap, and cephx unions in virStoragePoolSource with a single pointer to a virStorageAuthDefPtr. Adjust all users of the previous chap/cephx and secret unions with the source->auth data. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- src/conf/storage_conf.c | 152 +++++------------------------------- src/conf/storage_conf.h | 38 +-------- src/qemu/qemu_conf.c | 46 ++--------- src/storage/storage_backend_iscsi.c | 41 +++++----- src/storage/storage_backend_rbd.c | 65 ++++++++------- 5 files changed, 80 insertions(+), 262 deletions(-) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 8b6fd79..5b152f1 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -44,9 +44,12 @@ #include "viralloc.h" #include "virfile.h" #include "virstring.h" +#include "virlog.h" #define VIR_FROM_THIS VIR_FROM_STORAGE +VIR_LOG_INIT("conf.storage_conf"); + #define DEFAULT_POOL_PERM_MODE 0755 #define DEFAULT_VOL_PERM_MODE 0600 @@ -98,10 +101,6 @@ VIR_ENUM_IMPL(virStoragePoolSourceAdapter, VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST, "default", "scsi_host", "fc_host") -VIR_ENUM_IMPL(virStoragePoolAuth, - VIR_STORAGE_POOL_AUTH_LAST, - "none", "chap", "ceph") - typedef const char *(*virStorageVolFormatToString)(int format); typedef int (*virStorageVolFormatFromString)(const char *format); typedef const char *(*virStorageVolFeatureToString)(int feature); @@ -374,18 +373,9 @@ virStoragePoolSourceClear(virStoragePoolSourcePtr source) VIR_FREE(source->name); virStoragePoolSourceAdapterClear(source->adapter); VIR_FREE(source->initiator.iqn); + virStorageAuthDefFree(source->auth); VIR_FREE(source->vendor); VIR_FREE(source->product); - - if (source->authType == VIR_STORAGE_POOL_AUTH_CHAP) { - VIR_FREE(source->auth.chap.username); - VIR_FREE(source->auth.chap.secret.usage); - } - - if (source->authType == VIR_STORAGE_POOL_AUTH_CEPHX) { - VIR_FREE(source->auth.cephx.username); - VIR_FREE(source->auth.cephx.secret.usage); - } } void @@ -462,106 +452,17 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools, } static int -virStoragePoolDefParseAuthSecret(xmlXPathContextPtr ctxt, - virStoragePoolAuthSecretPtr secret) -{ - char *uuid = NULL; - int ret = -1; - - uuid = virXPathString("string(./auth/secret/@uuid)", ctxt); - secret->usage = virXPathString("string(./auth/secret/@usage)", ctxt); - if (uuid == NULL && secret->usage == NULL) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("missing auth secret uuid or usage attribute")); - return -1; - } - - if (uuid != NULL) { - if (secret->usage != NULL) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("either auth secret uuid or usage expected")); - goto cleanup; - } - if (virUUIDParse(uuid, secret->uuid) < 0) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("invalid auth secret uuid")); - goto cleanup; - } - secret->uuidUsable = true; - } else { - secret->uuidUsable = false; - } - - ret = 0; - cleanup: - VIR_FREE(uuid); - return ret; -} - -static int -virStoragePoolDefParseAuth(xmlXPathContextPtr ctxt, - virStoragePoolSourcePtr source) -{ - int ret = -1; - char *authType = NULL; - char *username = NULL; - - authType = virXPathString("string(./auth/@type)", ctxt); - if (authType == NULL) { - source->authType = VIR_STORAGE_POOL_AUTH_NONE; - ret = 0; - goto cleanup; - } - - if ((source->authType = - virStoragePoolAuthTypeFromString(authType)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown auth type '%s'"), - authType); - goto cleanup; - } - - username = virXPathString("string(./auth/@username)", ctxt); - if (username == NULL) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("missing auth username attribute")); - goto cleanup; - } - - if (source->authType == VIR_STORAGE_POOL_AUTH_CHAP) { - source->auth.chap.username = username; - username = NULL; - if (virStoragePoolDefParseAuthSecret(ctxt, - &source->auth.chap.secret) < 0) - goto cleanup; - } - else if (source->authType == VIR_STORAGE_POOL_AUTH_CEPHX) { - source->auth.cephx.username = username; - username = NULL; - if (virStoragePoolDefParseAuthSecret(ctxt, - &source->auth.cephx.secret) < 0) - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(authType); - VIR_FREE(username); - return ret; -} - -static int virStoragePoolDefParseSource(xmlXPathContextPtr ctxt, virStoragePoolSourcePtr source, int pool_type, xmlNodePtr node) { int ret = -1; - xmlNodePtr relnode, *nodeset = NULL; + xmlNodePtr relnode, authnode, *nodeset = NULL; int nsource; size_t i; virStoragePoolOptionsPtr options; + virStorageAuthDefPtr authdef = NULL; char *name = NULL; char *port = NULL; char *adapter_type = NULL; @@ -705,8 +606,18 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt, VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST; } - if (virStoragePoolDefParseAuth(ctxt, source) < 0) - goto cleanup; + if ((authnode = virXPathNode("./auth", ctxt))) { + if (!(authdef = virStorageAuthDefParse(node->doc, authnode))) + goto cleanup; + + if (authdef->authType == VIR_STORAGE_AUTH_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("storage pool missing auth type")); + goto cleanup; + } + + source->auth = authdef; + } source->vendor = virXPathString("string(./vendor/@name)", ctxt); source->product = virXPathString("string(./product/@name)", ctxt); @@ -1057,7 +968,6 @@ virStoragePoolSourceFormat(virBufferPtr buf, virStoragePoolSourcePtr src) { size_t i, j; - char uuid[VIR_UUID_STRING_BUFLEN]; virBufferAddLit(buf, "<source>\n"); virBufferAdjustIndent(buf, 2); @@ -1138,29 +1048,9 @@ virStoragePoolSourceFormat(virBufferPtr buf, virBufferAsprintf(buf, "<format type='%s'/>\n", format); } - if (src->authType == VIR_STORAGE_POOL_AUTH_CHAP || - src->authType == VIR_STORAGE_POOL_AUTH_CEPHX) { - virBufferAsprintf(buf, "<auth type='%s' ", - virStoragePoolAuthTypeToString(src->authType)); - virBufferEscapeString(buf, "username='%s'>\n", - (src->authType == VIR_STORAGE_POOL_AUTH_CHAP ? - src->auth.chap.username : - src->auth.cephx.username)); - virBufferAdjustIndent(buf, 2); - - virBufferAddLit(buf, "<secret"); - if (src->auth.cephx.secret.uuidUsable) { - virUUIDFormat(src->auth.cephx.secret.uuid, uuid); - virBufferAsprintf(buf, " uuid='%s'", uuid); - } - - if (src->auth.cephx.secret.usage != NULL) { - virBufferAsprintf(buf, " usage='%s'", src->auth.cephx.secret.usage); - } - virBufferAddLit(buf, "/>\n"); - - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</auth>\n"); + if (src->auth) { + if (virStorageAuthDefFormat(buf, src->auth) < 0) + return -1; } virBufferEscapeString(buf, "<vendor name='%s'/>\n", src->vendor); diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 04d99eb..47f769b 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -106,37 +106,6 @@ typedef enum { } virStoragePoolDeviceType; -typedef enum { - VIR_STORAGE_POOL_AUTH_NONE, - VIR_STORAGE_POOL_AUTH_CHAP, - VIR_STORAGE_POOL_AUTH_CEPHX, - - VIR_STORAGE_POOL_AUTH_LAST, -} virStoragePoolAuthType; -VIR_ENUM_DECL(virStoragePoolAuth) - -typedef struct _virStoragePoolAuthSecret virStoragePoolAuthSecret; -typedef virStoragePoolAuthSecret *virStoragePoolAuthSecretPtr; -struct _virStoragePoolAuthSecret { - unsigned char uuid[VIR_UUID_BUFLEN]; - char *usage; - bool uuidUsable; -}; - -typedef struct _virStoragePoolAuthChap virStoragePoolAuthChap; -typedef virStoragePoolAuthChap *virStoragePoolAuthChapPtr; -struct _virStoragePoolAuthChap { - char *username; - virStoragePoolAuthSecret secret; -}; - -typedef struct _virStoragePoolAuthCephx virStoragePoolAuthCephx; -typedef virStoragePoolAuthCephx *virStoragePoolAuthCephxPtr; -struct _virStoragePoolAuthCephx { - char *username; - virStoragePoolAuthSecret secret; -}; - /* * For remote pools, info on how to reach the host */ @@ -243,11 +212,8 @@ struct _virStoragePoolSource { /* Initiator IQN */ virStoragePoolSourceInitiatorAttr initiator; - int authType; /* virStoragePoolAuthType */ - union { - virStoragePoolAuthChap chap; - virStoragePoolAuthCephx cephx; - } auth; + /* Authentication information */ + virStorageAuthDefPtr auth; /* Vendor of the source */ char *vendor; diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 43af60e..f92f831 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1211,54 +1211,18 @@ qemuAddISCSIPoolSourceHost(virDomainDiskDefPtr def, static int qemuTranslateDiskSourcePoolAuth(virDomainDiskDefPtr def, - virStoragePoolDefPtr pooldef) + virStoragePoolSourcePtr source) { int ret = -1; - virStorageAuthDefPtr authdef; /* Only necessary when authentication set */ - if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_NONE) { + if (!source->auth) { ret = 0; goto cleanup; } - if (VIR_ALLOC(def->src->auth) < 0) + def->src->auth = virStorageAuthDefCopy(source->auth); + if (!def->src->auth) goto cleanup; - authdef = def->src->auth; - - /* Copy the authentication information from the storage pool - * into the virDomainDiskDef - */ - if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_CHAP) { - if (VIR_STRDUP(authdef->username, - pooldef->source.auth.chap.username) < 0) - goto cleanup; - if (pooldef->source.auth.chap.secret.uuidUsable) { - authdef->secretType = VIR_STORAGE_SECRET_TYPE_UUID; - memcpy(authdef->secret.uuid, - pooldef->source.auth.chap.secret.uuid, - VIR_UUID_BUFLEN); - } else { - if (VIR_STRDUP(authdef->secret.usage, - pooldef->source.auth.chap.secret.usage) < 0) - goto cleanup; - authdef->secretType = VIR_STORAGE_SECRET_TYPE_USAGE; - } - } else if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_CEPHX) { - if (VIR_STRDUP(authdef->username, - pooldef->source.auth.cephx.username) < 0) - goto cleanup; - if (pooldef->source.auth.cephx.secret.uuidUsable) { - authdef->secretType = VIR_STORAGE_SECRET_TYPE_UUID; - memcpy(authdef->secret.uuid, - pooldef->source.auth.cephx.secret.uuid, - VIR_UUID_BUFLEN); - } else { - if (VIR_STRDUP(authdef->secret.usage, - pooldef->source.auth.cephx.secret.usage) < 0) - goto cleanup; - authdef->secretType = VIR_STORAGE_SECRET_TYPE_USAGE; - } - } ret = 0; cleanup: @@ -1387,7 +1351,7 @@ qemuTranslateDiskSourcePool(virConnectPtr conn, def->src->srcpool->actualtype = VIR_STORAGE_TYPE_NETWORK; def->src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI; - if (qemuTranslateDiskSourcePoolAuth(def, pooldef) < 0) + if (qemuTranslateDiskSourcePoolAuth(def, &pooldef->source) < 0) goto cleanup; if (qemuAddISCSIPoolSourceHost(def, pooldef) < 0) diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c index aa6980c..3aac9d3 100644 --- a/src/storage/storage_backend_iscsi.c +++ b/src/storage/storage_backend_iscsi.c @@ -278,18 +278,20 @@ virStorageBackendISCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED, static int virStorageBackendISCSISetAuth(const char *portal, virConnectPtr conn, - virStoragePoolDefPtr def) + virStoragePoolSourcePtr source) { virSecretPtr secret = NULL; unsigned char *secret_value = NULL; - virStoragePoolAuthChap chap; + virStorageAuthDefPtr authdef = source->auth; int ret = -1; char uuidStr[VIR_UUID_STRING_BUFLEN]; - if (def->source.authType == VIR_STORAGE_POOL_AUTH_NONE) + if (!authdef || authdef->authType == VIR_STORAGE_AUTH_TYPE_NONE) return 0; - if (def->source.authType != VIR_STORAGE_POOL_AUTH_CHAP) { + VIR_DEBUG("username='%s' authType=%d secretType=%d", + authdef->username, authdef->authType, authdef->secretType); + if (authdef->authType != VIR_STORAGE_AUTH_TYPE_CHAP) { virReportError(VIR_ERR_XML_ERROR, "%s", _("iscsi pool only supports 'chap' auth type")); return -1; @@ -302,12 +304,11 @@ virStorageBackendISCSISetAuth(const char *portal, return -1; } - chap = def->source.auth.chap; - if (chap.secret.uuidUsable) - secret = virSecretLookupByUUID(conn, chap.secret.uuid); + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) + secret = virSecretLookupByUUID(conn, authdef->secret.uuid); else secret = virSecretLookupByUsage(conn, VIR_SECRET_USAGE_TYPE_ISCSI, - chap.secret.usage); + authdef->secret.usage); if (secret) { size_t secret_size; @@ -315,44 +316,44 @@ virStorageBackendISCSISetAuth(const char *portal, conn->secretDriver->secretGetValue(secret, &secret_size, 0, VIR_SECRET_GET_VALUE_INTERNAL_CALL); if (!secret_value) { - if (chap.secret.uuidUsable) { - virUUIDFormat(chap.secret.uuid, uuidStr); + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) { + virUUIDFormat(authdef->secret.uuid, uuidStr); virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get the value of the secret " "for username %s using uuid '%s'"), - chap.username, uuidStr); + authdef->username, uuidStr); } else { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get the value of the secret " "for username %s using usage value '%s'"), - chap.username, chap.secret.usage); + authdef->username, authdef->secret.usage); } goto cleanup; } } else { - if (chap.secret.uuidUsable) { - virUUIDFormat(chap.secret.uuid, uuidStr); + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) { + virUUIDFormat(authdef->secret.uuid, uuidStr); virReportError(VIR_ERR_NO_SECRET, _("no secret matches uuid '%s'"), uuidStr); } else { virReportError(VIR_ERR_NO_SECRET, _("no secret matches usage value '%s'"), - chap.secret.usage); + authdef->secret.usage); } goto cleanup; } if (virISCSINodeUpdate(portal, - def->source.devices[0].path, + source->devices[0].path, "node.session.auth.authmethod", "CHAP") < 0 || virISCSINodeUpdate(portal, - def->source.devices[0].path, + source->devices[0].path, "node.session.auth.username", - chap.username) < 0 || + authdef->username) < 0 || virISCSINodeUpdate(portal, - def->source.devices[0].path, + source->devices[0].path, "node.session.auth.password", (const char *)secret_value) < 0) goto cleanup; @@ -404,7 +405,7 @@ virStorageBackendISCSIStartPool(virConnectPtr conn, NULL, NULL) < 0) goto cleanup; - if (virStorageBackendISCSISetAuth(portal, conn, pool->def) < 0) + if (virStorageBackendISCSISetAuth(portal, conn, &pool->def->source) < 0) goto cleanup; if (virISCSIConnectionLogin(portal, diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c index 5d4ef79..a582743 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -50,10 +50,11 @@ typedef virStorageBackendRBDState *virStorageBackendRBDStatePtr; static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, virConnectPtr conn, - virStoragePoolObjPtr pool) + virStoragePoolSourcePtr source) { int ret = -1; int r = 0; + virStorageAuthDefPtr authdef = source->auth; unsigned char *secret_value = NULL; size_t secret_value_size; char *rados_key = NULL; @@ -66,12 +67,9 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, const char *mon_op_timeout = "30"; const char *osd_op_timeout = "30"; - VIR_DEBUG("Found Cephx username: %s", - pool->def->source.auth.cephx.username); - - if (pool->def->source.auth.cephx.username != NULL) { - VIR_DEBUG("Using cephx authorization"); - r = rados_create(&ptr->cluster, pool->def->source.auth.cephx.username); + if (authdef) { + VIR_DEBUG("Using cephx authorization, username: %s", authdef->username); + r = rados_create(&ptr->cluster, authdef->username); if (r < 0) { virReportSystemError(-r, "%s", _("failed to initialize RADOS")); goto cleanup; @@ -84,46 +82,45 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, return -1; } - if (pool->def->source.auth.cephx.secret.uuidUsable) { - virUUIDFormat(pool->def->source.auth.cephx.secret.uuid, secretUuid); + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) { + virUUIDFormat(authdef->secret.uuid, secretUuid); VIR_DEBUG("Looking up secret by UUID: %s", secretUuid); secret = virSecretLookupByUUIDString(conn, secretUuid); - } else if (pool->def->source.auth.cephx.secret.usage != NULL) { + } else if (authdef->secret.usage != NULL) { VIR_DEBUG("Looking up secret by usage: %s", - pool->def->source.auth.cephx.secret.usage); + authdef->secret.usage); secret = virSecretLookupByUsage(conn, VIR_SECRET_USAGE_TYPE_CEPH, - pool->def->source.auth.cephx.secret.usage); + authdef->secret.usage); } if (secret == NULL) { - if (pool->def->source.auth.cephx.secret.uuidUsable) { + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) { virReportError(VIR_ERR_NO_SECRET, _("no secret matches uuid '%s'"), secretUuid); } else { virReportError(VIR_ERR_NO_SECRET, _("no secret matches usage value '%s'"), - pool->def->source.auth.cephx.secret.usage); + authdef->secret.usage); } goto cleanup; } - secret_value = conn->secretDriver->secretGetValue(secret, &secret_value_size, 0, + secret_value = conn->secretDriver->secretGetValue(secret, + &secret_value_size, 0, VIR_SECRET_GET_VALUE_INTERNAL_CALL); if (!secret_value) { - if (pool->def->source.auth.cephx.secret.uuidUsable) { + if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get the value of the secret " "for username '%s' using uuid '%s'"), - pool->def->source.auth.cephx.username, - secretUuid); + authdef->username, secretUuid); } else { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get the value of the secret " "for username '%s' using usage value '%s'"), - pool->def->source.auth.cephx.username, - pool->def->source.auth.cephx.secret.usage); + authdef->username, authdef->secret.usage); } goto cleanup; } @@ -170,18 +167,18 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr, } VIR_DEBUG("Found %zu RADOS cluster monitors in the pool configuration", - pool->def->source.nhost); + source->nhost); - for (i = 0; i < pool->def->source.nhost; i++) { - if (pool->def->source.hosts[i].name != NULL && - !pool->def->source.hosts[i].port) { + for (i = 0; i < source->nhost; i++) { + if (source->hosts[i].name != NULL && + !source->hosts[i].port) { virBufferAsprintf(&mon_host, "%s:6789,", - pool->def->source.hosts[i].name); - } else if (pool->def->source.hosts[i].name != NULL && - pool->def->source.hosts[i].port) { + source->hosts[i].name); + } else if (source->hosts[i].name != NULL && + source->hosts[i].port) { virBufferAsprintf(&mon_host, "%s:%d,", - pool->def->source.hosts[i].name, - pool->def->source.hosts[i].port); + source->hosts[i].name, + source->hosts[i].port); } else { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("received malformed monitor, check the XML definition")); @@ -335,7 +332,7 @@ static int virStorageBackendRBDRefreshPool(virConnectPtr conn, ptr.cluster = NULL; ptr.ioctx = NULL; - if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) { + if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) { goto cleanup; } @@ -437,7 +434,7 @@ static int virStorageBackendRBDDeleteVol(virConnectPtr conn, VIR_WARN("%s", _("This storage backend does not supported zeroed removal of volumes")); } - if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) { + if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) { goto cleanup; } @@ -520,7 +517,7 @@ virStorageBackendRBDBuildVol(virConnectPtr conn, virCheckFlags(0, -1); - if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) + if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) goto cleanup; if (virStorageBackendRBDOpenIoCTX(&ptr, pool) < 0) @@ -560,7 +557,7 @@ static int virStorageBackendRBDRefreshVol(virConnectPtr conn, ptr.ioctx = NULL; int ret = -1; - if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) { + if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) { goto cleanup; } @@ -594,7 +591,7 @@ static int virStorageBackendRBDResizeVol(virConnectPtr conn ATTRIBUTE_UNUSED, virCheckFlags(0, -1); - if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) { + if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) { goto cleanup; } -- 1.9.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list