[libvirt] [PATCH 1/3 v3] vz: allow to create container based on template
Dmitry Guryanov
dguryanov at virtuozzo.com
Tue Dec 22 15:02:56 UTC 2015
On Tue, 2015-12-15 at 14:43 +0300, Mikhail Feoktistov wrote:
> We shouldn't delete disk from default config if we create container
> based on template,
> because we don't have the new disk from XML, only template name.
> And don't add template section from XML as new filesystem,
> we use PrlVmCfg_SetOsTemplate function to set template name.
> Do not set PRNVM_PRESERVE_DISK flag in PrlVm_RegEx() call,
> because this will cause an error during CT startup.
ACK
> ---
> diff from v2:
> fix syntax check
>
> diff from v1:
> Remove unusable variable (PRL_VM_DEV_EMULATION_TYPE emul)
> Add parameter useCtTemplateFs in prlsdkDoApplyConfig() function
> Allow only one fs with "template" type and only for CT creation
> Move this commit to patch series
>
> src/vz/vz_sdk.c | 41 +++++++++++++++++++++++++++++++----------
> 1 file changed, 31 insertions(+), 10 deletions(-)
>
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index 2b031c9..c5f8edd 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -2107,12 +2107,13 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE
> sdkdom, virDomainDefPtr def)
> return 0;
> }
>
> -static int prlsdkClearDevices(PRL_HANDLE sdkdom)
> +static int prlsdkClearDevices(PRL_HANDLE sdkdom, bool skipdisk)
> {
> PRL_RESULT pret;
> PRL_UINT32 n, i;
> PRL_HANDLE devList;
> PRL_HANDLE dev;
> + PRL_DEVICE_TYPE devType;
> int ret = -1;
>
> pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
> @@ -2128,6 +2129,15 @@ static int prlsdkClearDevices(PRL_HANDLE
> sdkdom)
> pret = PrlHndlList_GetItem(devList, i, &dev);
> prlsdkCheckRetGoto(pret, cleanup);
>
> + if (skipdisk) {
> + pret = PrlVmDev_GetType(dev, &devType);
> + prlsdkCheckRetGoto(pret, cleanup);
> +
> + if (devType == PDE_HARD_DISK) {
> + PrlHandle_Free(dev);
> + continue;
> + }
> + }
> pret = PrlVmDev_Remove(dev);
> PrlHandle_Free(dev);
> }
> @@ -3470,7 +3480,8 @@ static int
> prlsdkDoApplyConfig(virConnectPtr conn,
> PRL_HANDLE sdkdom,
> virDomainDefPtr def,
> - virDomainDefPtr olddef)
> + virDomainDefPtr olddef,
> + bool useCtTemplateFs)
> {
> PRL_RESULT pret;
> size_t i;
> @@ -3526,7 +3537,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
> }
> prlsdkCheckRetGoto(pret, error);
>
> - if (prlsdkClearDevices(sdkdom) < 0)
> + if (prlsdkClearDevices(sdkdom, useCtTemplateFs) < 0)
> goto error;
>
> if (prlsdkRemoveBootDevices(sdkdom) < 0)
> @@ -3554,6 +3565,12 @@ prlsdkDoApplyConfig(virConnectPtr conn,
> }
>
> for (i = 0; i < def->nfss; i++) {
> + if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
> + if (useCtTemplateFs)
> + continue;
> + else
> + goto error;
> + }
> if (STREQ(def->fss[i]->dst, "/"))
> needBoot = false;
> if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
> @@ -3602,7 +3619,7 @@ prlsdkApplyConfig(virConnectPtr conn,
> if (PRL_FAILED(waitJob(job)))
> return -1;
>
> - ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);
> + ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def, false);
>
> if (ret == 0) {
> job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
> @@ -3642,7 +3659,7 @@ prlsdkCreateVm(virConnectPtr conn,
> virDomainDefPtr def)
> pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0);
> prlsdkCheckRetGoto(pret, cleanup);
>
> - ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
> + ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL, false);
> if (ret)
> goto cleanup;
>
> @@ -3665,8 +3682,9 @@ prlsdkCreateCt(virConnectPtr conn,
> virDomainDefPtr def)
> PRL_HANDLE result = PRL_INVALID_HANDLE;
> PRL_RESULT pret;
> int ret = -1;
> - int useTemplate = 0;
> + bool useTemplate = false;
> size_t i;
> + PRL_UINT32 flags = 0;
>
> if (def->nfss > 1) {
> /* Check all filesystems */
> @@ -3679,7 +3697,7 @@ prlsdkCreateCt(virConnectPtr conn,
> virDomainDefPtr def)
> }
> } else if (def->nfss == 1) {
> if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
> - useTemplate = 1;
> + useTemplate = true;
> } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("Unsupported filesystem type."));
> @@ -3704,12 +3722,15 @@ prlsdkCreateCt(virConnectPtr conn,
> virDomainDefPtr def)
>
> }
>
> - ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
> + ret = prlsdkDoApplyConfig(conn, s4dkdom, def, NULL,
> useTemplate);
> if (ret)
> goto cleanup;
>
> - job = PrlVm_RegEx(sdkdom, "",
> - PACF_NON_INTERACTIVE_MODE |
> PRNVM_PRESERVE_DISK);
> + flags = PACF_NON_INTERACTIVE_MODE;
> + if (!useTemplate)
> + flags = flags | PRNVM_PRESERVE_DISK;
> +
> + job = PrlVm_RegEx(sdkdom, "", flags);
> if (PRL_FAILED(waitJob(job)))
> ret = -1;
>
More information about the libvir-list
mailing list