Implement VIR_DOMAIN_UNDEFINE_MANAGED_SAVE and VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA flags support. Signed-off-by: Maxim Nestratov <mnestratov@xxxxxxxxxxxxx> --- src/vz/vz_driver.c | 5 ++-- src/vz/vz_sdk.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++- src/vz/vz_sdk.h | 2 +- 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 2ef47e4..2452d96 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -961,12 +961,13 @@ vzDomainUndefineFlags(virDomainPtr domain, virDomainObjPtr dom = NULL; int ret; - virCheckFlags(0, -1); + virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE | + VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA, -1); if (!(dom = vzDomObjFromDomain(domain))) return -1; - ret = prlsdkUnregisterDomain(privconn, dom); + ret = prlsdkUnregisterDomain(privconn, dom, flags); if (ret) virObjectUnlock(dom); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index fb6d3f4..b78c413 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3756,15 +3756,101 @@ prlsdkDetachDomainHardDisks(PRL_HANDLE sdkdom) return ret; } +/** + * prlsdkDomainHasSnapshots: + * + * This function detects where a domain specified by @sdkdom + * has snapshots. It doesn't count them correctly. + * + * @sdkdom: domain handle + * @found: a value more than zero if snapshots present + * + * Returns 0 if function succeeds, -1 otherwise. + */ +static int +prlsdkDomainHasSnapshots(PRL_HANDLE sdkdom, int* found) +{ + int ret = -1; + PRL_RESULT pret; + PRL_HANDLE job; + PRL_HANDLE result; + char *snapshotxml = NULL; + unsigned int len, paramsCount; + xmlDocPtr xml = NULL; + xmlXPathContextPtr ctxt = NULL; + + if (!found) + goto cleanup; + job = PrlVm_GetSnapshotsTreeEx(sdkdom, PGST_WITHOUT_SCREENSHOTS); + if (PRL_FAILED(getJobResult(job, &result))) + goto cleanup; + + pret = PrlResult_GetParamsCount(result, ¶msCount); + prlsdkCheckRetGoto(pret, cleanup); + + if (!paramsCount) + goto cleanup; + + pret = PrlResult_GetParamAsString(result, 0, &len); + prlsdkCheckRetGoto(pret, cleanup); + + if (VIR_ALLOC_N(snapshotxml, len+1) < 0) + goto cleanup; + + pret = PrlResult_GetParamAsString(result, snapshotxml, &len); + prlsdkCheckRetGoto(pret, cleanup); + + if (len <= 1) { + /* The document is empty that means no snapshots */ + *found = 0; + ret = 0; + goto cleanup; + } + + if (!(xml = virXMLParseStringCtxt(snapshotxml, "SavedStateItem", &ctxt))) + goto cleanup; + + *found = virXMLChildElementCount(ctxt->node); + ret = 0; + + cleanup: + + xmlXPathFreeContext(ctxt); + xmlFreeDoc(xml); + VIR_FREE(snapshotxml); + return ret; +} int -prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom) +prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags) { vzDomObjPtr privdom = dom->privateData; PRL_HANDLE job; size_t i; + int snapshotfound = 0; + VIRTUAL_MACHINE_STATE domainState; + + if (prlsdkGetDomainState(privdom->sdkdom, &domainState) < 0) + return -1; + + if (VMS_SUSPENDED == domainState && + !(flags & VIR_DOMAIN_UNDEFINE_MANAGED_SAVE)) { + + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Refusing to undefine while domain managed " + "save image exists")); + return -1; + } + + if (prlsdkDomainHasSnapshots(privdom->sdkdom, &snapshotfound) < 0) + return -1; + if (snapshotfound && !(flags & VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Refusing to undefine while snapshots exist")); + return -1; + } if (prlsdkDetachDomainHardDisks(privdom->sdkdom)) return -1; diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index 88ee7d9..ff6be07 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -58,7 +58,7 @@ prlsdkApplyConfig(virConnectPtr conn, int prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def); int prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def); int -prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom); +prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags); int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -- 2.4.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list