[libvirt] [PATCH 2/5] storage: add authId, authDomain to virDomainDiskDef
Daniel P. Berrange
berrange at redhat.com
Wed Oct 12 16:38:34 UTC 2011
On Mon, Sep 19, 2011 at 09:13:40PM -0700, Sage Weil wrote:
> Add additional fields to let you specify the how to authenticate with a
> network disk type. The authId is the name to authenticate as, and the
> authDomain optionally describes the domain that user exists in. The latter
> allows us to locate a secret in using the libvirt secrets API, as the user
> is may not unique if libvirt is talking to multiple backend clusters.
>
> Signed-off-by: Sage Weil <sage at newdream.net>
> ---
> docs/schemas/domain.rng | 6 ++++++
> src/conf/domain_conf.c | 43 ++++++++++++++++++++++++++++++++++---------
> src/conf/domain_conf.h | 2 ++
> 3 files changed, 42 insertions(+), 9 deletions(-)
>
> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 6ccbeed..3574f03 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -736,6 +736,12 @@
> </attribute>
> <optional>
> <attribute name="name"/>
> + <element name="auth">
> + <attribute name="id"/>
> + <optional>
> + <attribute name="domain"/>
> + </optional>
> + </element>
> </optional>
> <zeroOrMore>
> <element name="host">
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 010ce57..5b80a9e 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -2066,7 +2066,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> unsigned int flags)
> {
> virDomainDiskDefPtr def;
> - xmlNodePtr cur, host;
> + xmlNodePtr cur, child;
> char *type = NULL;
> char *device = NULL;
> char *driverName = NULL;
> @@ -2084,6 +2084,8 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> char *devaddr = NULL;
> virStorageEncryptionPtr encryption = NULL;
> char *serial = NULL;
> + char *authId = NULL;
> + char *authDomain = NULL;
>
> if (VIR_ALLOC(def) < 0) {
> virReportOOMError();
> @@ -2137,10 +2139,10 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> _("missing name for disk source"));
> goto error;
> }
> - host = cur->children;
> - while (host != NULL) {
> - if (host->type == XML_ELEMENT_NODE &&
> - xmlStrEqual(host->name, BAD_CAST "host")) {
> + child = cur->children;
> + while (child != NULL) {
> + if (child->type == XML_ELEMENT_NODE &&
> + xmlStrEqual(child->name, BAD_CAST "host")) {
> if (VIR_REALLOC_N(hosts, nhosts + 1) < 0) {
> virReportOOMError();
> goto error;
> @@ -2149,20 +2151,30 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> hosts[nhosts].port = NULL;
> nhosts++;
>
> - hosts[nhosts - 1].name = virXMLPropString(host, "name");
> + hosts[nhosts - 1].name = virXMLPropString(child, "name");
> if (!hosts[nhosts - 1].name) {
> virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("missing name for host"));
> goto error;
> }
> - hosts[nhosts - 1].port = virXMLPropString(host, "port");
> + hosts[nhosts - 1].port = virXMLPropString(child, "port");
> if (!hosts[nhosts - 1].port) {
> virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("missing port for host"));
> goto error;
> }
> }
> - host = host->next;
> + if (child->type == XML_ELEMENT_NODE &&
> + xmlStrEqual(child->name, BAD_CAST "auth")) {
> + authId = virXMLPropString(child, "id");
> + if (!authId) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + "%s", _("missing id for auth"));
> + goto error;
> + }
> + authDomain = virXMLPropString(child, "domain");
> + }
> + child = child->next;
> }
> break;
> default:
> @@ -2373,6 +2385,10 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> hosts = NULL;
> def->nhosts = nhosts;
> nhosts = 0;
> + def->authId = authId;
> + authId = NULL;
> + def->authDomain = authDomain;
> + authDomain = NULL;
> def->driverName = driverName;
> driverName = NULL;
> def->driverType = driverType;
> @@ -2408,6 +2424,8 @@ cleanup:
> VIR_FREE(hosts);
> VIR_FREE(protocol);
> VIR_FREE(device);
> + VIR_FREE(authDomain);
> + VIR_FREE(authId);
> VIR_FREE(driverType);
> VIR_FREE(driverName);
> VIR_FREE(cachetag);
> @@ -8645,12 +8663,19 @@ virDomainDiskDefFormat(virBufferPtr buf,
> if (def->src) {
> virBufferEscapeString(buf, " name='%s'", def->src);
> }
> - if (def->nhosts == 0) {
> + if (def->nhosts == 0 && def->authId == NULL) {
> virBufferAsprintf(buf, "/>\n");
> } else {
> int i;
>
> virBufferAsprintf(buf, ">\n");
> + if (def->authId) {
> + virBufferAsprintf(buf, " <auth id='%s'",
> + def->authId);
> + if (def->authDomain)
> + virBufferAsprintf(buf, " domain='%s'", def->authDomain);
> + virBufferStrcat(buf, "/>\n", NULL);
> + }
> for (i = 0; i < def->nhosts; i++) {
> virBufferEscapeString(buf, " <host name='%s'",
> def->hosts[i].name);
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index abf9cbd..8a997e1 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -221,6 +221,8 @@ struct _virDomainDiskDef {
> int protocol;
> int nhosts;
> virDomainDiskHostDefPtr hosts;
> + char *authDomain; /* ceph cluster name */
> + char *authId; /* ceph auth id */
> char *driverName;
> char *driverType;
> char *serial;
Based on my comments in patch 0, I would suggest something along the
lines of:
enum virDomainDiskSecretType {
VIR_DOMAIN_DISK_SECRET_TYPE_NONE,
VIR_DOMAIN_DISK_SECRET_TYPE_UUID,
VIR_DOMAIN_DISK_SECRET_TYPE_USAGE,
};
struct {
char *username;
int secretType;
union {
unsigned char uuid[VIR_UUID_BUFLEN];
char *usage;
} secret;
} auth;
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list