[libvirt] [PATCH 3/3] vz: support additional flags in domain undefine

Dmitry Guryanov dguryanov at virtuozzo.com
Thu Dec 24 12:06:33 UTC 2015


On Tue, 2015-12-22 at 18:29 +0300, Maxim Nestratov wrote:
> Implement VIR_DOMAIN_UNDEFINE_MANAGED_SAVE and
> VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA flags support.
> 

ACKed and pushed, thanks!

> Signed-off-by: Maxim Nestratov <mnestratov at virtuozzo.com>
> ---
>  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, &paramsCount);
> +    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




More information about the libvir-list mailing list