[libvirt] [PATCH 4/4] vz: support filesystem type volume

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Mon Jul 11 10:06:55 UTC 2016



On 06.07.2016 17:02, Olga Krishtal wrote:
> Vz containers are able to use ploop volumes from storage pools
> to work upon.
> 
> To use filesystem type volume, pool name and volume name should be
> specifaed in <source> :
>    <filesystem type='volume' accessmode='passthrough'>
>       <driver type='ploop' format='ploop'/>
>       <source pool='guest_images' volume='TEST_POOL_CT'/>
>       <target dir='/'/>
>    </filesystem>
> 
> The information about pool and volume is stored in ct dom configuration:
> <StorageURL>libvirt://localhost/pool_name/vol_name</StorageURL>
> and can be easily obtained via PrlVmDevHd_GetStorageURL sdk call.
> 
> The only shorcoming: if storage pool is moved somewhere the ct
> should be redefined in order to refresh the information aboot path
> to root.hdd
> 
> Signed-off-by: Olga Krishtal <okrishtal at virtuozzo.com>
> ---
>  src/storage/storage_driver.c |   4 +-
>  src/vz/vz_driver.c           |   2 +-
>  src/vz/vz_sdk.c              | 126 +++++++++++++++++++++++++++++++++++++++----
>  src/vz/vz_sdk.h              |   2 +-
>  4 files changed, 120 insertions(+), 14 deletions(-)
> 
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index cb9d578..99e9df2 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -3508,7 +3508,9 @@ virStorageTranslateDiskSourcePool(virConnectPtr conn,
>          case VIR_STORAGE_VOL_BLOCK:
>              def->src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
>              break;
> -
> +        case VIR_STORAGE_VOL_PLOOP:
> +            def->src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
> +            break;

please keep original spacing, keep emply line

>          case VIR_STORAGE_VOL_NETWORK:
>          case VIR_STORAGE_VOL_NETDIR:
>              virReportError(VIR_ERR_INTERNAL_ERROR,
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index b17cea7..811a3c4 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -762,7 +762,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
>              if (prlsdkCreateVm(driver, def))
>                  goto cleanup;
>          } else if (def->os.type == VIR_DOMAIN_OSTYPE_EXE) {
> -            if (prlsdkCreateCt(driver, def))
> +            if (prlsdkCreateCt(conn, driver, def))

driver is the top most object, convention is to place it object with broader scope first
here driver is better place before conn

>                  goto cleanup;
>          } else {
>              virReportError(VIR_ERR_INVALID_ARG,
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index dd7eb6e..43832f0 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -33,6 +33,7 @@
>  #include "virtime.h"
>  #include "virhostcpu.h"
>  
> +#include "storage/storage_driver.h"
>  #include "vz_sdk.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_PARALLELS
> @@ -645,6 +646,9 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>  {
>      char *buf = NULL;
>      int ret = -1;
> +    char *storage = NULL;

i'd use existing buf

> +    char **matches = NULL;
> +    virURIPtr uri = NULL;
>  
>      fs->type = VIR_DOMAIN_FS_TYPE_FILE;
>      fs->fsdriver = VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP;
> @@ -655,12 +659,50 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>      fs->readonly = false;
>      fs->symlinksResolved = false;
>  
> -    if (!(buf = prlsdkGetStringParamVar(PrlVmDev_GetImagePath, prldisk)))
> +    if (!(storage = prlsdkGetStringParamVar(PrlVmDevHd_GetStorageURL, prldisk)))
>          goto cleanup;
>  
> -    fs->src->path = buf;
> -    buf = NULL;
> +    if (!virStringIsEmpty(storage)) {
> +        if (!(uri = virURIParse(storage)))
> +            goto cleanup;
> +        if (STRNEQ("libvirt", uri->scheme)) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("unknown backend for filesystem: '%s'"),
> +                           uri->scheme);

i'd better type 'unexpected uri scheme', backend is not relevant in this context.

> +            goto cleanup;
> +        }
> +
> +        if (!(matches = virStringSplitCount(uri->path, "/", 0, NULL)) ||
> +            !matches[0]) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("splitting StorageUrl failed %s"), uri->path);
> +            goto cleanup;
> +        }
> +        if (!matches[1]) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("can't identify pool %s"), matches[1]);

message is not very useful, matches[1] is NULL ))

> +            goto cleanup;
> +        }
> +        if (!matches[2]) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("can't identify volume %s"), matches[2]);
> +            goto cleanup;
> +        }

i'd merge above checks into one using a chain of ||.

> +        fs->type = VIR_DOMAIN_FS_TYPE_VOLUME;
> +        if (VIR_ALLOC(fs->src->srcpool) < 0)
> +            goto cleanup;
> +        if (VIR_STRDUP(fs->src->srcpool->pool, matches[1]) < 0)
> +            goto cleanup;
> +        if (VIR_STRDUP(fs->src->srcpool->volume, matches[2]) < 0)
> +            goto cleanup;
> +    } else {

i would move "fs->type = VIR_DOMAIN_FS_TYPE_FILE" here

> +
> +        if (!(buf = prlsdkGetStringParamVar(PrlVmDev_GetImagePath, prldisk)))
> +            goto cleanup;
>  
> +        fs->src->path = buf;
> +        buf = NULL;
> +    }
>      if (!(buf = prlsdkGetStringParamVar(PrlVmDevHd_GetMountPoint, prldisk)))
>          goto cleanup;
>  
> @@ -671,6 +713,8 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>  
>   cleanup:
>      VIR_FREE(buf);
> +    VIR_FREE(storage);
> +    virStringFreeList(matches);
>      return ret;
>  }
>  
> @@ -1680,7 +1724,6 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom)
>      PRL_HANDLE job;
>  
>      virCheckNonNullArgGoto(dom, error);
> -

irrelevant

>      pdom = dom->privateData;
>      sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid);
>      if (sdkdom == PRL_INVALID_HANDLE)
> @@ -1721,7 +1764,6 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom)
>      /* depends on prlsdkAddVNCInfo */
>      if (prlsdkAddDomainHardware(driver, sdkdom, def) < 0)
>          goto error;
> -

irrelevant

>      /* depends on prlsdkAddDomainHardware */
>      if (prlsdkConvertBootOrder(sdkdom, def) < 0)
>          goto error;
> @@ -2695,7 +2737,8 @@ static int prlsdkCheckNetUnsupportedParams(virDomainNetDefPtr net)
>  
>  static int prlsdkCheckFSUnsupportedParams(virDomainFSDefPtr fs)
>  {
> -    if (fs->type != VIR_DOMAIN_FS_TYPE_FILE) {
> +    if (fs->type != VIR_DOMAIN_FS_TYPE_FILE &&
> +        fs->type != VIR_DOMAIN_FS_TYPE_VOLUME) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                         _("Only file based filesystems are "
>                           "supported by vz driver."));

i think message need to be updated

> @@ -3508,12 +3551,14 @@ prlsdkUpdateDevice(vzDriverPtr driver,
>      return 0;
>  }
>  
> +
>  static int
>  prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
>  {
>      PRL_RESULT pret;
>      PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
>      int ret = -1;
> +    char *storage = NULL;
>  
>      if (fs->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
>          return 0;
> @@ -3524,6 +3569,14 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
>      pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk);
>      prlsdkCheckRetGoto(pret, cleanup);
>  
> +    if (fs->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
> +        if (virAsprintf(&storage, "libvirt://localhost/%s/%s", fs->src->srcpool->pool,
> +                        fs->src->srcpool->volume) < 0)
> +            goto cleanup;
> +        pret = PrlVmDevHd_SetStorageURL(sdkdisk, storage);
> +        prlsdkCheckRetGoto(pret, cleanup);
> +    }
> +
>      pret = PrlVmDev_SetEnabled(sdkdisk, 1);
>      prlsdkCheckRetGoto(pret, cleanup);
>  
> @@ -3548,6 +3601,7 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
>      ret = 0;
>  
>   cleanup:
> +    VIR_FREE(storage);
>      PrlHandle_Free(sdkdisk);
>      return ret;
>  }
> @@ -3767,7 +3821,6 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
>          if (prlsdkSetBootOrderVm(sdkdom, def) < 0)
>              goto error;
>      }
> -
>      return 0;
>  
>   error:
> @@ -3791,7 +3844,6 @@ prlsdkApplyConfig(vzDriverPtr driver,
>      sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid);
>      if (sdkdom == PRL_INVALID_HANDLE)
>          return -1;
> -
>      job = PrlVm_BeginEdit(sdkdom);
>      if (PRL_FAILED(waitJob(job)))
>          return -1;
> @@ -3803,7 +3855,6 @@ prlsdkApplyConfig(vzDriverPtr driver,
>          if (PRL_FAILED(waitJob(job)))
>              ret = -1;
>      }
> -
>      PrlHandle_Free(sdkdom);
>  
>      return ret;
> @@ -3848,8 +3899,52 @@ prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def)
>      return ret;
>  }
>  
> +static int
> +virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src)
> +{
> +
> +    virStoragePoolPtr pool = NULL;
> +    virStorageVolPtr vol = NULL;
> +    virStorageVolInfo info;
> +    int ret = -1;
> +
> +    if (!(pool = virStoragePoolLookupByName(conn, src->srcpool->pool)))
> +        return -1;
> +    if (virStoragePoolIsActive(pool) != 1) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("storage pool '%s' containing volume '%s' "
> +                         "is not active"), src->srcpool->pool,
> +                       src->srcpool->volume);
> +        goto cleanup;
> +    }
> +
> +    if (!(vol = virStorageVolLookupByName(pool, src->srcpool->volume)))
> +        goto cleanup;
> +
> +    if (virStorageVolGetInfo(vol, &info) < 0)
> +        goto cleanup;
> +
> +    if (info.type != VIR_STORAGE_VOL_PLOOP) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("Unsupported volume format '%s'"),
> +                       virStorageVolTypeToString(info.type));
> +        goto cleanup;
> +    }
> +
> +    if (!(src->path = virStorageVolGetPath(vol)))
> +        goto cleanup;
> +
> +    ret = 0;
> +
> + cleanup:
> +    virObjectUnref(pool);
> +    virObjectUnref(vol);
> +    return ret;
> +}
> +
> +
>  int
> -prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def)
> +prlsdkCreateCt(virConnectPtr conn, vzDriverPtr driver, virDomainDefPtr def)
>  {
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>      PRL_GET_VM_CONFIG_PARAM_DATA confParam;
> @@ -3859,9 +3954,18 @@ prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def)
>      PRL_UINT32 flags;
>      int ret = -1;
>      int useTemplate = 0;
> +    size_t i;
>  
> -    if (def->nfss == 1 && def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
> +    if (def->nfss == 1 && def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
>          useTemplate = 1;
> +    } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) {

why you check def->fss[0]->type ?

> +        for (i = 0; i < def->nfss; i++) {
> +            if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
> +                if (virStorageTranslatePoolLocal(conn, def->fss[i]->src) < 0)
> +                    goto cleanup;
> +            }
> +        }
> +    }
>  
>      confParam.nVmType = PVT_CT;
>      confParam.sConfigSample = "vswap.1024MB";
> diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
> index 41557a3..4767fdd 100644
> --- a/src/vz/vz_sdk.h
> +++ b/src/vz/vz_sdk.h
> @@ -57,7 +57,7 @@ prlsdkApplyConfig(vzDriverPtr driver,
>                    virDomainObjPtr dom,
>                    virDomainDefPtr new);
>  int prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def);
> -int prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def);
> +int prlsdkCreateCt(virConnectPtr conn, vzDriverPtr driver, virDomainDefPtr def);
>  int
>  prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int flags);
>  int
> 

please drop irrelevant spacing changes, I've marked a few of them




More information about the libvir-list mailing list