[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v3 07/12] parallels: create VMs and containers with sdk



18.11.2014 16:17, Dmitry Guryanov пишет:
This patch replaces code, which creates domains by
running prlctl command.

prlsdkCreateVm/Ct will do prlsdkApplyConfig, because
we send request to the server only once in this case.

But prlsdkApplyConfig will be called also from
parallelsDomainDefineXML function. There is no problem with
it, parallelsDomainDefineXML will be refactored later.

Signed-off-by: Dmitry Guryanov <dguryanov parallels com>
---
  src/parallels/parallels_driver.c | 45 +---------------------
  src/parallels/parallels_sdk.c    | 83 +++++++++++++++++++++++++++++++++++++++-
  src/parallels/parallels_sdk.h    |  2 +
  3 files changed, 86 insertions(+), 44 deletions(-)

diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index 55ee003..582ffdb 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -657,47 +657,6 @@ parallelsDomainGetAutostart(virDomainPtr domain, int *autostart)
      return ret;
  }
-static int
-parallelsCreateVm(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainDefPtr def)
-{
-    char uuidstr[VIR_UUID_STRING_BUFLEN];
-
-    virUUIDFormat(def->uuid, uuidstr);
-
-    if (parallelsCmdRun(PRLCTL, "create", def->name, "--no-hdd",
-                        "--uuid", uuidstr, NULL) < 0)
-        return -1;
-
-    return 0;
-}
-
-static int
-parallelsCreateCt(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainDefPtr def)
-{
-    char uuidstr[VIR_UUID_STRING_BUFLEN];
-
-    virUUIDFormat(def->uuid, uuidstr);
-
-    if (def->nfss != 1 ||
-        def->fss[0]->type != VIR_DOMAIN_FS_TYPE_TEMPLATE) {
-
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("There must be only 1 template FS for "
-                         "container creation"));
-        goto error;
-    }
-
-    if (parallelsCmdRun(PRLCTL, "create", def->name, "--vmtype", "ct",
-                        "--uuid", uuidstr,
-                        "--ostemplate", def->fss[0]->src, NULL) < 0)
-        goto error;
-
-    return 0;
-
- error:
-    return -1;
-}
-
  static virDomainPtr
  parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
  {
@@ -720,10 +679,10 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
      if (olddom == NULL) {
          virResetLastError();
          if (STREQ(def->os.type, "hvm")) {
-            if (parallelsCreateVm(conn, def))
+            if (prlsdkCreateVm(conn, def))
                  goto cleanup;
          } else if (STREQ(def->os.type, "exe")) {
-            if (parallelsCreateCt(conn, def))
+            if (prlsdkCreateCt(conn, def))
                  goto cleanup;
          } else {
              virReportError(VIR_ERR_INVALID_ARG,
diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c
index bccb2d7..a943f4b 100644
--- a/src/parallels/parallels_sdk.c
+++ b/src/parallels/parallels_sdk.c
@@ -2506,7 +2506,6 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom,
error:
      return -1;
-
  }
int
@@ -2538,3 +2537,85 @@ prlsdkApplyConfig(virConnectPtr conn,
return ret;
  }
+
+int
+prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
+{
+    parallelsConnPtr privconn = conn->privateData;
+    PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+    PRL_HANDLE job = PRL_INVALID_HANDLE;
+    PRL_HANDLE result = PRL_INVALID_HANDLE;
+    PRL_HANDLE srvconf = PRL_INVALID_HANDLE;
+    PRL_RESULT pret;
+    int ret = -1;
+
+    pret = PrlSrv_CreateVm(privconn->server, &sdkdom);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+    job = PrlSrv_GetSrvConfig(privconn->server);
+    if (!(result = getJobResult(job, privconn->jobTimeout)))
+        goto cleanup;
+
+    pret = PrlResult_GetParamByIndex(result, 0, &srvconf);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+    pret = PrlVmCfg_SetDefaultConfig(sdkdom, srvconf, PVS_GUEST_VER_LIN_REDHAT, 0);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+    ret = prlsdkDoApplyConfig(sdkdom, def);
+    if (ret)
+        goto cleanup;
+
+    job = PrlVm_Reg(sdkdom, "", 1);
+    ret = waitJob(job, privconn->jobTimeout);
+
+ cleanup:
+    PrlHandle_Free(sdkdom);
+    return ret;
+}
+
+int
+prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
+{
+    parallelsConnPtr privconn = conn->privateData;
+    PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+    PRL_GET_VM_CONFIG_PARAM_DATA confParam;
+    PRL_HANDLE job = PRL_INVALID_HANDLE;
+    PRL_HANDLE result = PRL_INVALID_HANDLE;
+    PRL_RESULT pret;
+    int ret = -1;
+
+    if (def->nfss != 1 ||
+        def->fss[0]->type != VIR_DOMAIN_FS_TYPE_TEMPLATE) {
+
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("There must be only 1 template FS for "
+                         "container creation"));
+        return -1;
+    }
I'm not sure this is a mandatory parameter in case container is created with loop device.
+
+    confParam.nVmType = PVT_CT;
+    confParam.sConfigSample = "vswap.1024MB";
+    confParam.nOsVersion = 0;
+
PrlVmCfg_SetVmType(sdkdom, PVT_CT) should be called here
+    job = PrlSrv_GetDefaultVmConfig(privconn->server, &confParam, 0);
+    if (!(result = getJobResult(job, privconn->jobTimeout)))
+        goto cleanup;
+
+    pret = PrlResult_GetParamByIndex(result, 0, &sdkdom);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+
we have to skip this in case it is absent
     pret = PrlVmCfg_SetOsTemplate(sdkdom, def->fss[0]->src);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+    ret = prlsdkDoApplyConfig(sdkdom, def);
+    if (ret)
+        goto cleanup;
+
+    job = PrlVm_Reg(sdkdom, "", 1);
+    ret = waitJob(job, privconn->jobTimeout);
It is better to specify explicitly e.g.

 PrlVm_RegEx(sdkdom, "", PACF_NON_INTERACTIVE_MODE);
+
+ cleanup:
+    PrlHandle_Free(sdkdom);
+    return ret;
+}
diff --git a/src/parallels/parallels_sdk.h b/src/parallels/parallels_sdk.h
index 8de077c..b654c2a 100644
--- a/src/parallels/parallels_sdk.h
+++ b/src/parallels/parallels_sdk.h
@@ -48,3 +48,5 @@ int
  prlsdkApplyConfig(virConnectPtr conn,
                    virDomainObjPtr dom,
                    virDomainDefPtr new);
+int prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def);
+int prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]