Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
docs/formatsecret.html.in| 12
docs/schemas/secret.rng | 10 ++
include/libvirt/libvirt.h.in | 1 +
src/conf/secret_conf.c | 22 +-
src/conf/secret_conf.h | 1 +
src/secret/secret_driver.c | 8
6 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/docs/formatsecret.html.in b/docs/formatsecret.html.in
index 01aff2d..c3c4a25 100644
--- a/docs/formatsecret.html.in
+++ b/docs/formatsecret.html.in
@@ -66,6 +66,18 @@
device/a. span class=sinceSince 0.9.7/span.
/p
+h3Usage type iscsi/h3
+
+p
+ This secret is associated with an iSCSI target for CHAP authentication.
+ The codelt;usage type='iscsi'gt;/code element must contain
+ a single codetarget/code element that specifies a usage name
+ for the secret. The iSCSI secret can then be used by UUID or by
+ this usage name via the codelt;authgt;/code element of
+ a a href=domain.html#elementsDisksdisk
+ device/a. span class=sinceSince 1.0.4/span.
+/p
+
h2a name=exampleExample/a/h2
pre
diff --git a/docs/schemas/secret.rng b/docs/schemas/secret.rng
index e49bd5a..d7b8f83 100644
--- a/docs/schemas/secret.rng
+++ b/docs/schemas/secret.rng
@@ -41,6 +41,7 @@
choice
ref name='usagevolume'/
ref name='usageceph'/
+ ref name='usageiscsi'/
!-- More choices later --
/choice
/element
@@ -67,4 +68,13 @@
/element
/define
+ define name='usageiscsi'
+attribute name='type'
+ valueiscsi/value
+/attribute
+element name='target'
+ ref name='genericName'/
+/element
+ /define
+
/grammar
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index f6a7aff..45b5638 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -3649,6 +3649,7 @@ typedef enum {
VIR_SECRET_USAGE_TYPE_NONE = 0,
VIR_SECRET_USAGE_TYPE_VOLUME = 1,
VIR_SECRET_USAGE_TYPE_CEPH = 2,
+VIR_SECRET_USAGE_TYPE_ISCSI = 3,
#ifdef VIR_ENUM_SENTINELS
VIR_SECRET_USAGE_TYPE_LAST
diff --git a/src/conf/secret_conf.c b/src/conf/secret_conf.c
index 891af65..06b9bb2 100644
--- a/src/conf/secret_conf.c
+++ b/src/conf/secret_conf.c
@@ -36,7 +36,7 @@
#define VIR_FROM_THIS VIR_FROM_SECRET
VIR_ENUM_IMPL(virSecretUsageType, VIR_SECRET_USAGE_TYPE_LAST,
- none, volume, ceph)
+ none, volume, ceph, iscsi)
void
virSecretDefFree(virSecretDefPtr def)
@@ -57,6 +57,10 @@ virSecretDefFree(virSecretDefPtr def)
VIR_FREE(def-usage.ceph);
break;
+case VIR_SECRET_USAGE_TYPE_ISCSI:
+VIR_FREE(def-usage.target);
+break;
+
default:
VIR_ERROR(_(unexpected secret usage type %d), def-usage_type);
break;
@@ -108,6 +112,15 @@ virSecretDefParseUsage(xmlXPathContextPtr ctxt,
}
break;
+case VIR_SECRET_USAGE_TYPE_ISCSI:
+def-usage.target = virXPathString(string(./usage/target), ctxt);
+if (!def-usage.target) {
+virReportError(VIR_ERR_INTERNAL_ERROR, %s,
+ _(Ceph usage specified, but target is missing));
+return -1;
+}
+break;
+
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
_(unexpected secret usage type %d),
@@ -262,6 +275,13 @@ virSecretDefFormatUsage(virBufferPtr buf,
}
break;
+case VIR_SECRET_USAGE_TYPE_ISCSI:
+if (def-usage.target != NULL) {
+virBufferEscapeString(buf, target%s/target\n,
+ def-usage.target);
+}
+break;
+
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
_(unexpected secret usage type %d),
diff --git a/src/conf/secret_conf.h b/src/conf/secret_conf.h
index 6079d5b..53517f9 100644
--- a/src/conf/secret_conf.h
+++ b/src/conf/secret_conf.h
@@ -39,6 +39,7 @@ struct _virSecretDef {
union {
char *volume; /* May be NULL */
char *ceph;
+char *target;
} usage;
};
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index 5be33b9..c577817 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -149,6 +149,11 @@ secretFindByUsage(virSecretDriverStatePtr driver, int
usageType, const char *usa
if (STREQ(s-def-usage.ceph, usageID))
return s;
break;
+
+case VIR_SECRET_USAGE_TYPE_ISCSI:
+if (STREQ(s-def-usage.target, usageID))
+return s;
+break;
}
}
return NULL;
@@ -614,6 +619,9 @@ secretUsageIDForDef(virSecretDefPtr def)
case VIR_SECRET_USAGE_TYPE_CEPH:
return def-usage.ceph;
+case VIR_SECRET_USAGE_TYPE_ISCSI:
+return def-usage.target;
+
default:
return