[libvirt] [PATCH 2/9] Introduce new XMLs to specify disk source using libvirt storage
Daniel P. Berrange
berrange at redhat.com
Mon Feb 4 14:28:45 UTC 2013
On Thu, Jan 31, 2013 at 02:11:27AM +0800, Osier Yang wrote:
> With this patch, one can specify the disk source using libvirt
> storage like:
>
> <disk type='volume' device='disk'>
> <driver name='qemu' type='raw' cache='none'/>
> <source pool='default' volume='fc18.img'/>
> <target dev='vdb' bus='virtio'/>
> </disk>
>
> "seclables" and "startupPolicy" are not supported for this new
> disk type ("volume"). They will be supported in later patches.
> @@ -12168,6 +12237,102 @@ static void virDomainDiskBlockIoDefFormat(virBufferPtr buf,
> }
> }
>
> +static int
> +virDomainDiskSourceDefFormat(virBufferPtr buf,
> + virDomainDiskDefPtr def)
> +{
> + int n;
> + const char *startupPolicy = virDomainStartupPolicyTypeToString(def->startupPolicy);
> +
> + if (def->src || def->nhosts > 0 || def->srcpool ||
> + def->startupPolicy) {
> + switch (def->type) {
> + case VIR_DOMAIN_DISK_TYPE_FILE:
> + if (def->src)
> + virBufferEscapeString(buf, " <source file='%s'", def->src);
> + if (def->startupPolicy)
> + virBufferEscapeString(buf, " startupPolicy='%s'",
> + startupPolicy);
> + if (def->nseclabels) {
> + virBufferAddLit(buf, ">\n");
> + virBufferAdjustIndent(buf, 8);
> + for (n = 0; n < def->nseclabels; n++)
> + virSecurityDeviceLabelDefFormat(buf, def->seclabels[n]);
> + virBufferAdjustIndent(buf, -8);
> + virBufferAddLit(buf, " </source>\n");
> + } else {
> + virBufferAddLit(buf, "/>\n");
> + }
> + break;
> + case VIR_DOMAIN_DISK_TYPE_BLOCK:
> + virBufferEscapeString(buf, " <source dev='%s'",
> + def->src);
> + if (def->nseclabels) {
> + virBufferAddLit(buf, ">\n");
> + virBufferAdjustIndent(buf, 8);
> + for (n = 0; n < def->nseclabels; n++)
> + virSecurityDeviceLabelDefFormat(buf, def->seclabels[n]);
> + virBufferAdjustIndent(buf, -8);
> + virBufferAddLit(buf, " </source>\n");
> + } else {
> + virBufferAddLit(buf, "/>\n");
> + }
> + break;
> + case VIR_DOMAIN_DISK_TYPE_DIR:
> + virBufferEscapeString(buf, " <source dir='%s'/>\n",
> + def->src);
> + break;
> + case VIR_DOMAIN_DISK_TYPE_NETWORK:
> + virBufferAsprintf(buf, " <source protocol='%s'",
> + virDomainDiskProtocolTypeToString(def->protocol));
> + if (def->src) {
> + virBufferEscapeString(buf, " name='%s'", def->src);
> + }
> + if (def->nhosts == 0) {
> + virBufferAddLit(buf, "/>\n");
> + } else {
> + int i;
> +
> + virBufferAddLit(buf, ">\n");
> + for (i = 0; i < def->nhosts; i++) {
> + virBufferAddLit(buf, " <host");
> + if (def->hosts[i].name) {
> + virBufferEscapeString(buf, " name='%s'", def->hosts[i].name);
> + }
> + if (def->hosts[i].port) {
> + virBufferEscapeString(buf, " port='%s'",
> + def->hosts[i].port);
> + }
> + if (def->hosts[i].transport) {
> + virBufferAsprintf(buf, " transport='%s'",
> + virDomainDiskProtocolTransportTypeToString(def->hosts[i].transport));
> + }
> + if (def->hosts[i].socket) {
> + virBufferEscapeString(buf, " socket='%s'", def->hosts[i].socket);
> + }
> + virBufferAddLit(buf, "/>\n");
> + }
> + virBufferAddLit(buf, " </source>\n");
> + }
> + break;
> + case VIR_DOMAIN_DISK_TYPE_VOLUME:
> + /* Parsing guarantees the def->srcpool->volume cannot be NULL
> + * if def->srcpool->pool is not NULL.
> + */
> + if (def->srcpool->pool)
> + virBufferAsprintf(buf, " <source pool='%s' volume='%s'/>\n",
> + def->srcpool->pool, def->srcpool->volume);
> + break;
> + default:
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unexpected disk type %s"),
> + virDomainDiskTypeToString(def->type));
> + return -1;
> + }
> + }
> +
> + return 0;
> +}
You've got a big refactoring here, mixed in with new features. it is
really desirable to separate the refactoring into a patch on its own
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