[libvirt] [PATCH v8 8/8] parallels: implement VM creation

Dmitry Guryanov dguryanov at parallels.com
Fri Jul 20 19:42:49 UTC 2012


On 07/20/2012 07:41 PM, Peter Krempa wrote:
> On 07/04/12 19:42, Dmitry Guryanov wrote:
>> To create a new VM in PARALLELS 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.
>>
>> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
>> ---
>>   src/parallels/parallels_driver.c  |   78 
>> ++++++++++++++++++++++++++++++++++++-
>>   src/parallels/parallels_driver.h  |    4 ++
>>   src/parallels/parallels_storage.c |    6 +--
>>   3 files changed, 82 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/parallels/parallels_driver.c 
>> b/src/parallels/parallels_driver.c
>> index 8c8ddd8..3993228 100644
>> --- a/src/parallels/parallels_driver.c
>> +++ b/src/parallels/parallels_driver.c
>> @@ -1117,6 +1117,74 @@ parallelsApplyChanges(virDomainObjPtr dom, 
>> virDomainDefPtr newdef)
>>       return 0;
>>   }
>>
>> +static int
>> +parallelsCreateVm(virConnectPtr conn, virDomainDefPtr def)
>> +{
>> +    parallelsConnPtr privconn = conn->privateData;
>> +    int i;
>> +    virStorageVolDefPtr privvol = NULL;
>> +    virStoragePoolObjPtr pool = NULL;
>> +    virStorageVolPtr vol = NULL;
>> +    char uuidstr[VIR_UUID_STRING_BUFLEN];
>> +
>> +    for (i = 0; i < def->ndisks; i++) {
>> +        if (def->disks[i]->device != VIR_DOMAIN_DISK_DEVICE_DISK)
>> +            continue;
>> +
>> +        vol = parallelsStorageVolumeLookupByPathLocked(conn, 
>> def->disks[i]->src);
>> +        if (!vol) {
>> +            parallelsError(VIR_ERR_INVALID_ARG,
>> +                     _("Can't find volume with path '%s'"),
>> +                     def->disks[i]->src);
>> +            return -1;
>> +        }
>> +        break;
>> +    }
>> +
>> +    if (!vol) {
>> +        parallelsError(VIR_ERR_INVALID_ARG,
>> +                 _("Can't create VM without hard disks"));
>
> I'm not quite sure how this is with Parallels Virtuozzo, but it's a 
> not-so-uncommon use-case to have a diskless machine. (PXE booted with 
> network storage?)

It's not possible to select location of the VM, if the initial XML 
config doesn't include some disks.

We can create VM in default location instead of reporting an error, I 
can change the behaviour in
next version of these patches.


>
>> +        return -1;
>> +    }
>> +
>> +    pool = virStoragePoolObjFindByName(&privconn->pools, vol->pool);
>> +    if (!pool) {
>> +        parallelsError(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) {
>> +        parallelsError(VIR_ERR_INVALID_ARG,
>> +                 _("Can't find storage volume definition for path 
>> '%s'"),
>> +                 def->disks[i]->src);
>> +        goto error2;
>> +    }
>> +
>> +    virUUIDFormat(def->uuid, uuidstr);
>> +
>> +    if (parallelsCmdRun(PRLCTL, "create", def->name, "--dst",
>> +                  pool->def->target.path, "--no-hdd",
>> +                  "--uuid", uuidstr, NULL) < 0)
>> +        goto error2;
>> +
>> +    if (parallelsCmdRun(PRLCTL, "set", def->name, "--vnc-mode", 
>> "auto", NULL) < 0)
>> +        goto error2;
>> +
>> +    virStoragePoolObjUnlock(pool);
>> +    virUnrefStorageVol(vol);
>> +
>> +    return 0;
>> +
>> +  error2:
>> +    virStoragePoolObjUnlock(pool);
>> +  error:
>> +    virUnrefStorageVol(vol);
>> +    return -1;
>> +}
>> +
>>   static virDomainPtr
>>   parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
>>   {
>> @@ -1153,8 +1221,16 @@ parallelsDomainDefineXML(virConnectPtr conn, 
>> const char *xml)
>>
>>           def = NULL;
>>       } else {
>> -        parallelsError(VIR_ERR_NO_SUPPORT, _("Not implemented yet"));
>> +        if (parallelsCreateVm(conn, def))
>>               goto cleanup;
>> +        if (parallelsLoadDomains(privconn, def->name))
>> +            goto cleanup;
>> +        dom = virDomainFindByName(&privconn->domains, def->name);
>> +        if (!dom) {
>> +            parallelsError(VIR_ERR_INTERNAL_ERROR,
>> +                     _("Domain is not defined after creation"));
>> +            goto cleanup;
>> +        }
>>       }
>>
>>       event = virDomainEventNewFromObj(dom,
>> diff --git a/src/parallels/parallels_driver.h 
>> b/src/parallels/parallels_driver.h
>> index 6f06ac8..e32ad55 100644
>> --- a/src/parallels/parallels_driver.h
>> +++ b/src/parallels/parallels_driver.h
>> @@ -67,5 +67,9 @@ int parallelsCmdRun(const char *binary, ...) 
>> ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENT
>>   char * parallelsAddFileExt(const char *path, const char *ext);
>>   void parallelsDriverLock(parallelsConnPtr driver);
>>   void parallelsDriverUnlock(parallelsConnPtr driver);
>> +virStorageVolPtr parallelsStorageVolumeLookupByPathLocked(virConnectPtr
>> + conn,
>> + const char
>> + *path);
>
> Again, please use a separate header for the driver-internal definitions.
>
>>
>>   #endif
>> diff --git a/src/parallels/parallels_storage.c 
>> b/src/parallels/parallels_storage.c
>> index 5a5b366..c86ddaf 100644
>> --- a/src/parallels/parallels_storage.c
>> +++ b/src/parallels/parallels_storage.c
>> @@ -41,10 +41,6 @@ static virStorageVolDefPtr 
>> parallelsStorageVolumeDefine(virStoragePoolObjPtr poo
>>                                                     const char *xmldesc,
>>                                                     const char *xmlfile,
>>                                                     bool is_new);
>> -static virStorageVolPtr 
>> parallelsStorageVolumeLookupByPathLocked(virConnectPtr
>> - conn,
>> - const char
>> - *path);
>>   static virStorageVolPtr 
>> parallelsStorageVolumeLookupByPath(virConnectPtr conn,
>>                                                        const char 
>> *path);
>>   static int parallelsStoragePoolGetAlloc(virStoragePoolDefPtr def);
>> @@ -939,7 +935,7 @@ parallelsStorageVolumeLookupByKey(virConnectPtr 
>> conn, const char *key)
>>       return ret;
>>   }
>>
>> -static virStorageVolPtr
>> +virStorageVolPtr
>>   parallelsStorageVolumeLookupByPathLocked(virConnectPtr conn, const 
>> char *path)
>>   {
>>       parallelsConnPtr privconn = conn->privateData;
>>
>
>
>


-- 
Dmitry Guryanov




More information about the libvir-list mailing list