[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