On 07/14/2016 01:13 PM, Olga Krishtal wrote: > This patch supports pool and volume management within Virtuozzo Storage. > Virtuozzo Storage is a highly-available distributed software defined storage > with built-in replication and disaster recovery. From client's point of > view it looks like network attached storage (NFS or GlusterFS). > More information about vzstorage can be found here: https://openvz.org/Virtuozzo_Storage > It supports the same volume formats as directory, nfs, etc. > Default format is raw. > > Signed-off-by: Olga Krishtal <okrishtal@xxxxxxxxxxxxx> > --- > configure.ac | 31 +++++++++++ > docs/schemas/storagepool.rng | 29 ++++++++++ > include/libvirt/libvirt-storage.h | 1 + > src/conf/storage_conf.c | 16 +++++- > src/conf/storage_conf.h | 4 +- > src/storage/storage_backend.c | 3 + > src/storage/storage_backend_fs.c | 112 +++++++++++++++++++++++++++++++++++++- > src/storage/storage_backend_fs.h | 3 + > src/storage/storage_driver.c | 2 + > tools/virsh-pool.c | 2 + > tools/virsh.c | 3 + > 11 files changed, 203 insertions(+), 3 deletions(-) > In an effort to go through older on list bugs I'm wondering about the relative importance of this compared to the fspool series. Shall I assume this is dropped in favor of that? Tks - John FWIW: It compiled, but failed syntax-check. Also the name "vstorage" would seemingly be a bit too generic. I saw and thought virtual storage not Virtuozzo Storage > diff --git a/configure.ac b/configure.ac > index 2c81c95..2ee8b8c 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -1692,6 +1692,10 @@ AC_ARG_WITH([storage-zfs], > [AS_HELP_STRING([--with-storage-zfs], > [with ZFS backend for the storage driver @<:@default=check@:>@])], > [],[with_storage_zfs=check]) > +AC_ARG_WITH([storage-vstorage], > + [AS_HELP_STRING([--with-storage-vstorage], > + [with VZ backend for the storage driver @<:@default=check@:>@])], > + [],[with_storage_vstorage=check]) > > if test "$with_libvirtd" = "no"; then > with_storage_dir=no > @@ -1705,6 +1709,7 @@ if test "$with_libvirtd" = "no"; then > with_storage_sheepdog=no > with_storage_gluster=no > with_storage_zfs=no > + with_storage_vstorage=no > fi > if test "$with_storage_dir" = "yes" ; then > AC_DEFINE_UNQUOTED([WITH_STORAGE_DIR], 1, [whether directory backend for storage driver is enabled]) > @@ -1963,6 +1968,31 @@ if test "$with_storage_fs" = "yes" || > fi > fi > > +if test "$with_storage_vstorage" = "yes" || test "$with_storage_vstorage" = "check"; then > + AC_PATH_PROG([VSTORAGE], [vstorage], [], [$PATH:/sbin:/usr/bin]) > + AC_PATH_PROG([VSTORAGE_MOUNT], [vstorage-mount], [], [$PATH:/sbin/usr/bin]) > + if test "$with_storage_vstorage" = "yes"; then > + if test -z "$VSTORAGE" ; then AC_MSG_ERROR([We need vstorage tools for virtuozzo storage driver]); fi > + if test -z "$VSTORAGE_MOUNT" ; then AC_MSG_ERROR([We need vstorage mount tool for virtuozzo storage driver]); fi > + if test "$with_storage_fs" = "no"; then AC_MSG_ERROR([We need fs backend for vstorage pool]); fi > + else > + if test -z "$VSTORAGE" ; then with_storage_vstorage=no; fi > + if test -z "$VSTORAGE" ; then with_storage_vstorage=no; fi > + if test "$with_storage_fs"= "no"; then with_storage_vstorage=no; fi > + > + if test "$with_storage_vstorage" = "check" ; then with_storage_vstorage=yes ; fi > + fi > + if test "$with_storage_vstorage" = "yes"; then > + AC_DEFINE_UNQUOTED([WITH_STORAGE_VSTORAGE], 1, [whether virtuozzo storage backend for storage driver is enabled]) > + AC_DEFINE_UNQUOTED([VSTORAGE], ["$VSTORAGE"], [Location or name of vstorage program]) > + AC_DEFINE_UNQUOTED([VSTORAGE_MOUNT], ["$VSTORAGE_MOUNT"], [Location or name of vstorage-mount program]) > + AC_DEFINE_UNQUOTED([with_storage_fs], ["$VSTORAGE_MOUNT"], [must be on]) > + fi > + > + if test "$with_storage_vstorage" = "check" ; then with_storage_vstorage=yes ; fi > +fi > +AM_CONDITIONAL([WITH_STORAGE_VSTORAGE], [test "$with_storage_vstorage" = "yes"]) > + > LIBPARTED_CFLAGS= > LIBPARTED_LIBS= > if test "$with_storage_disk" = "yes" || > @@ -2759,6 +2789,7 @@ AC_MSG_NOTICE([ RBD: $with_storage_rbd]) > AC_MSG_NOTICE([Sheepdog: $with_storage_sheepdog]) > AC_MSG_NOTICE([ Gluster: $with_storage_gluster]) > AC_MSG_NOTICE([ ZFS: $with_storage_zfs]) > +AC_MSG_NOTICE([Vstorage: $with_storage_vstorage]) > AC_MSG_NOTICE([]) > AC_MSG_NOTICE([Security Drivers]) > AC_MSG_NOTICE([]) > diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng > index 49d212f..8ad5616 100644 > --- a/docs/schemas/storagepool.rng > +++ b/docs/schemas/storagepool.rng > @@ -24,6 +24,7 @@ > <ref name='poolsheepdog'/> > <ref name='poolgluster'/> > <ref name='poolzfs'/> > + <ref name='poolvstorage'/> > </choice> > </element> > </define> > @@ -173,6 +174,18 @@ > </interleave> > </define> > > + <define name='poolvstorage'> > + <attribute name='type'> > + <value>vz</value> > + </attribute> > + <interleave> > + <ref name='commonmetadata'/> > + <ref name='sizing'/> > + <ref name='sourcevstorage'/> > + <ref name='target'/> > + </interleave> > + </define> > + > <define name='sourceinfovendor'> > <interleave> > <optional> > @@ -609,6 +622,22 @@ > </element> > </define> > > + <define name='clustername'> > + <interleave> > + <element name='name'> > + <ref name='genericName'/> > + </element> > + </interleave> > + </define> > + > + <define name='sourcevstorage'> > + <element name='source'> > + <interleave> > + <ref name='clustername'/> > + </interleave> > + </element> > + </define> > + > <define name='IscsiQualifiedName'> > <data type='string'> > <param name="pattern">iqn\.[0-9]{4}-(0[1-9]|1[0-2])\.[a-zA-Z0-9\.\-]+(:.+)?</param> > diff --git a/include/libvirt/libvirt-storage.h b/include/libvirt/libvirt-storage.h > index 0974f6e..28babf7 100644 > --- a/include/libvirt/libvirt-storage.h > +++ b/include/libvirt/libvirt-storage.h > @@ -232,6 +232,7 @@ typedef enum { > VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG = 1 << 15, > VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER = 1 << 16, > VIR_CONNECT_LIST_STORAGE_POOLS_ZFS = 1 << 17, > + VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE = 1 << 18, > } virConnectListAllStoragePoolsFlags; > > int virConnectListAllStoragePools(virConnectPtr conn, > diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c > index 05a1a49..e3c8ac1 100644 > --- a/src/conf/storage_conf.c > +++ b/src/conf/storage_conf.c > @@ -60,7 +60,7 @@ VIR_ENUM_IMPL(virStoragePool, > "dir", "fs", "netfs", > "logical", "disk", "iscsi", > "scsi", "mpath", "rbd", > - "sheepdog", "gluster", "zfs") > + "sheepdog", "gluster", "zfs", "vstorage") > > VIR_ENUM_IMPL(virStoragePoolFormatFileSystem, > VIR_STORAGE_POOL_FS_LAST, > @@ -274,6 +274,16 @@ static virStoragePoolTypeInfo poolTypeInfo[] = { > .defaultFormat = VIR_STORAGE_FILE_RAW, > }, > }, > + {.poolType = VIR_STORAGE_POOL_VSTORAGE, > + .poolOptions = { > + .flags = VIR_STORAGE_POOL_SOURCE_NAME, > + }, > + .volOptions = { > + .defaultFormat = VIR_STORAGE_FILE_RAW, > + .formatFromString = virStorageVolumeFormatFromString, > + .formatToString = virStorageFileFormatTypeToString, > + }, > + }, > }; > > > @@ -2588,6 +2598,10 @@ virStoragePoolSourceFindDuplicate(virConnectPtr conn, > /* Only one mpath pool is valid per host */ > matchpool = pool; > break; > + case VIR_STORAGE_POOL_VSTORAGE: > + if (STREQ(pool->def->source.name, def->source.name)) > + matchpool = pool; > + break; > case VIR_STORAGE_POOL_RBD: > case VIR_STORAGE_POOL_LAST: > break; > diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h > index 185ae5e..bf33b5f 100644 > --- a/src/conf/storage_conf.h > +++ b/src/conf/storage_conf.h > @@ -95,6 +95,7 @@ typedef enum { > VIR_STORAGE_POOL_SHEEPDOG, /* Sheepdog device */ > VIR_STORAGE_POOL_GLUSTER, /* Gluster device */ > VIR_STORAGE_POOL_ZFS, /* ZFS */ > + VIR_STORAGE_POOL_VSTORAGE, /* Virtuozzo Storage */ > > VIR_STORAGE_POOL_LAST, > } virStoragePoolType; > @@ -545,7 +546,8 @@ VIR_ENUM_DECL(virStoragePartedFs) > VIR_CONNECT_LIST_STORAGE_POOLS_RBD | \ > VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG | \ > VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER | \ > - VIR_CONNECT_LIST_STORAGE_POOLS_ZFS) > + VIR_CONNECT_LIST_STORAGE_POOLS_ZFS | \ > + VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE) > > # define VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL \ > (VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ACTIVE | \ > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 97f6ffe..181d3f5 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -135,6 +135,9 @@ static virStorageBackendPtr backends[] = { > #if WITH_STORAGE_ZFS > &virStorageBackendZFS, > #endif > +#if WITH_STORAGE_VSTORAGE > + &virStorageBackendVstorage, > +#endif > NULL > }; > > diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c > index 0a12ecb..b89b3ae 100644 > --- a/src/storage/storage_backend_fs.c > +++ b/src/storage/storage_backend_fs.c > @@ -371,7 +371,13 @@ virStorageBackendFileSystemIsValid(virStoragePoolObjPtr pool) > "%s", _("missing source path")); > return -1; > } > - } else { > + } else if (pool->def->type == VIR_STORAGE_POOL_VSTORAGE) { > + if (!pool->def->source.name) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + "%s", _("missing source cluster name")); > + return -1; > + } > + } else{ > if (pool->def->source.ndevice != 1) { > if (pool->def->source.ndevice == 0) > virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > @@ -411,6 +417,9 @@ virStorageBackendFileSystemGetPoolSource(virStoragePoolObjPtr pool) > pool->def->source.dir) < 0) > return NULL; > } > + } else if (pool->def->type == VIR_STORAGE_POOL_VSTORAGE) { > + if (virAsprintf(&src, "vstorage://%s", pool->def->source.name) < 0) > + return NULL; > } else { > if (VIR_STRDUP(src, pool->def->source.devices[0].path) < 0) > return NULL; > @@ -546,7 +555,9 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) > VIR_FREE(src); > return ret; > } > +#endif /* WITH_STORAGE_FS */ > > +#if WITH_STORAGE_FS > /** > * @pool storage pool to unmount > * > @@ -1654,3 +1665,102 @@ virStorageFileBackend virStorageFileBackendDir = { > }; > > #endif /* WITH_STORAGE_FS */ > + > +#if WITH_STORAGE_VSTORAGE > +static int > +virStorageBackendVzStart(virConnectPtr conn ATTRIBUTE_UNUSED, > + virStoragePoolObjPtr pool) > +{ > + int ret = -1; > + virCommandPtr cmd = NULL; > + > + cmd = virCommandNewArgList(VSTORAGE_MOUNT, "-c", pool->def->source.name, > + pool->def->target.path, NULL); > + if (virCommandRun(cmd, NULL) < 0) > + goto cleanup; > + ret = 0; > + > + cleanup: > + virCommandFree(cmd); > + return ret; > +} > + > +static char* > +virStorageBackendVzfindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED, > + const char *srcSpec ATTRIBUTE_UNUSED, > + unsigned int flags) > +{ > + > + virCommandPtr cmd = NULL; > + char *buf = NULL; > + char *ret = NULL; > + char **clusters = NULL; > + size_t clusters_num = 0; > + size_t i = 0; > + virStoragePoolSourceList vzcluster_list = { > + .type = VIR_STORAGE_POOL_VSTORAGE, > + .nsources = 0, > + .sources = NULL > + }; > + > + virCheckFlags(0, NULL); > + > + cmd = virCommandNewArgList(VSTORAGE, "discover", NULL); > + virCommandSetOutputBuffer(cmd, &buf); > + > + if (virCommandRun(cmd, NULL) < 0) > + goto cleanup; > + > + if (!(clusters = virStringSplitCount(buf, "\n", 0, &clusters_num))) > + goto cleanup; > + > + if (clusters_num > 0) { > + vzcluster_list.nsources = clusters_num - 1; > + > + if (VIR_ALLOC_N(vzcluster_list.sources, vzcluster_list.nsources) < 0) > + goto cleanup; > + > + for (; i < vzcluster_list.nsources; i++) { > + if (VIR_ALLOC(vzcluster_list.sources[i].devices) < 0) > + goto cleanup; > + if (VIR_STRDUP(vzcluster_list.sources[i].name, clusters[i]) < 0) > + goto cleanup; > + } > + } > + > + if (!(ret = virStoragePoolSourceListFormat(&vzcluster_list))) > + goto cleanup; > + > + cleanup: > + for (i = 0; i < vzcluster_list.nsources; i++) { > + virStoragePoolSourceClear(&vzcluster_list.sources[i]); > + VIR_FREE(clusters[i]); > + } > + VIR_FREE(vzcluster_list.sources); > + VIR_FREE(buf); > + virCommandFree(cmd); > + return ret; > + > +} > +virStorageBackend virStorageBackendVstorage = { > + .type = VIR_STORAGE_POOL_VSTORAGE, > + > + .startPool = virStorageBackendVzStart, > + .checkPool = virStorageBackendFileSystemCheck, > + .stopPool = virStorageBackendFileSystemStop, > + .findPoolSources = virStorageBackendVzfindPoolSources, > + .buildPool = virStorageBackendFileSystemBuild, > + .deletePool = virStorageBackendFileSystemDelete, > + .refreshPool = virStorageBackendFileSystemRefresh, > + .buildVol = virStorageBackendFileSystemVolBuild, > + .buildVolFrom = virStorageBackendFileSystemVolBuildFrom, > + .createVol = virStorageBackendFileSystemVolCreate, > + .refreshVol = virStorageBackendFileSystemVolRefresh, > + .deleteVol = virStorageBackendFileSystemVolDelete, > + .resizeVol = virStorageBackendFileSystemVolResize, > + .uploadVol = virStorageBackendVolUploadLocal, > + .downloadVol = virStorageBackendVolDownloadLocal, > + .wipeVol = virStorageBackendVolWipeLocal, > + > +}; > +#endif /* WITH_STORAGE_VSTORAGE */ > diff --git a/src/storage/storage_backend_fs.h b/src/storage/storage_backend_fs.h > index 347ea9b..23cff66 100644 > --- a/src/storage/storage_backend_fs.h > +++ b/src/storage/storage_backend_fs.h > @@ -30,6 +30,9 @@ > extern virStorageBackend virStorageBackendFileSystem; > extern virStorageBackend virStorageBackendNetFileSystem; > # endif > +#if WITH_STORAGE_VSTORAGE > +extern virStorageBackend virStorageBackendVstorage; > +#endif > > typedef enum { > FILESYSTEM_PROBE_FOUND, > diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c > index cb9d578..3b6c7b4 100644 > --- a/src/storage/storage_driver.c > +++ b/src/storage/storage_driver.c > @@ -1618,6 +1618,7 @@ storageVolLookupByPath(virConnectPtr conn, > case VIR_STORAGE_POOL_ISCSI: > case VIR_STORAGE_POOL_SCSI: > case VIR_STORAGE_POOL_MPATH: > + case VIR_STORAGE_POOL_VSTORAGE: > stable_path = virStorageBackendStablePath(pool, > cleanpath, > false); > @@ -3485,6 +3486,7 @@ virStorageTranslateDiskSourcePool(virConnectPtr conn, > case VIR_STORAGE_POOL_DISK: > case VIR_STORAGE_POOL_SCSI: > case VIR_STORAGE_POOL_ZFS: > + case VIR_STORAGE_POOL_VSTORAGE: > if (!(def->src->path = virStorageVolGetPath(vol))) > goto cleanup; > > diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c > index 6045331..6ea2424 100644 > --- a/tools/virsh-pool.c > +++ b/tools/virsh-pool.c > @@ -1166,6 +1166,8 @@ cmdPoolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) > case VIR_STORAGE_POOL_ZFS: > flags |= VIR_CONNECT_LIST_STORAGE_POOLS_ZFS; > break; > + case VIR_STORAGE_POOL_VSTORAGE: > + flags |= VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE; > case VIR_STORAGE_POOL_LAST: > break; > } > diff --git a/tools/virsh.c b/tools/virsh.c > index 5dc482d..61c8e2f 100644 > --- a/tools/virsh.c > +++ b/tools/virsh.c > @@ -682,6 +682,9 @@ virshShowVersion(vshControl *ctl ATTRIBUTE_UNUSED) > #ifdef WITH_STORAGE_ZFS > vshPrint(ctl, " ZFS"); > #endif > +#ifdef WITH_STORAGE_VSTORAGE > + vshPrint(ctl, " Vstorage"); > +#endif > vshPrint(ctl, "\n"); > > vshPrint(ctl, "%s", _(" Miscellaneous:")); > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list