[libvirt] [PATCH 2/5] storage: add authId, authDomain to virDomainDiskDef

Sage Weil sage at newdream.net
Tue Sep 20 04:13:40 UTC 2011


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;
-- 
1.7.4.1




More information about the libvir-list mailing list