[libvirt] [PATCH v2 9/9] pvs: implement VM creation

Stefan Berger stefanb at linux.vnet.ibm.com
Wed Apr 18 19:57:32 UTC 2012


On 04/18/2012 02:07 PM, Dmitry Guryanov wrote:
> To create a new VM in PVS we should issue "prlctl create" command,
> and give path to the directory, where VM should be created. VM's
> storage will be in that directory later. So in this first version
> find out location of first VM's hard disk and create VM there.
>
>
[...]
> +static int
> +pvsCreateVm(virConnectPtr conn, virDomainDefPtr def)
> +{
> +    pvsConnPtr privconn = conn->privateData;
> +    int i;
> +    virStorageVolDefPtr privvol = NULL;
> +    virStoragePoolObjPtr pool = NULL;
> +    virStorageVolPtr vol = NULL;
> +	char uuidstr[VIR_UUID_STRING_BUFLEN];
> +

Spacing.

> +    for (i = 0; i<  def->ndisks; i++) {
> +        if (def->disks[i]->device != VIR_DOMAIN_DISK_DEVICE_DISK)
> +            continue;
> +
> +        vol = pvsStorageVolumeLookupByPathLocked(conn, def->disks[i]->src);
> +        if (!vol) {
> +            pvsError(VIR_ERR_INVALID_ARG,
> +                     _("Can't find volume with path '%s'"),
> +                     def->disks[i]->src);
> +            return -1;
> +        }
> +        break;
> +    }
> +
> +    if (!vol) {
> +        pvsError(VIR_ERR_INVALID_ARG,
> +                 _("Can't create VM without hard disks"));
> +        return -1;
> +    }
> +
> +    pool = virStoragePoolObjFindByName(&privconn->pools, vol->pool);
> +    if (!pool) {
> +        pvsError(VIR_ERR_INVALID_ARG,
> +                 _("Can't find storage pool with name '%s'"),
> +                 vol->pool);
> +        goto error;
> +    }
> +
> +    privvol = virStorageVolDefFindByPath(pool, def->disks[i]->src);
> +    if (!privvol) {
> +        pvsError(VIR_ERR_INVALID_ARG,
> +                 _("Can't find storage volume definition for path '%s'"),
> +                 def->disks[i]->src);
> +        goto error2;
> +    }
> +
> +	virUUIDFormat(def->uuid, uuidstr);
> +

Spacing.

> +    if (pvsCmdRun(PRLCTL, "create", def->name, "--dst",
> +                  pool->def->target.path, "--no-hdd", "--uuid", uuidstr, NULL))
> +        goto error2;

Nit: Check for '< 0' ?

> +
> +    if (pvsCmdRun(PRLCTL, "set", def->name, "--vnc-mode", "auto", NULL))
> +        goto error2;
> +
> +    virStoragePoolObjUnlock(pool);
> +    virUnrefStorageVol(vol);
> +
> +    return 0;
> +
> +  error2:
> +    virStoragePoolObjUnlock(pool);
> +  error:
> +    virUnrefStorageVol(vol);
> +    return -1;
> +}
> +
>   static virDomainPtr
>   pvsDomainDefineXML(virConnectPtr conn, const char *xml)
>   {
> @@ -1122,8 +1189,16 @@ pvsDomainDefineXML(virConnectPtr conn, const char *xml)
>
>           def = NULL;
>       } else {
> -        pvsError(VIR_ERR_NO_SUPPORT, _("Not implemented yet"));
> +        if (pvsCreateVm(conn, def))
>               goto cleanup;


Nit: Check for < 0.

> +        if (pvsLoadDomains(privconn, def->name))
> +            goto cleanup;

Probably here too.


So, I guess I found a lot of 'easy' stuff, but otherwise it looks ok to 
me also.

     Stefan




More information about the libvir-list mailing list