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

Dmitry Guryanov dguryanov at parallels.com
Mon Jun 25 08:58:03 UTC 2012


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 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 c415082..b097599 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"));
+        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);
 
 #endif
diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c
index 05ac95d..825afa7 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;
-- 
1.7.1




More information about the libvir-list mailing list