From e590d5301e6bdcc74b733071b15745d44f58ecf4 Mon Sep 17 00:00:00 2001 From: Olga Krishtal Date: Tue, 17 Jan 2017 17:10:55 +0300 Subject: [PATCH] storage: Introduce Virtuozzo vstorage backend Added general definitions for vstorage pool backend including the build options to add --with-storage-vstorage checking. In order to use vstorage as a backend for a storage pool vstorage tools (vstorage and vstorage-mount) need to be installed. Signed-off-by: Olga Krishtal --- configure.ac | 4 ++ include/libvirt/libvirt-storage.h | 1 + m4/virt-storage-vstorage.m4 | 73 ++++++++++++++++++++++++++ src/Makefile.am | 9 ++++ src/conf/storage_conf.c | 17 +++++- src/conf/storage_conf.h | 1 + src/storage/storage_backend.c | 6 +++ src/storage/storage_backend_vstorage.c | 16 ++++++ src/storage/storage_backend_vstorage.h | 28 ++++++++++ src/storage/storage_driver.c | 2 + tools/virsh-pool.c | 3 ++ tools/virsh.c | 3 ++ 12 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 m4/virt-storage-vstorage.m4 create mode 100644 src/storage/storage_backend_vstorage.c create mode 100644 src/storage/storage_backend_vstorage.h diff --git a/configure.ac b/configure.ac index 7efaddb1bf..a995a05a6d 100644 --- a/configure.ac +++ b/configure.ac @@ -570,6 +570,7 @@ LIBVIRT_STORAGE_ARG_RBD LIBVIRT_STORAGE_ARG_SHEEPDOG LIBVIRT_STORAGE_ARG_GLUSTER LIBVIRT_STORAGE_ARG_ZFS +LIBVIRT_STORAGE_ARG_VSTORAGE if test "$with_libvirtd" = "no"; then with_storage_dir=no @@ -583,6 +584,7 @@ if test "$with_libvirtd" = "no"; then with_storage_sheepdog=no with_storage_gluster=no with_storage_zfs=no + with_storage_vstorage=no fi dnl storage-fs does not work on MacOS X @@ -602,6 +604,7 @@ LIBVIRT_STORAGE_CHECK_RBD LIBVIRT_STORAGE_CHECK_SHEEPDOG LIBVIRT_STORAGE_CHECK_GLUSTER LIBVIRT_STORAGE_CHECK_ZFS +LIBVIRT_STORAGE_CHECK_VSTORAGE with_storage=no for backend in dir fs lvm iscsi scsi mpath rbd disk; do @@ -935,6 +938,7 @@ LIBVIRT_STORAGE_RESULT_RBD LIBVIRT_STORAGE_RESULT_SHEEPDOG LIBVIRT_STORAGE_RESULT_GLUSTER LIBVIRT_STORAGE_RESULT_ZFS +LIBVIRT_STORAGE_RESULT_VSTORAGE AC_MSG_NOTICE([]) AC_MSG_NOTICE([Security Drivers]) AC_MSG_NOTICE([]) diff --git a/include/libvirt/libvirt-storage.h b/include/libvirt/libvirt-storage.h index 8a861e4340..45ec720656 100644 --- a/include/libvirt/libvirt-storage.h +++ b/include/libvirt/libvirt-storage.h @@ -240,6 +240,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/m4/virt-storage-vstorage.m4 b/m4/virt-storage-vstorage.m4 new file mode 100644 index 0000000000..8a926c80f1 --- /dev/null +++ b/m4/virt-storage-vstorage.m4 @@ -0,0 +1,73 @@ +dnl The storage vstorage check +dnl +dnl Copyright (C) 2016 Parallels IP Holdings GmbH, Inc. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl . +dnl + + +AC_DEFUN([LIBVIRT_STORAGE_ARG_VSTORAGE], [ + LIBVIRT_ARG_WITH_FEATURE([STORAGE_VSTORAGE], + [Virtuozzo Storage backend for the storage driver], + [check]) +]) + +AC_DEFUN([LIBVIRT_STORAGE_CHECK_VSTORAGE], [ + if test "$with_storage_vstorage" = "yes" || + test "$with_storage_vstorage" = "check"; then + AC_PATH_PROG([VSTORAGE], [vstorage], [], [$LIBVIRT_SBIN_PATH]) + AC_PATH_PROG([VSTORAGE_MOUNT], [vstorage-mount], [], [$LIBVIRT_SBIN_PATH]) + AC_PATH_PROG([UMOUNT], [umount], [], [$LIBVIRT_SBIN_PATH]) + + if test "$with_storage_vstorage" = "yes"; then + if test -z "$VSTORAGE" || test -z "$VSTORAGE_MOUNT"; then + AC_MSG_ERROR([We need vstorage and vstorage-mount tool for Vstorage storage driver]); + fi + if test -z "$UMOUNT" ; then + AC_MSG_ERROR([We need umount for Vstorage storage driver]); + fi + else + if test -z "$VSTORAGE" ; then + with_storage_vstorage=no + fi + if test -z "$VSTORAGE_MOUNT" ; then + with_storage_vstorage=no + fi + if test -z "$UMOUNT" ; then + with_storage_vstorage=no + fi + + if test "$with_storage_fs" = "check" ; then + with_storage_vstorage=yes + fi + fi + + if test "$with_storage_vstorage" = "yes" ; then + AC_DEFINE_UNQUOTED([WITH_STORAGE_VSTORAGE], 1, + [whether Vstorage backend for storage driver is enabled]) + AC_DEFINE_UNQUOTED([VSTORAGE], ["$VSTORAGE"], + [Location or name of the vstorage client tool]) + AC_DEFINE_UNQUOTED([VSTORAGE_MOUNT], ["$VSTORAGE_MOUNT"], + [Location or name of the vstorage mount tool]) + AC_DEFINE_UNQUOTED([UMOUNT], ["$UMOUNT"], + [Location or name of the umount programm]) + fi + fi + AM_CONDITIONAL([WITH_STORAGE_VSTORAGE], [test "$with_storage_vstorage" = "yes"]) +]) + +AC_DEFUN([LIBVIRT_STORAGE_RESULT_VSTORAGE], [ + LIBVIRT_RESULT([Virtuozzo storage], [$with_storage_vstorage]) +]) diff --git a/src/Makefile.am b/src/Makefile.am index dc26ddf53c..2f32d41979 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1007,6 +1007,10 @@ STORAGE_DRIVER_GLUSTER_SOURCES = \ STORAGE_DRIVER_ZFS_SOURCES = \ storage/storage_backend_zfs.h storage/storage_backend_zfs.c +STORAGE_DRIVER_VSTORAGE_SOURCES = \ + storage/storage_backend_vstorage.h \ + storage/storage_backend_vstorage.c + STORAGE_HELPER_DISK_SOURCES = \ storage/parthelper.c @@ -1714,6 +1718,10 @@ if WITH_STORAGE_ZFS libvirt_driver_storage_impl_la_SOURCES += $(STORAGE_DRIVER_ZFS_SOURCES) endif WITH_STORAGE_ZFS +if WITH_STORAGE_VSTORAGE +libvirt_driver_storage_impl_la_SOURCES += $(STORAGE_DRIVER_VSTORAGE_SOURCES) +endif WITH_STORAGE_VSTORAGE + if WITH_NODE_DEVICES # Needed to keep automake quiet about conditionals if WITH_DRIVER_MODULES @@ -1925,6 +1933,7 @@ EXTRA_DIST += \ $(STORAGE_DRIVER_SHEEPDOG_SOURCES) \ $(STORAGE_DRIVER_GLUSTER_SOURCES) \ $(STORAGE_DRIVER_ZFS_SOURCES) \ + $(STORAGE_DRIVER_VSTORAGE_SOURCES) \ $(NODE_DEVICE_DRIVER_SOURCES) \ $(NODE_DEVICE_DRIVER_HAL_SOURCES) \ $(NODE_DEVICE_DRIVER_UDEV_SOURCES) \ diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index c53f08046d..c9b93aab75 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -60,7 +60,8 @@ 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 +275,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, + }, + }, }; @@ -2611,6 +2622,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 b35471d988..e952f5f40e 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; diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 92b08a2b4a..500d7567dd 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -64,6 +64,9 @@ #if WITH_STORAGE_ZFS # include "storage_backend_zfs.h" #endif +#if WITH_STORAGE_VSTORAGE +# include "storage_backend_vstorage.h" +#endif #define VIR_FROM_THIS VIR_FROM_STORAGE @@ -103,6 +106,9 @@ static virStorageBackendPtr backends[] = { #endif #if WITH_STORAGE_ZFS &virStorageBackendZFS, +#endif +#if WITH_STORAGE_VSTORAGE + &virStorageBackendVstorage, #endif NULL }; diff --git a/src/storage/storage_backend_vstorage.c b/src/storage/storage_backend_vstorage.c new file mode 100644 index 0000000000..3a573853ee --- /dev/null +++ b/src/storage/storage_backend_vstorage.c @@ -0,0 +1,16 @@ +#include + +#include "viralloc.h" +#include "virerror.h" +#include "virfile.h" +#include "storage_backend_vstorage.h" +#include "virlog.h" +#include "virstring.h" + +#define VIR_FROM_THIS VIR_FROM_STORAGE + +VIR_LOG_INIT("storage.storage_backend_vstorage"); + +virStorageBackend virStorageBackendVstorage = { + .type = VIR_STORAGE_POOL_VSTORAGE, +}; diff --git a/src/storage/storage_backend_vstorage.h b/src/storage/storage_backend_vstorage.h new file mode 100644 index 0000000000..262e454c01 --- /dev/null +++ b/src/storage/storage_backend_vstorage.h @@ -0,0 +1,28 @@ +/* + * storage_backend_vstorage.h: storage backend for Virtuozzo storage + * handling + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + */ + +#ifndef __VIR_STORAGE_BACKEND_VSTORAGE_H__ +# define __VIR_STORAGE_BACKEND_VSTORAGE_H__ + +# include "storage_backend.h" + +extern virStorageBackend virStorageBackendVstorage; + +#endif /* __VIR_STORAGE_BACKEND_VSTORAGE_H__ */ diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index a52eae3e20..ed4772ad97 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1619,6 +1619,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); @@ -3502,6 +3503,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 d50ae2a692..ba9281fbb9 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -1185,6 +1185,9 @@ 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; + break; case VIR_STORAGE_POOL_LAST: break; } diff --git a/tools/virsh.c b/tools/virsh.c index 1068447d66..7eb51ab7dc 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -647,6 +647,9 @@ virshShowVersion(vshControl *ctl ATTRIBUTE_UNUSED) #endif #ifdef WITH_STORAGE_ZFS vshPrint(ctl, " ZFS"); +#endif +#ifdef WITH_STORAGE_VSTORAGE + vshPrint(ctl, "Virtuozzo Storage"); #endif vshPrint(ctl, "\n");