From: Dmitry Guryanov Date: Tue, 13 Jan 2015 11:27:40 +0000 (+0300) Subject: parallels: create container from existing image X-Git-Tag: v1.2.12-rc1~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2bc460d3c1422ff931d3eea8defbef224c8b6483;p=thirdparty%2Flibvirt.git parallels: create container from existing image It's possible to create a container with existing disk image as root filesystem. You need to remove existing disks from PCS VM config and then add a new one, pointing to your image. And then call PrlVm_RegEx with PRNVM_PRESERVE_DISK flag. With this patch you can create such container with something like this for new domain XML config: Signed-off-by: Dmitry Guryanov Signed-off-by: Michal Privoznik --- diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c index d161a1ca4a..d0d2ce2713 100644 --- a/src/parallels/parallels_sdk.c +++ b/src/parallels/parallels_sdk.c @@ -2907,14 +2907,26 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) PRL_HANDLE result = PRL_INVALID_HANDLE; PRL_RESULT pret; int ret = -1; + int useTemplate = 0; + size_t i; - if (def->nfss && (def->nfss > 1 || - def->fss[0]->type != VIR_DOMAIN_FS_TYPE_TEMPLATE)) { - - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("There must be no more than 1 template FS for " - "container creation")); - return -1; + if (def->nfss > 1) { + /* Check all filesystems */ + for (i = 0; i < def->nfss; i++) { + if (def->fss[i]->type != VIR_DOMAIN_FS_TYPE_FILE) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Unsupported filesystem type.")); + return -1; + } + } + } else if (def->nfss == 1) { + if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) { + useTemplate = 1; + } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Unsupported filesystem type.")); + return -1; + } } confParam.nVmType = PVT_CT; @@ -2928,22 +2940,24 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) pret = PrlResult_GetParamByIndex(result, 0, &sdkdom); prlsdkCheckRetGoto(pret, cleanup); - if (def->nfss == 1) { + if (useTemplate) { pret = PrlVmCfg_SetOsTemplate(sdkdom, def->fss[0]->src); prlsdkCheckRetGoto(pret, cleanup); + } ret = prlsdkDoApplyConfig(sdkdom, def); if (ret) goto cleanup; - job = PrlVm_RegEx(sdkdom, "", PACF_NON_INTERACTIVE_MODE); + job = PrlVm_RegEx(sdkdom, "", + PACF_NON_INTERACTIVE_MODE | PRNVM_PRESERVE_DISK); if (PRL_FAILED(waitJob(job, privconn->jobTimeout))) ret = -1; cleanup: PrlHandle_Free(sdkdom); - return -1; + return ret; } int