[libvirt] [PATCH] vz: Allow to create container based on template
Mikhail Feoktistov
mfeoktistov at virtuozzo.com
Thu Dec 10 10:58:53 UTC 2015
24.11.2015 17:14, Dmitry Guryanov пишет:
> On Thu, 2015-11-19 at 14:44 +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.
>> ---
>> src/vz/vz_sdk.c | 33 +++++++++++++++++++++++++++++----
>> 1 file changed, 29 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
>> index 89c9e89..865cabe 100644
>> --- a/src/vz/vz_sdk.c
>> +++ b/src/vz/vz_sdk.c
>> @@ -2096,12 +2096,14 @@ 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;
>> + PRL_VM_DEV_EMULATION_TYPE emul;
>> int ret = -1;
>>
>> pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
>> @@ -2117,6 +2119,18 @@ 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);
>> +
>> + pret = PrlVmDev_GetEmulatedType(dev, &emul);
> Where do you use this emul?
This emul is unusable variable. Thanks.
>> + prlsdkCheckRetGoto(pret, cleanup);
>> +
>> + if (devType == PDE_HARD_DISK) {
>> + PrlHandle_Free(dev);
>> + continue;
>> + }
>> + }
>> pret = PrlVmDev_Remove(dev);
>> PrlHandle_Free(dev);
>> }
>> @@ -3465,6 +3479,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>> char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
>> bool needBoot = true;
>> char *mask = NULL;
>> + bool skipdisk = false;
>>
>> if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)
>> return -1;
>> @@ -3514,7 +3529,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>> }
>> prlsdkCheckRetGoto(pret, error);
>>
>> - if (prlsdkClearDevices(sdkdom) < 0)
>> + if (def->nfss == 1 &&
>> + def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
>> + skipdisk = true;
>> +
>> + if (prlsdkClearDevices(sdkdom, skipdisk) < 0)
>> goto error;
>>
> I think we should make this logic more robust. There is only one case,
> when VIR_DOMAIN_FS_TYPE_TEMPLATE fs is allowed - when we create new container.
> So I'd add a parameter to prlsdkDoApplyConfig, something like useCtTemplateFs,
> which means that we should have only one fs of type template and no disks.
Ok. done in patch v2.
>
>> if (prlsdkRemoveBootDevices(sdkdom) < 0)
>> @@ -3544,6 +3563,8 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>> for (i = 0; i < def->nfss; i++) {
>> if (STREQ(def->fss[i]->dst, "/"))
>> needBoot = false;
>> + if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
>> + continue;
> If fs with index different from 0 is VIR_DOMAIN_FS_TYPE_TEMPLATE - it's an
> error, also if we are not creating new ct - it's also error.
done in patch v2.
>
>> if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
>> goto error;
>> }
>> @@ -3655,6 +3676,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
>> int ret = -1;
>> int useTemplate = 0;
>> size_t i;
>> + PRL_UINT32 flags = 0;
>>
>> if (def->nfss > 1) {
>> /* Check all filesystems */
>> @@ -3696,8 +3718,11 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
>> 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;
> Why do you need to remove this flag to create ct from template? As I remember
> it's needed to keep disk images, which you've remove from config.
If we create ct from template with flag PRNVM_PRESERVE_DISK than error
occurs
err=SDabbot stat /vz/root/22eba3c0-05d7-452f-89df-5551ec2c85a1: No such
file or directory Failed to start the Container
So we should not set this flag se of create from template.
>> +
>> + job = PrlVm_RegEx(sdkdom, "", flags);
>> if (PRL_FAILED(waitJob(job)))
>> ret = -1;
>>
More information about the libvir-list
mailing list