]> xenbits.xensource.com Git - libvirt.git/commitdiff
parallels: implement VM creation
authorDmitry Guryanov <dguryanov@parallels.com>
Tue, 31 Jul 2012 18:56:13 +0000 (22:56 +0400)
committerDaniel Veillard <veillard@redhat.com>
Wed, 1 Aug 2012 03:49:10 +0000 (11:49 +0800)
To create a new VM in Parallels Clud Server 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@parallels.com>
src/parallels/parallels_driver.c
src/parallels/parallels_storage.c
src/parallels/parallels_utils.h

index fd5275737f833029da98ea51c93c5bdbdf3c7cb9..b57ac9607a6fc568ac702f28c6bbf5783dd468bc 100644 (file)
@@ -1539,6 +1539,78 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
     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) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("Can't find volume with path '%s'"),
+                           def->disks[i]->src);
+            return -1;
+        }
+        break;
+    }
+
+    if (!vol) {
+        /* We determine path to VM directory from volume, so
+         * let's report error if no disk until better solution
+         * will be found */
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("Can't create VM '%s' without hard disks"),
+                       (def->name ? def->name : "no name"));
+        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 error;
+    }
+
+    privvol = virStorageVolDefFindByPath(pool, def->disks[i]->src);
+    if (!privvol) {
+        virReportError(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)
 {
@@ -1579,9 +1651,17 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
 
         def = NULL;
     } else {
-        virReportError(VIR_ERR_NO_SUPPORT, "%s",
-                       _("Not implemented yet"));
+        if (parallelsCreateVm(conn, def))
             goto cleanup;
+        if (parallelsLoadDomains(privconn, def->name))
+            goto cleanup;
+        dom = virDomainFindByName(&privconn->domains, def->name);
+        if (!dom) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Domain for '%s' is not defined after creation"),
+                           (def->name ? def->name : "no name"));
+            goto cleanup;
+        }
     }
 
     ret = virGetDomain(conn, dom->def->name, dom->def->uuid);
index 0ffe1fb3bc31e97817a93b86a1cf7af7e8a15089..72aadceb518c995572b81d64d811176afb1b188c 100644 (file)
@@ -43,9 +43,6 @@
 static virStorageVolDefPtr
 parallelsStorageVolumeDefine(virStoragePoolObjPtr pool, 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);
 
@@ -874,7 +871,7 @@ parallelsStorageVolumeLookupByKey(virConnectPtr conn, const char *key)
     return ret;
 }
 
-static virStorageVolPtr
+virStorageVolPtr
 parallelsStorageVolumeLookupByPathLocked(virConnectPtr conn, const char *path)
 {
     parallelsConnPtr privconn = conn->privateData;
index 7edf829b550400a5bd0fb8b23b90454d48002a17..082ee75671b6842c085b0ed1c09a63374b05277a 100644 (file)
@@ -60,5 +60,7 @@ int parallelsCmdRun(const char *binary, ...)
 char * parallelsAddFileExt(const char *path, const char *ext);
 void parallelsDriverLock(parallelsConnPtr driver);
 void parallelsDriverUnlock(parallelsConnPtr driver);
+virStorageVolPtr parallelsStorageVolumeLookupByPathLocked(virConnectPtr conn,
+                                                          const char *path);
 
 #endif