[libvirt] [PATCH v8 8/8] parallels: implement VM creation
Peter Krempa
pkrempa at redhat.com
Fri Jul 20 15:41:01 UTC 2012
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?)
> + 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;
>
More information about the libvir-list
mailing list