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

Dmitry Guryanov dguryanov at parallels.com
Thu Nov 27 18:55:17 UTC 2014


On Tuesday 25 November 2014 15:52:54 Maxim Nestratov wrote:
> 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.
> 

OK

> > +
> > +    confParam.nVmType = PVT_CT;
> > +    confParam.sConfigSample = "vswap.1024MB";
> > +    confParam.nOsVersion = 0;
> > +
> 
> PrlVmCfg_SetVmType(sdkdom, PVT_CT) should be called here

type already specified in confParam, so we don't need to call this function.

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

-- 
Dmitry Guryanov




More information about the libvir-list mailing list