[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