holds the actual password or other credentials (the domain XML
intentionally does not expose the password, only the reference
to the object that does manage the password). For now, the
- only known secret <code>type</code> is "ceph", for Ceph RBD
- network sources, and requires either an
- attribute <code>uuid</code> with the UUID of the Ceph secret
- object, or an attribute <code>usage</code> with the name
- associated with the Ceph secret
- object. <span class="since">libvirt 0.9.7</span>
+ known secret <code>type</code>s are "ceph", for Ceph RBD
+ network sources, and "iscsi", for CHAP authentication of iSCSI
+ targets. Both require either a <code>uuid</code> attribute
+ with the UUID of the secret object, or a <code>usage</code>
+ attribute matching the key that was specified in the
+ secret object. <span class="since">libvirt 0.9.7</span>
</dd>
<dt><code>geometry</code></dt>
<dd>The optional <code>geometry</code> element provides the
char *wwn = NULL;
char *vendor = NULL;
char *product = NULL;
+ int expected_secret_usage = -1;
+ int auth_secret_usage = -1;
if (VIR_ALLOC(def) < 0) {
virReportOOMError();
if (cur->type == XML_ELEMENT_NODE) {
if (!source && !hosts &&
xmlStrEqual(cur->name, BAD_CAST "source")) {
-
sourceNode = cur;
switch (def->type) {
protocol);
goto error;
}
+ if (def->protocol == VIR_DOMAIN_DISK_PROTOCOL_ISCSI) {
+ expected_secret_usage = VIR_SECRET_USAGE_TYPE_ISCSI;
+ } else if (def->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) {
+ expected_secret_usage = VIR_SECRET_USAGE_TYPE_CEPH;
+ }
if (!(source = virXMLPropString(cur, "name")) &&
def->protocol != VIR_DOMAIN_DISK_PROTOCOL_NBD) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing type for secret"));
goto error;
}
- if (virSecretUsageTypeTypeFromString(usageType) !=
- VIR_SECRET_USAGE_TYPE_CEPH) {
+ auth_secret_usage =
+ virSecretUsageTypeTypeFromString(usageType);
+ if (auth_secret_usage < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("invalid secret type %s"),
usageType);
cur = cur->next;
}
+ if (auth_secret_usage != -1 && auth_secret_usage != expected_secret_usage) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid secret type '%s'"),
+ virSecretUsageTypeTypeToString(auth_secret_usage));
+ goto error;
+ }
+
device = virXMLPropString(node, "device");
if (device) {
if ((def->device = virDomainDiskDeviceTypeFromString(device)) < 0) {
if (def->auth.username) {
virBufferEscapeString(buf, " <auth username='%s'>\n",
def->auth.username);
+ if (def->protocol == VIR_DOMAIN_DISK_PROTOCOL_ISCSI) {
+ virBufferAsprintf(buf, " <secret type='iscsi'");
+ } else if (def->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) {
+ virBufferAsprintf(buf, " <secret type='ceph'");
+ }
+
if (def->auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_UUID) {
virUUIDFormat(def->auth.secret.uuid, uuidstr);
- virBufferAsprintf(buf,
- " <secret type='ceph' uuid='%s'/>\n",
- uuidstr);
+ virBufferAsprintf(buf, " uuid='%s'/>\n", uuidstr);
}
if (def->auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_USAGE) {
- virBufferEscapeString(buf,
- " <secret type='ceph' usage='%s'/>\n",
+ virBufferEscapeString(buf, " usage='%s'/>\n",
def->auth.secret.usage);
}
virBufferAddLit(buf, " </auth>\n");
--- /dev/null
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='network' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <auth username='myname'>
+ <secret type='iscsi' usage='mycluster_myname'/>
+ </auth>
+ <source protocol='iscsi' name='iqn.1992-01.com.example'>
+ <host name='example.org'/>
+ </source>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>