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

Maxim Nestratov mnestratov at parallels.com
Tue Nov 25 12:52:54 UTC 2014


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 at 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);




More information about the libvir-list mailing list