[libvirt] [PATCH v4 11/13] parallels: add support of disks creation

Daniel Veillard veillard at redhat.com
Tue Dec 11 08:23:01 UTC 2012


On Tue, Dec 04, 2012 at 05:43:11PM +0400, Dmitry Guryanov wrote:
> Implement creation of new disks - if a new disk found
> in configuration, find a volume by disk path and
> actually create a disk image by issuing prlctl command.
> If it's successfully finished - remove the file with volume
> definition.
> 
> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> ---
>  src/parallels/parallels_driver.c |  107 +++++++++++++++++++++++++++++++++----
>  1 files changed, 95 insertions(+), 12 deletions(-)
> 
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index 967f545..fe034f6 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -1499,18 +1499,88 @@ parallelsApplyVideoParams(parallelsDomObjPtr pdom,
>      return 0;
>  }
>  
> -static int
> -parallelsApplyDisksParams(parallelsDomObjPtr pdom,
> -                          virDomainDiskDefPtr *olddisks, int nold,
> -                          virDomainDiskDefPtr *newdisks, int nnew)
> +static int parallelsAddHddByVolume(parallelsDomObjPtr pdom,
> +                                   virDomainDiskDefPtr disk,
> +                                   virStoragePoolObjPtr pool,
> +                                   virStorageVolDefPtr voldef)
>  {
> -    /* TODO: allow creating and removing disks */
> -    if (nold != nnew) {
> -        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> -                       _("Adding and removing disks is not supported"));
> +    int ret = -1;
> +    virCommandPtr cmd = virCommandNewArgList(PRLCTL, "set", pdom->uuid,
> +                                             "--device-add", "hdd", NULL);
> +    virCommandAddArgFormat(cmd, "--size=%lluM", voldef->capacity >> 20);
> +
> +    const char *strbus;

  again need to be moved to  block start

> +    if (!(strbus = parallelsGetDiskBusName(disk->bus))) {
> +        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
> +                       _("Invalid disk bus: %d"), disk->bus);
> +        goto cleanup;
> +    }
> +
> +    virCommandAddArgFormat(cmd, "--iface=%s", strbus);
> +
> +    if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE)
> +        virCommandAddArgFormat(cmd, "--position=%d",
> +                               disk->info.addr.drive.target);
> +
> +    if (virCommandRun(cmd, NULL))
> +        goto cleanup;
> +
> +    if (parallelsStorageVolumeDefRemove(pool, voldef))
> +        goto cleanup;
> +
> +    ret = 0;
> +cleanup:
> +    virCommandFree(cmd);
> +    return ret;
> +}
> +
> +static int parallelsAddHdd(virConnectPtr conn,
> +                           parallelsDomObjPtr pdom,
> +                           virDomainDiskDefPtr disk)
> +{
> +    parallelsConnPtr privconn = conn->privateData;
> +    virStorageVolDefPtr voldef = NULL;
> +    virStoragePoolObjPtr pool = NULL;
> +    virStorageVolPtr vol = NULL;
> +    int ret = -1;
> +
> +    if (!(vol = parallelsStorageVolumeLookupByPathLocked(conn, disk->src))) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("Can't find volume with path '%s'"), disk->src);
>          return -1;
>      }
>  
> +    pool = virStoragePoolObjFindByName(&privconn->pools, vol->pool);
> +    if (!pool) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("Can't find storage pool with name '%s'"),
> +                       vol->pool);
> +        goto cleanup;
> +    }
> +
> +    voldef = virStorageVolDefFindByPath(pool, disk->src);
> +    if (!voldef) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("Can't find storage volume definition for path '%s'"),
> +                       disk->src);
> +        goto cleanup;
> +    }
> +
> +    ret = parallelsAddHddByVolume(pdom, disk, pool, voldef);
> +
> +cleanup:
> +    if (pool)
> +        virStoragePoolObjUnlock(pool);
> +    virObjectUnref(vol);
> +    return ret;
> +}
> +
> +static int
> +parallelsApplyDisksParams(virConnectPtr conn, parallelsDomObjPtr pdom,
> +                          virDomainDiskDefPtr *olddisks, int nold,
> +                          virDomainDiskDefPtr *newdisks, int nnew)
> +{
>      for (int i = 0; i < nold; i++) {

  more here

>          virDomainDiskDefPtr newdisk = NULL;
>          virDomainDiskDefPtr olddisk = olddisks[i];
> @@ -1544,7 +1614,7 @@ parallelsApplyDisksParams(parallelsDomObjPtr pdom,
>  
>              if (!(strbus = parallelsGetDiskBusName(newdisk->bus))) {
>                  virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
> -                               _("Unsupported disk bus: %d", newdisk->bus));
> +                               _("Unsupported disk bus: %d"), newdisk->bus);

  interesting bug, I'm surprized this wasn't caught at compile time

>                  return -1;
>              }
>  
> @@ -1557,11 +1627,24 @@ parallelsApplyDisksParams(parallelsDomObjPtr pdom,
>          }
>      }
>  
> +    for (int i = 0; i < nnew; i++) {
> +        virDomainDiskDefPtr newdisk = newdisks[i];
> +        bool found = false;
> +        for (int j = 0; j < nold; j++)

  same for variable declarations

> +            if (STREQ_NULLABLE(olddisks[j]->dst, newdisk->dst))
> +                found = true;
> +        if (found)
> +            continue;
> +
> +        if (parallelsAddHdd(conn, pdom, newdisk))
> +            return -1;
> +    }
> +
>      return 0;
>  }
>  
>  static int
> -parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
> +parallelsApplyChanges(virConnectPtr conn, virDomainObjPtr dom, virDomainDefPtr new)
>  {
>      char buf[32];
>  
> @@ -1794,7 +1877,7 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
>      if (parallelsApplyVideoParams(pdom, old->videos, old->nvideos,
>                                     new->videos, new->nvideos) < 0)
>          return -1;
> -    if (parallelsApplyDisksParams(pdom, old->disks, old->ndisks,
> +    if (parallelsApplyDisksParams(conn, pdom, old->disks, old->ndisks,
>                                    new->disks, new->ndisks) < 0)
>          return -1;
>  
> @@ -1928,7 +2011,7 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
>  
>      if (dupVM == 1) {
>          olddom = virDomainFindByUUID(&privconn->domains, def->uuid);
> -        if (parallelsApplyChanges(olddom, def) < 0) {
> +        if (parallelsApplyChanges(conn, olddom, def) < 0) {
>              virDomainObjUnlock(olddom);
>              goto cleanup;
>          }

squashing the following in:

diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index 60bf8b5..118dc13 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -1505,12 +1505,12 @@ static int parallelsAddHddByVolume(parallelsDomObjPtr pdom,
                                    virStorageVolDefPtr voldef)
 {
     int ret = -1;
+    const char *strbus;
+
     virCommandPtr cmd = virCommandNewArgList(PRLCTL, "set", pdom->uuid,
                                              "--device-add", "hdd", NULL);
     virCommandAddArgFormat(cmd, "--size=%lluM", voldef->capacity >> 20);
 
-    const char *strbus;
-
     if (!(strbus = parallelsGetDiskBusName(disk->bus))) {
         virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
                        _("Invalid disk bus: %d"), disk->bus);
@@ -1597,10 +1597,12 @@ parallelsApplyDisksParams(virConnectPtr conn, parallelsDomObjPtr pdom,
                           virDomainDiskDefPtr *olddisks, int nold,
                           virDomainDiskDefPtr *newdisks, int nnew)
 {
-    for (int i = 0; i < nold; i++) {
+    int i, j;
+
+    for (i = 0; i < nold; i++) {
         virDomainDiskDefPtr newdisk = NULL;
         virDomainDiskDefPtr olddisk = olddisks[i];
-        for (int j = 0; j < nnew; j++) {
+        for (j = 0; j < nnew; j++) {
             if (STREQ_NULLABLE(newdisks[j]->dst, olddisk->dst)) {
                 newdisk = newdisks[j];
                 break;
@@ -1647,10 +1649,10 @@ parallelsApplyDisksParams(virConnectPtr conn, parallelsDomObjPtr pdom,
         }
     }
 
-    for (int i = 0; i < nnew; i++) {
+    for (i = 0; i < nnew; i++) {
         virDomainDiskDefPtr newdisk = newdisks[i];
         bool found = false;
-        for (int j = 0; j < nold; j++)
+        for (j = 0; j < nold; j++)
             if (STREQ_NULLABLE(olddisks[j]->dst, newdisk->dst))
                 found = true;
         if (found)

Daniel

-- 
Daniel Veillard      | Open Source and Standards, Red Hat
veillard at redhat.com  | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list