From 6ca10003a908f7e8d296f2008a84b4951b17921b Mon Sep 17 00:00:00 2001 From: kpdev Date: Fri, 30 Jul 2021 13:42:41 +0200 Subject: [PATCH] Add config option reserved_share_from_snapshot_percentage. This config option allows different value for reservation percentage, mostly useful on the platforms, where shares can only be created from the snapshot on the host where snapshot was taken. The lower value of this config option against existing (reserved_share_percentage) allows to create shares from the snapshot on the same host up to a higher threshold even though non-snapshot/regular share create fails. In case this config option is not set, the shares created from snapshot will use reservation percentage value set in 'reserved_share_percentage'. This will be useful for users who want to keep same reservation percentage for both non-snapshot/regular and snapshot shares. DocImpact Closes-Bug: #1938060 Change-Id: I390da933fe92875e3c7ee40709eacacc030278dc --- manila/scheduler/drivers/filter.py | 1 + manila/scheduler/filters/capacity.py | 6 ++- manila/scheduler/host_manager.py | 17 +++++--- manila/scheduler/utils.py | 2 + manila/scheduler/weighers/capacity.py | 6 ++- manila/share/driver.py | 13 +++++- manila/share/drivers/cephfs/driver.py | 5 +++ manila/share/drivers/container/driver.py | 3 ++ .../share/drivers/container/storage_helper.py | 1 + .../dell_emc/plugins/powermax/connection.py | 8 ++++ .../dell_emc/plugins/unity/connection.py | 8 ++++ .../dell_emc/plugins/vnx/connection.py | 8 ++++ manila/share/drivers/generic.py | 3 ++ manila/share/drivers/glusterfs/__init__.py | 5 ++- .../drivers/glusterfs/glusterfs_native.py | 5 ++- manila/share/drivers/hdfs/hdfs_native.py | 5 ++- manila/share/drivers/hitachi/hnas/driver.py | 3 ++ manila/share/drivers/hitachi/hsp/driver.py | 4 ++ manila/share/drivers/hpe/hpe_3par_driver.py | 9 ++++ manila/share/drivers/huawei/v3/connection.py | 1 + manila/share/drivers/ibm/gpfs.py | 5 ++- manila/share/drivers/infinidat/infinibox.py | 3 ++ manila/share/drivers/infortrend/driver.py | 3 ++ .../drivers/inspur/as13000/as13000_nas.py | 3 ++ .../drivers/inspur/instorage/instorage.py | 4 ++ manila/share/drivers/lvm.py | 4 ++ .../netapp/dataontap/cluster_mode/lib_base.py | 4 ++ .../drivers/nexenta/ns4/nexenta_nfs_helper.py | 3 ++ .../share/drivers/nexenta/ns5/nexenta_nas.py | 3 ++ .../share/drivers/purestorage/flashblade.py | 10 ++++- manila/share/drivers/qnap/qnap.py | 4 ++ manila/share/drivers/quobyte/quobyte.py | 5 ++- manila/share/drivers/tegile/tegile.py | 3 ++ manila/share/drivers/veritas/veritas_isa.py | 1 + manila/share/drivers/zadara/zadara.py | 3 ++ manila/share/drivers/zfsonlinux/driver.py | 6 +++ manila/tests/scheduler/fakes.py | 24 +++++++++++ .../tests/scheduler/filters/test_capacity.py | 43 +++++++++++++++++++ manila/tests/scheduler/test_host_manager.py | 35 +++++++++++++++ .../tests/share/drivers/cephfs/test_driver.py | 3 ++ .../share/drivers/container/test_driver.py | 2 + .../drivers/container/test_storage_helper.py | 1 + .../dell_emc/plugins/unity/res_mock.py | 1 + .../dell_emc/plugins/unity/test_connection.py | 1 + .../share/drivers/dell_emc/test_driver.py | 1 + manila/tests/share/drivers/dummy.py | 7 ++- .../glusterfs/test_glusterfs_native.py | 1 + .../share/drivers/hitachi/hnas/test_driver.py | 2 + .../tests/share/drivers/hitachi/hsp/fakes.py | 1 + .../share/drivers/hpe/test_hpe_3par_driver.py | 5 +++ .../share/drivers/huawei/test_huawei_nas.py | 2 + .../share/drivers/infinidat/test_infinidat.py | 1 + .../inspur/as13000/test_as13000_nas.py | 3 ++ .../inspur/instorage/test_instorage.py | 5 +++ .../tests/share/drivers/maprfs/test_maprfs.py | 3 +- .../share/drivers/netapp/dataontap/fakes.py | 5 +++ .../drivers/nexenta/ns4/test_nexenta_nas.py | 3 ++ .../drivers/nexenta/ns5/test_nexenta_nas.py | 3 ++ .../share/drivers/quobyte/test_quobyte.py | 3 +- .../tests/share/drivers/tegile/test_tegile.py | 8 ++++ manila/tests/share/drivers/test_generic.py | 3 +- manila/tests/share/drivers/test_glusterfs.py | 4 +- manila/tests/share/drivers/test_lvm.py | 2 + .../share/drivers/veritas/test_veritas_isa.py | 1 + .../tests/share/drivers/zadara/test_zadara.py | 4 ++ .../share/drivers/zfsonlinux/test_driver.py | 5 +++ manila/tests/share/test_driver.py | 3 +- ...-snapshot-percentage-2d913ae1fc533690.yaml | 10 +++++ 68 files changed, 351 insertions(+), 21 deletions(-) create mode 100644 releasenotes/notes/add-reserved-share-from-snapshot-percentage-2d913ae1fc533690.yaml diff --git a/manila/scheduler/drivers/filter.py b/manila/scheduler/drivers/filter.py index de0b8b4b92..8b6706ed40 100644 --- a/manila/scheduler/drivers/filter.py +++ b/manila/scheduler/drivers/filter.py @@ -329,6 +329,7 @@ class FilterScheduler(base.Scheduler): ) filter_properties['user_id'] = shr.get('user_id') filter_properties['metadata'] = shr.get('metadata') + filter_properties['snapshot_id'] = shr.get('snapshot_id') def schedule_create_share_group(self, context, share_group_id, request_spec, filter_properties): diff --git a/manila/scheduler/filters/capacity.py b/manila/scheduler/filters/capacity.py index 8560fe6bd1..0a2f74ffe7 100644 --- a/manila/scheduler/filters/capacity.py +++ b/manila/scheduler/filters/capacity.py @@ -42,7 +42,11 @@ class CapacityFilter(base_host.BaseHostFilter): free_space = host_state.free_capacity_gb total_space = host_state.total_capacity_gb - reserved = float(host_state.reserved_percentage) / 100 + if filter_properties.get('snapshot_id'): + reserved = float(host_state.reserved_snapshot_percentage) / 100 + else: + reserved = float(host_state.reserved_percentage) / 100 + if free_space == 'unknown': # NOTE(zhiteng) for those back-ends cannot report actual # available capacity, we assume it is able to serve the diff --git a/manila/scheduler/host_manager.py b/manila/scheduler/host_manager.py index bc95094833..1724b7d781 100644 --- a/manila/scheduler/host_manager.py +++ b/manila/scheduler/host_manager.py @@ -127,6 +127,7 @@ class HostState(object): self.total_capacity_gb = 0 self.free_capacity_gb = None self.reserved_percentage = 0 + self.reserved_snapshot_percentage = 0 self.allocated_capacity_gb = 0 # NOTE(xyang): The apparent allocated space indicating how much # capacity has been provisioned. This could be the sum of sizes @@ -185,12 +186,13 @@ class HostState(object): 'pools':[ { - 'pool_name': '1st pool', #\ - 'total_capacity_gb': 500, # mandatory stats - 'free_capacity_gb': 230, # for pools - 'allocated_capacity_gb': 270, # | - 'qos': 'False', # | - 'reserved_percentage': 0, #/ + 'pool_name': '1st pool', #\ + 'total_capacity_gb': 500, # mandatory stats + 'free_capacity_gb': 230, # for pools + 'allocated_capacity_gb': 270, # | + 'qos': 'False', # | + 'reserved_percentage': 0, # | + 'reserved_snapshot_percentage': 0, #/ 'dying_disks': 100, #\ 'super_hero_1': 'spider-man', # optional custom @@ -205,6 +207,7 @@ class HostState(object): 'allocated_capacity_gb': 0, 'qos': 'False', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'dying_disks': 200, 'super_hero_1': 'superman', @@ -434,6 +437,8 @@ class PoolState(HostState): 'allocated_capacity_gb', 0) self.qos = capability.get('qos', False) self.reserved_percentage = capability['reserved_percentage'] + self.reserved_snapshot_percentage = ( + capability['reserved_snapshot_percentage']) self.thin_provisioning = scheduler_utils.thin_provisioning( capability.get('thin_provisioning', False)) # NOTE(xyang): provisioned_capacity_gb is the apparent total diff --git a/manila/scheduler/utils.py b/manila/scheduler/utils.py index 59ff9632fa..07ab281ce2 100644 --- a/manila/scheduler/utils.py +++ b/manila/scheduler/utils.py @@ -36,6 +36,8 @@ def generate_stats(host_state, properties): 'allocated_capacity_gb': host_state.allocated_capacity_gb, 'free_capacity_gb': host_state.free_capacity_gb, 'reserved_percentage': host_state.reserved_percentage, + 'reserved_snapshot_percentage': + host_state.reserved_snapshot_percentage, 'driver_handles_share_servers': host_state.driver_handles_share_servers, 'thin_provisioning': host_state.thin_provisioning, diff --git a/manila/scheduler/weighers/capacity.py b/manila/scheduler/weighers/capacity.py index 847a6f8608..409197aba6 100644 --- a/manila/scheduler/weighers/capacity.py +++ b/manila/scheduler/weighers/capacity.py @@ -52,7 +52,11 @@ class CapacityWeigher(base_host.BaseHostWeigher): def _weigh_object(self, host_state, weight_properties): """Higher weighers win. We want spreading to be the default.""" - reserved = float(host_state.reserved_percentage) / 100 + if weight_properties.get('snapshot_id'): + reserved = float(host_state.reserved_snapshot_percentage) / 100 + else: + reserved = float(host_state.reserved_percentage) / 100 + free_space = host_state.free_capacity_gb total_space = host_state.total_capacity_gb if 'unknown' in (total_space, free_space): diff --git a/manila/share/driver.py b/manila/share/driver.py index 37664b70dc..a27794ed96 100644 --- a/manila/share/driver.py +++ b/manila/share/driver.py @@ -41,7 +41,17 @@ share_opts = [ cfg.IntOpt( 'reserved_share_percentage', default=0, - help='The percentage of backend capacity reserved.'), + help="The percentage of backend capacity reserved. Used for shares " + "which are not created from the snapshot."), + cfg.IntOpt( + 'reserved_share_from_snapshot_percentage', + default=0, + help="The percentage of backend capacity reserved. Used for shares " + "created from the snapshot. On some platforms, shares can only " + "be created from the snapshot on the host where snapshot was " + "taken, so we can set a lower value in this option compared to " + "reserved_share_percentage, and allow to create shares from the " + "snapshot on the same host up to a higher threshold."), cfg.StrOpt( 'share_backend_name', help='The backend name for a given driver implementation.'), @@ -1301,6 +1311,7 @@ class ShareDriver(object): total_capacity_gb='unknown', free_capacity_gb='unknown', reserved_percentage=0, + reserved_snapshot_percentage=0, qos=False, pools=self.pools or None, snapshot_support=self.snapshots_are_supported, diff --git a/manila/share/drivers/cephfs/driver.py b/manila/share/drivers/cephfs/driver.py index 4cc9a651c8..9c1ccb0d1c 100644 --- a/manila/share/drivers/cephfs/driver.py +++ b/manila/share/drivers/cephfs/driver.py @@ -276,6 +276,11 @@ class CephFSDriver(driver.ExecuteMixin, driver.GaneshaMixin, 'qos': 'False', 'reserved_percentage': self.configuration.safe_get( 'reserved_share_percentage'), + 'reserved_snapshot_percentage': + self.configuration.safe_get( + 'reserved_share_from_snapshot_percentage') or + self.configuration.safe_get( + 'reserved_share_percentage'), 'dedupe': [False], 'compression': [False], 'thin_provisioning': [False] diff --git a/manila/share/drivers/container/driver.py b/manila/share/drivers/container/driver.py index 8a500b269c..52a4d656b6 100644 --- a/manila/share/drivers/container/driver.py +++ b/manila/share/drivers/container/driver.py @@ -122,6 +122,9 @@ class ContainerShareDriver(driver.ShareDriver, driver.ExecuteMixin): 'storage_protocol': 'CIFS', 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': + self.configuration.reserved_share_from_snapshot_percentage or + self.configuration.reserved_share_percentage, 'consistency_group_support': None, 'snapshot_support': False, 'create_share_from_snapshot_support': False, diff --git a/manila/share/drivers/container/storage_helper.py b/manila/share/drivers/container/storage_helper.py index b502c83159..bc09aad0aa 100644 --- a/manila/share/drivers/container/storage_helper.py +++ b/manila/share/drivers/container/storage_helper.py @@ -70,6 +70,7 @@ class LVMHelper(driver.ExecuteMixin): 'total_capacity_gb': float(total_size), 'free_capacity_gb': float(free_size), 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, }, ] def _get_lv_device(self, share_name): diff --git a/manila/share/drivers/dell_emc/plugins/powermax/connection.py b/manila/share/drivers/dell_emc/plugins/powermax/connection.py index 96a9932963..1a90d681e5 100644 --- a/manila/share/drivers/dell_emc/plugins/powermax/connection.py +++ b/manila/share/drivers/dell_emc/plugins/powermax/connection.py @@ -81,6 +81,7 @@ class PowerMaxStorageConnection(driver.StorageConnection): self.manager = None self.pool_conf = None self.reserved_percentage = None + self.reserved_snapshot_percentage = None self.driver_handles_share_servers = True self.port_conf = None self.ipv6_implemented = True @@ -594,6 +595,11 @@ class PowerMaxStorageConnection(driver.StorageConnection): if self.reserved_percentage is None: self.reserved_percentage = 0 + self.reserved_snapshot_percentage = config.safe_get( + 'reserved_share_from_snapshot_percentage') + if self.reserved_snapshot_percentage is None: + self.reserved_snapshot_percentage = self.reserved_percentage + self.manager = manager.StorageObjectManager(config) self.port_conf = config.safe_get('powermax_ethernet_ports') @@ -642,6 +648,8 @@ class PowerMaxStorageConnection(driver.StorageConnection): enas_utils.mb_to_gb(total_size - used_size), 'qos': False, 'reserved_percentage': self.reserved_percentage, + 'reserved_snapshot_percentage': + self.reserved_snapshot_percentage, 'snapshot_support': True, 'create_share_from_snapshot_support': True, 'revert_to_snapshot_support': False, diff --git a/manila/share/drivers/dell_emc/plugins/unity/connection.py b/manila/share/drivers/dell_emc/plugins/unity/connection.py index cb92013415..18eb5e6bd1 100644 --- a/manila/share/drivers/dell_emc/plugins/unity/connection.py +++ b/manila/share/drivers/dell_emc/plugins/unity/connection.py @@ -92,6 +92,7 @@ class UnityStorageConnection(driver.StorageConnection): self.pool_set = None self.nas_server_pool = None self.reserved_percentage = None + self.reserved_snapshot_percentage = None self.max_over_subscription_ratio = None self.port_ids_conf = None self.unity_share_server = None @@ -129,6 +130,11 @@ class UnityStorageConnection(driver.StorageConnection): if self.reserved_percentage is None: self.reserved_percentage = 0 + self.reserved_snapshot_percentage = config.safe_get( + 'reserved_share_from_snapshot_percentage') + if self.reserved_snapshot_percentage is None: + self.reserved_snapshot_percentage = self.reserved_percentage + self.max_over_subscription_ratio = config.safe_get( 'max_over_subscription_ratio') self.port_ids_conf = config.safe_get('unity_ethernet_ports') @@ -585,6 +591,8 @@ class UnityStorageConnection(driver.StorageConnection): enas_utils.bytes_to_gb(pool.size_subscribed), 'qos': False, 'reserved_percentage': self.reserved_percentage, + 'reserved_snapshot_percentage': + self.reserved_snapshot_percentage, 'max_over_subscription_ratio': self.max_over_subscription_ratio, } diff --git a/manila/share/drivers/dell_emc/plugins/vnx/connection.py b/manila/share/drivers/dell_emc/plugins/vnx/connection.py index 6f0e56ef33..a9f523e284 100644 --- a/manila/share/drivers/dell_emc/plugins/vnx/connection.py +++ b/manila/share/drivers/dell_emc/plugins/vnx/connection.py @@ -78,6 +78,7 @@ class VNXStorageConnection(driver.StorageConnection): self.manager = None self.pool_conf = None self.reserved_percentage = None + self.reserved_snapshot_percentage = None self.driver_handles_share_servers = True self.port_conf = None self.ipv6_implemented = True @@ -588,6 +589,11 @@ class VNXStorageConnection(driver.StorageConnection): if self.reserved_percentage is None: self.reserved_percentage = 0 + self.reserved_snapshot_percentage = config.safe_get( + 'reserved_share_from_snapshot_percentage') + if self.reserved_snapshot_percentage is None: + self.reserved_snapshot_percentage = self.reserved_percentage + self.manager = manager.StorageObjectManager(config) self.port_conf = config.safe_get('vnx_ethernet_ports') @@ -636,6 +642,8 @@ class VNXStorageConnection(driver.StorageConnection): total_size - used_size), qos=False, reserved_percentage=self.reserved_percentage, + reserved_snapshot_percentage=( + self.reserved_snapshot_percentage), ) stats_dict['pools'].append(pool_stat) diff --git a/manila/share/drivers/generic.py b/manila/share/drivers/generic.py index 4fe83a0a78..ce80d5e847 100644 --- a/manila/share/drivers/generic.py +++ b/manila/share/drivers/generic.py @@ -635,6 +635,9 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver): share_backend_name=self.backend_name, storage_protocol='NFS_CIFS', reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), ) super(GenericShareDriver, self)._update_share_stats(data) diff --git a/manila/share/drivers/glusterfs/__init__.py b/manila/share/drivers/glusterfs/__init__.py index 883914e0c0..fca1e5a8dd 100644 --- a/manila/share/drivers/glusterfs/__init__.py +++ b/manila/share/drivers/glusterfs/__init__.py @@ -122,7 +122,10 @@ class GlusterfsShareDriver(driver.ExecuteMixin, driver.GaneshaMixin, storage_protocol='NFS', vendor_name='Red Hat', share_backend_name=self.backend_name, - reserved_percentage=self.configuration.reserved_share_percentage) + reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage)) super(GlusterfsShareDriver, self)._update_share_stats(data) def get_network_allocations_number(self): diff --git a/manila/share/drivers/glusterfs/glusterfs_native.py b/manila/share/drivers/glusterfs/glusterfs_native.py index 3b4782237f..7342c0ceb9 100644 --- a/manila/share/drivers/glusterfs/glusterfs_native.py +++ b/manila/share/drivers/glusterfs/glusterfs_native.py @@ -195,7 +195,10 @@ class GlusterfsNativeShareDriver(driver.ExecuteMixin, vendor_name='Red Hat', driver_version='1.1', storage_protocol='glusterfs', - reserved_percentage=self.configuration.reserved_share_percentage) + reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage or + self.configuration.reserved_share_percentage)) # We don't use a service mount to get stats data. # Instead we use glusterfs quota feature and use that to limit diff --git a/manila/share/drivers/hdfs/hdfs_native.py b/manila/share/drivers/hdfs/hdfs_native.py index 4c47fdd43e..02c733abad 100644 --- a/manila/share/drivers/hdfs/hdfs_native.py +++ b/manila/share/drivers/hdfs/hdfs_native.py @@ -427,7 +427,10 @@ class HDFSNativeShareDriver(driver.ExecuteMixin, driver.ShareDriver): data = dict(share_backend_name=self.backend_name, storage_protocol='HDFS', reserved_percentage=self.configuration. - reserved_share_percentage) + reserved_share_percentage, + reserved_snapshot_percentage=self.configuration. + reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage) total, free = self._get_available_capacity() diff --git a/manila/share/drivers/hitachi/hnas/driver.py b/manila/share/drivers/hitachi/hnas/driver.py index 3353f27978..da3ebc37ac 100644 --- a/manila/share/drivers/hitachi/hnas/driver.py +++ b/manila/share/drivers/hitachi/hnas/driver.py @@ -612,6 +612,8 @@ class HitachiHNASDriver(driver.ShareDriver): total_space, free_space, dedupe = self.hnas.get_stats() reserved = self.configuration.safe_get('reserved_share_percentage') + reserved_snapshot = self.configuration.safe_get( + 'reserved_share_from_snapshot_percentage') or reserved data = { 'share_backend_name': self.backend_name, @@ -622,6 +624,7 @@ class HitachiHNASDriver(driver.ShareDriver): 'total_capacity_gb': total_space, 'free_capacity_gb': free_space, 'reserved_percentage': reserved, + 'reserved_snapshot_percentage': reserved_snapshot, 'qos': False, 'thin_provisioning': True, 'dedupe': dedupe, diff --git a/manila/share/drivers/hitachi/hsp/driver.py b/manila/share/drivers/hitachi/hsp/driver.py index 1cc52d8540..0ef0c44ea2 100644 --- a/manila/share/drivers/hitachi/hsp/driver.py +++ b/manila/share/drivers/hitachi/hsp/driver.py @@ -67,6 +67,9 @@ class HitachiHSPDriver(driver.ShareDriver): LOG.debug("Updating Backend Capability Information - Hitachi HSP.") reserved = self.configuration.safe_get('reserved_share_percentage') + reserved_snapshot = (self.configuration.safe_get( + 'reserved_share_from_snapshot_percentage') or + self.configuration.safe_get('reserved_share_percentage')) max_over_subscription_ratio = self.configuration.safe_get( 'max_over_subscription_ratio') hsp_cluster = self.hsp.get_cluster() @@ -81,6 +84,7 @@ class HitachiHSPDriver(driver.ShareDriver): 'storage_protocol': 'NFS', 'pools': [{ 'reserved_percentage': reserved, + 'reserved_snapshot_percentage': reserved_snapshot, 'pool_name': 'HSP', 'thin_provisioning': True, 'total_capacity_gb': total_space / units.Gi, diff --git a/manila/share/drivers/hpe/hpe_3par_driver.py b/manila/share/drivers/hpe/hpe_3par_driver.py index 53f3a8c822..c3406fb40b 100644 --- a/manila/share/drivers/hpe/hpe_3par_driver.py +++ b/manila/share/drivers/hpe/hpe_3par_driver.py @@ -606,6 +606,11 @@ class HPE3ParShareDriver(driver.ShareDriver): if reserved_share_percentage is None: reserved_share_percentage = 0 + reserved_share_from_snapshot_percentage = self.configuration.safe_get( + 'reserved_share_from_snapshot_percentage') + if reserved_share_from_snapshot_percentage is None: + reserved_share_from_snapshot_percentage = reserved_share_percentage + stats = { 'share_backend_name': backend_name, 'driver_handles_share_servers': self.driver_handles_share_servers, @@ -616,6 +621,8 @@ class HPE3ParShareDriver(driver.ShareDriver): 'free_capacity_gb': 0, 'provisioned_capacity_gb': 0, 'reserved_percentage': reserved_share_percentage, + 'reserved_snapshot_percentage': + reserved_share_from_snapshot_percentage, 'max_over_subscription_ratio': max_over_subscription_ratio, 'qos': False, 'thin_provisioning': True, # 3PAR default is thin @@ -629,6 +636,8 @@ class HPE3ParShareDriver(driver.ShareDriver): for fpg in self.fpgs: fpg_status = self._hpe3par.get_fpg_status(fpg) fpg_status['reserved_percentage'] = reserved_share_percentage + fpg_status['reserved_snapshot_percentage'] = ( + reserved_share_from_snapshot_percentage) LOG.debug("FPG status = %s.", fpg_status) stats.setdefault('pools', []).append(fpg_status) diff --git a/manila/share/drivers/huawei/v3/connection.py b/manila/share/drivers/huawei/v3/connection.py index a3f938fb16..29ca259e09 100644 --- a/manila/share/drivers/huawei/v3/connection.py +++ b/manila/share/drivers/huawei/v3/connection.py @@ -325,6 +325,7 @@ class V3StorageConnection(driver.HuaweiBase): allocated_capacity_gb=capacity['CONSUMEDCAPACITY'], qos=self._get_qos_capability(), reserved_percentage=0, + reserved_snapshot_percentage=0, thin_provisioning=[True, False], dedupe=[True, False], compression=[True, False], diff --git a/manila/share/drivers/ibm/gpfs.py b/manila/share/drivers/ibm/gpfs.py index 7eb4bdb4f3..62f7b1e986 100644 --- a/manila/share/drivers/ibm/gpfs.py +++ b/manila/share/drivers/ibm/gpfs.py @@ -747,7 +747,10 @@ class GPFSShareDriver(driver.ExecuteMixin, driver.GaneshaMixin, share_backend_name=self.backend_name, vendor_name='IBM', storage_protocol='NFS', - reserved_percentage=self.configuration.reserved_share_percentage) + reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage)) free, capacity = self._get_available_capacity( self.configuration.gpfs_mount_point_base) diff --git a/manila/share/drivers/infinidat/infinibox.py b/manila/share/drivers/infinidat/infinibox.py index 2014b26873..dcb0207360 100644 --- a/manila/share/drivers/infinidat/infinibox.py +++ b/manila/share/drivers/infinidat/infinibox.py @@ -163,6 +163,9 @@ class InfiniboxShareDriver(driver.ShareDriver): total_capacity_gb=float(physical_capacity_bytes) / units.Gi, free_capacity_gb=float(free_capacity_bytes) / units.Gi, reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), thin_provisioning=self.configuration.infinidat_thin_provision, max_over_subscription_ratio=max_over_subscription_ratio, provisioned_capacity_gb=provisioned_capacity_gb, diff --git a/manila/share/drivers/infortrend/driver.py b/manila/share/drivers/infortrend/driver.py index 064f31f6e2..ecf5e26704 100644 --- a/manila/share/drivers/infortrend/driver.py +++ b/manila/share/drivers/infortrend/driver.py @@ -120,6 +120,9 @@ class InfortrendNASDriver(driver.ShareDriver): driver_version=self.VERSION, storage_protocol=self.PROTOCOL, reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), pools=self.ift_nas.update_pools_stats()) LOG.debug('Infortrend pools status: %s', data['pools']) diff --git a/manila/share/drivers/inspur/as13000/as13000_nas.py b/manila/share/drivers/inspur/as13000/as13000_nas.py index c2870aa449..6a5811f089 100644 --- a/manila/share/drivers/inspur/as13000/as13000_nas.py +++ b/manila/share/drivers/inspur/as13000/as13000_nas.py @@ -611,6 +611,9 @@ class AS13000ShareDriver(driver.ShareDriver): 'pool_name': path, 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage, 'max_over_subscription_ratio': self.configuration.max_over_subscription_ratio, 'dedupe': False, diff --git a/manila/share/drivers/inspur/instorage/instorage.py b/manila/share/drivers/inspur/instorage/instorage.py index d2cf30e26d..a3b8cbffa9 100644 --- a/manila/share/drivers/inspur/instorage/instorage.py +++ b/manila/share/drivers/inspur/instorage/instorage.py @@ -123,6 +123,9 @@ class InStorageShareDriver(driver.ShareDriver): 'storage_protocol': 'NFS_CIFS', 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': ( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), 'max_over_subscription_ratio': self.configuration.max_over_subscription_ratio, 'snapshot_support': False, @@ -299,6 +302,7 @@ class InStorageAssistant(object): 'free_capacity_gb': available, 'allocated_capacity_gb': total_allocated_capacity, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'qos': False, 'dedupe': False, 'compression': False, diff --git a/manila/share/drivers/lvm.py b/manila/share/drivers/lvm.py index b4c230a6e0..13dbb008c6 100644 --- a/manila/share/drivers/lvm.py +++ b/manila/share/drivers/lvm.py @@ -212,6 +212,9 @@ class LVMShareDriver(LVMMixin, driver.ShareDriver): 'storage_protocol': 'NFS_CIFS', 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': + (self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), 'snapshot_support': True, 'create_share_from_snapshot_support': True, 'revert_to_snapshot_support': True, @@ -233,6 +236,7 @@ class LVMShareDriver(LVMMixin, driver.ShareDriver): 'total_capacity_gb': float(total_size), 'free_capacity_gb': float(free_size), 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, }, ] def create_share(self, context, share, share_server=None): diff --git a/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py b/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py index 9b9d9138b3..6ac8fc75ff 100644 --- a/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py +++ b/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py @@ -422,6 +422,9 @@ class NetAppCmodeFileStorageLibrary(object): for aggr_name in sorted(aggregates): reserved_percentage = self.configuration.reserved_share_percentage + reserved_snapshot_percentage = ( + self.configuration.reserved_share_from_snapshot_percentage or + reserved_percentage) max_over_ratio = self.configuration.max_over_subscription_ratio total_capacity_gb = na_utils.round_down(float( @@ -443,6 +446,7 @@ class NetAppCmodeFileStorageLibrary(object): 'allocated_capacity_gb': allocated_capacity_gb, 'qos': qos_support, 'reserved_percentage': reserved_percentage, + 'reserved_snapshot_percentage': reserved_snapshot_percentage, 'max_over_subscription_ratio': max_over_ratio, 'dedupe': [True, False], 'compression': [True, False], diff --git a/manila/share/drivers/nexenta/ns4/nexenta_nfs_helper.py b/manila/share/drivers/nexenta/ns4/nexenta_nfs_helper.py index e02deb82cf..e5e7296e79 100644 --- a/manila/share/drivers/nexenta/ns4/nexenta_nfs_helper.py +++ b/manila/share/drivers/nexenta/ns4/nexenta_nfs_helper.py @@ -216,6 +216,9 @@ class NFSHelper(object): 'free_capacity_gb': free, 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': + (self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), 'compression': compression, 'dedupe': dedupe, 'max_over_subscription_ratio': ( diff --git a/manila/share/drivers/nexenta/ns5/nexenta_nas.py b/manila/share/drivers/nexenta/ns5/nexenta_nas.py index f1a6c4d280..26be90c8a5 100644 --- a/manila/share/drivers/nexenta/ns5/nexenta_nas.py +++ b/manila/share/drivers/nexenta/ns5/nexenta_nas.py @@ -519,6 +519,9 @@ class NexentaNasDriver(driver.ShareDriver): 'free_capacity_gb': free, 'reserved_percentage': ( self.configuration.reserved_share_percentage), + 'reserved_snapshot_percentage': + (self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), 'max_over_subscription_ratio': ( self.configuration.safe_get( 'max_over_subscription_ratio')), diff --git a/manila/share/drivers/purestorage/flashblade.py b/manila/share/drivers/purestorage/flashblade.py index 06ff638a46..8006c641f5 100644 --- a/manila/share/drivers/purestorage/flashblade.py +++ b/manila/share/drivers/purestorage/flashblade.py @@ -146,11 +146,17 @@ class FlashBladeShareDriver(driver.ShareDriver): ) = self._get_available_capacity() reserved_share_percentage = self.configuration.safe_get( - "reserved_safe_percentage" + "reserved_share_percentage" ) if reserved_share_percentage is None: reserved_share_percentage = 0 + reserved_share_from_snapshot_percentage = self.configuration.safe_get( + "reserved_share_from_snapshot_percentage" + ) + if reserved_share_from_snapshot_percentage is None: + reserved_share_from_snapshot_percentage = reserved_share_percentage + data = dict( share_backend_name=self._backend_name, vendor_name="PURE STORAGE", @@ -158,6 +164,8 @@ class FlashBladeShareDriver(driver.ShareDriver): storage_protocol="NFS", data_reduction=data_reduction, reserved_percentage=reserved_share_percentage, + reserved_snapshot_percentage=( + reserved_share_from_snapshot_percentage), total_capacity_gb=float(physical_capacity_bytes) / units.Gi, free_capacity_gb=float(free_capacity_bytes) / units.Gi, provisioned_capacity_gb=float(provisioned_cap_bytes) / units.Gi, diff --git a/manila/share/drivers/qnap/qnap.py b/manila/share/drivers/qnap/qnap.py index 6d8d845454..a4a5c444e5 100644 --- a/manila/share/drivers/qnap/qnap.py +++ b/manila/share/drivers/qnap/qnap.py @@ -259,6 +259,9 @@ class QnapShareDriver(driver.ShareDriver): reserved_percentage = self.configuration.safe_get( 'reserved_share_percentage') + reserved_snapshot_percentage = self.configuration.safe_get( + 'reserved_share_from_snapshot_percentage') or reserved_percentage + # single pool now, need support multiple pools in the future single_pool = { "pool_name": self.configuration.qnap_poolname, @@ -266,6 +269,7 @@ class QnapShareDriver(driver.ShareDriver): "free_capacity_gb": free_capacity_gb, "allocated_capacity_gb": alloc_capacity_gb, "reserved_percentage": reserved_percentage, + "reserved_snapshot_percentage": reserved_snapshot_percentage, "qos": False, "dedupe": [True, False], "compression": [True, False], diff --git a/manila/share/drivers/quobyte/quobyte.py b/manila/share/drivers/quobyte/quobyte.py index e60f80a384..37637937a2 100644 --- a/manila/share/drivers/quobyte/quobyte.py +++ b/manila/share/drivers/quobyte/quobyte.py @@ -142,7 +142,10 @@ class QuobyteShareDriver(driver.ExecuteMixin, driver.ShareDriver,): driver_version=self.DRIVER_VERSION, total_capacity_gb=total_gb, free_capacity_gb=free_gb, - reserved_percentage=self.configuration.reserved_share_percentage) + reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage)) super(QuobyteShareDriver, self)._update_share_stats(data) def _get_capacities(self): diff --git a/manila/share/drivers/tegile/tegile.py b/manila/share/drivers/tegile/tegile.py index 202f7baef2..7590120a9b 100644 --- a/manila/share/drivers/tegile/tegile.py +++ b/manila/share/drivers/tegile/tegile.py @@ -447,6 +447,9 @@ class TegileShareDriver(driver.ShareDriver): pool['qos'] = pool.pop('QoS_support', False) pool['reserved_percentage'] = ( self.configuration.reserved_share_percentage) + pool['reserved_snapshot_percentage'] = ( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage) pool['dedupe'] = True pool['compression'] = True pool['thin_provisioning'] = True diff --git a/manila/share/drivers/veritas/veritas_isa.py b/manila/share/drivers/veritas/veritas_isa.py index deaa37ce18..3f19de3d39 100644 --- a/manila/share/drivers/veritas/veritas_isa.py +++ b/manila/share/drivers/veritas/veritas_isa.py @@ -622,6 +622,7 @@ class ACCESSShareDriver(driver.ExecuteMixin, driver.ShareDriver): 'total_capacity_gb': total_capacity, 'free_capacity_gb': free_capacity, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'QoS_support': False, 'snapshot_support': True, 'create_share_from_snapshot_support': True diff --git a/manila/share/drivers/zadara/zadara.py b/manila/share/drivers/zadara/zadara.py index 7e9d5b3f2a..3e4e1a208b 100644 --- a/manila/share/drivers/zadara/zadara.py +++ b/manila/share/drivers/zadara/zadara.py @@ -495,6 +495,9 @@ class ZadaraVPSAShareDriver(driver.ShareDriver): allocated_capacity_gb=(total - free), provisioned_capacity_gb=provisioned, reserved_percentage=self.configuration.reserved_share_percentage, + reserved_snapshot_percentage=( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), compression=[True, False], dedupe=[True, False], thin_provisioning=True diff --git a/manila/share/drivers/zfsonlinux/driver.py b/manila/share/drivers/zfsonlinux/driver.py index 223c2cb940..aad4b9846d 100644 --- a/manila/share/drivers/zfsonlinux/driver.py +++ b/manila/share/drivers/zfsonlinux/driver.py @@ -358,6 +358,9 @@ class ZFSonLinuxShareDriver(zfs_utils.ExecuteMixin, driver.ShareDriver): 'free_capacity_gb': float(free_size), 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': ( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), } pool.update(self.common_capabilities) if self.configuration.replication_domain: @@ -372,6 +375,9 @@ class ZFSonLinuxShareDriver(zfs_utils.ExecuteMixin, driver.ShareDriver): 'storage_protocol': 'NFS', 'reserved_percentage': self.configuration.reserved_share_percentage, + 'reserved_snapshot_percentage': ( + self.configuration.reserved_share_from_snapshot_percentage + or self.configuration.reserved_share_percentage), 'snapshot_support': True, 'create_share_from_snapshot_support': True, 'driver_name': 'ZFS', diff --git a/manila/tests/scheduler/fakes.py b/manila/tests/scheduler/fakes.py index 1cdfdebb65..76f907023d 100644 --- a/manila/tests/scheduler/fakes.py +++ b/manila/tests/scheduler/fakes.py @@ -46,6 +46,7 @@ SERVICE_STATES_NO_POOLS = { 'host1': dict(share_backend_name='AAA', total_capacity_gb=512, free_capacity_gb=200, timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=312, max_over_subscription_ratio=1.0, thin_provisioning=False, @@ -57,6 +58,7 @@ SERVICE_STATES_NO_POOLS = { 'host2@back1': dict(share_backend_name='BBB', total_capacity_gb=256, free_capacity_gb=100, timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=400, max_over_subscription_ratio=2.0, thin_provisioning=True, @@ -68,6 +70,7 @@ SERVICE_STATES_NO_POOLS = { 'host2@back2': dict(share_backend_name='CCC', total_capacity_gb=10000, free_capacity_gb=700, timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=50000, max_over_subscription_ratio=20.0, thin_provisioning=True, @@ -103,6 +106,7 @@ SHARE_SERVICES_WITH_POOLS = [ SHARE_SERVICE_STATES_WITH_POOLS = { 'host1@AAA': dict(share_backend_name='AAA', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -112,11 +116,13 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=51, free_capacity_gb=41, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=10, max_over_subscription_ratio=1.0, thin_provisioning=False)]), 'host2@BBB': dict(share_backend_name='BBB', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -126,11 +132,13 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=52, free_capacity_gb=42, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=60, max_over_subscription_ratio=2.0, thin_provisioning=True)]), 'host3@CCC': dict(share_backend_name='CCC', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -140,11 +148,13 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=53, free_capacity_gb=43, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=100, max_over_subscription_ratio=20.0, thin_provisioning=True)]), 'host4@DDD': dict(share_backend_name='DDD', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -154,6 +164,7 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=541, free_capacity_gb=441, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=800, max_over_subscription_ratio=2.0, thin_provisioning=True), @@ -161,11 +172,13 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=542, free_capacity_gb=442, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=2000, max_over_subscription_ratio=10.0, thin_provisioning=True)]), 'host5@EEE': dict(share_backend_name='EEE', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -175,6 +188,7 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=551, free_capacity_gb=451, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=100, max_over_subscription_ratio=1.0, thin_provisioning=False), @@ -182,11 +196,13 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb=552, free_capacity_gb=452, reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=100, max_over_subscription_ratio=1.0, thin_provisioning=False)]), 'host6@FFF': dict(share_backend_name='FFF', timestamp=None, reserved_percentage=0, + reserved_snapshot_percentage=0, driver_handles_share_servers=False, snapshot_support=True, create_share_from_snapshot_support=True, @@ -196,6 +212,7 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb='unknown', free_capacity_gb='unknown', reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=100, max_over_subscription_ratio=1.0, thin_provisioning=False), @@ -203,6 +220,7 @@ SHARE_SERVICE_STATES_WITH_POOLS = { total_capacity_gb='unknown', free_capacity_gb='unknown', reserved_percentage=0, + reserved_snapshot_percentage=0, provisioned_capacity_gb=100, max_over_subscription_ratio=1.0, thin_provisioning=False)]), @@ -225,6 +243,7 @@ class FakeHostManager(host_manager.HostManager): 'allocated_capacity_gb': 0, 'thin_provisioning': False, 'reserved_percentage': 10, + 'reserved_snapshot_percentage': 5, 'timestamp': None, 'snapshot_support': True, 'create_share_from_snapshot_support': True, @@ -239,6 +258,7 @@ class FakeHostManager(host_manager.HostManager): 'max_over_subscription_ratio': 2.0, 'thin_provisioning': True, 'reserved_percentage': 10, + 'reserved_snapshot_percentage': 5, 'timestamp': None, 'snapshot_support': True, 'create_share_from_snapshot_support': True, @@ -253,6 +273,7 @@ class FakeHostManager(host_manager.HostManager): 'max_over_subscription_ratio': 2.0, 'thin_provisioning': [False], 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'snapshot_support': True, 'create_share_from_snapshot_support': True, 'timestamp': None, @@ -265,6 +286,7 @@ class FakeHostManager(host_manager.HostManager): 'max_over_subscription_ratio': 1.0, 'thin_provisioning': [True], 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'timestamp': None, 'snapshot_support': True, 'create_share_from_snapshot_support': True, @@ -279,6 +301,7 @@ class FakeHostManager(host_manager.HostManager): 'max_over_subscription_ratio': 1.5, 'thin_provisioning': [True, False], 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'timestamp': None, 'snapshot_support': True, 'create_share_from_snapshot_support': True, @@ -290,6 +313,7 @@ class FakeHostManager(host_manager.HostManager): 'allocated_capacity_gb': 1548, 'thin_provisioning': False, 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'snapshot_support': True, 'create_share_from_snapshot_support': True, 'timestamp': None, diff --git a/manila/tests/scheduler/filters/test_capacity.py b/manila/tests/scheduler/filters/test_capacity.py index ff6b81e608..efb40ce15b 100644 --- a/manila/tests/scheduler/filters/test_capacity.py +++ b/manila/tests/scheduler/filters/test_capacity.py @@ -71,6 +71,48 @@ class HostFiltersTestCase(test.TestCase): 'service': service}) self.assertFalse(self.filter.host_passes(host, filter_properties)) + @ddt.data( + {'free_capacity': 120, 'total_capacity': 200, + 'reserved': 20, 'reserved_snapshot': 5}) + @ddt.unpack + def test_capacity_filter_passes_snapshot_reserved(self, free_capacity, + total_capacity, + reserved, + reserved_snapshot): + self._stub_service_is_up(True) + filter_properties = {'size': 100, 'snapshot_id': 1234} + service = {'disabled': False} + host = fakes.FakeHostState('host1', + {'total_capacity_gb': total_capacity, + 'free_capacity_gb': free_capacity, + 'reserved_percentage': reserved, + 'reserved_snapshot_percentage': + reserved_snapshot, + 'updated_at': None, + 'service': service}) + self.assertTrue(self.filter.host_passes(host, filter_properties)) + + @ddt.data( + {'free_capacity': 120, 'total_capacity': 200, + 'reserved': 20, 'reserved_snapshot': 15}) + @ddt.unpack + def test_capacity_filter_fails_snapshot_reserved(self, free_capacity, + total_capacity, + reserved, + reserved_snapshot): + self._stub_service_is_up(True) + filter_properties = {'size': 100, 'snapshot_id': 1234} + service = {'disabled': False} + host = fakes.FakeHostState('host1', + {'total_capacity_gb': total_capacity, + 'free_capacity_gb': free_capacity, + 'reserved_percentage': reserved, + 'reserved_snapshot_percentage': + reserved_snapshot, + 'updated_at': None, + 'service': service}) + self.assertFalse(self.filter.host_passes(host, filter_properties)) + def test_capacity_filter_passes_unknown(self): free = 'unknown' self._stub_service_is_up(True) @@ -183,6 +225,7 @@ class HostFiltersTestCase(test.TestCase): self._stub_service_is_up(True) filter_properties = { 'size': size, + 'snapshot_id': None, 'share_type': { 'extra_specs': { cap_thin_key: cap_thin, diff --git a/manila/tests/scheduler/test_host_manager.py b/manila/tests/scheduler/test_host_manager.py index da3630f7df..7f45121555 100644 --- a/manila/tests/scheduler/test_host_manager.py +++ b/manila/tests/scheduler/test_host_manager.py @@ -197,6 +197,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 512, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 312, 'max_over_subscription_ratio': 1.0, 'thin_provisioning': False, @@ -226,6 +227,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 256, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 400, 'max_over_subscription_ratio': 2.0, 'thin_provisioning': True, @@ -255,6 +257,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 10000, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 50000, 'max_over_subscription_ratio': 20.0, 'thin_provisioning': True, @@ -306,6 +309,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 51, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 10, 'max_over_subscription_ratio': 1.0, 'thin_provisioning': False, @@ -336,6 +340,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 52, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 60, 'max_over_subscription_ratio': 2.0, 'thin_provisioning': True, @@ -366,6 +371,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 53, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 100, 'max_over_subscription_ratio': 20.0, 'thin_provisioning': True, @@ -396,6 +402,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 541, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 800, 'max_over_subscription_ratio': 2.0, 'thin_provisioning': True, @@ -426,6 +433,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 542, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 2000, 'max_over_subscription_ratio': 10.0, 'thin_provisioning': True, @@ -494,6 +502,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 512, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'vendor_name': None, 'storage_protocol': None, 'provisioned_capacity_gb': 312, @@ -523,6 +532,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 256, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'vendor_name': None, 'storage_protocol': None, 'provisioned_capacity_gb': 400, @@ -580,6 +590,7 @@ class HostManagerTestCase(test.TestCase): 'driver_version': None, 'total_capacity_gb': 52, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 60, 'max_over_subscription_ratio': 2.0, 'thin_provisioning': True, @@ -644,6 +655,7 @@ class HostStateTestCase(test.TestCase): share_capability = {'total_capacity_gb': 0, 'free_capacity_gb': 100, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'ipv4_support': True, 'ipv6_support': False} @@ -696,6 +708,7 @@ class HostStateTestCase(test.TestCase): 'allocated_capacity_gb': 270, 'qos': 'False', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'dying_disks': 100, 'super_hero_1': 'spider-man', 'super_hero_2': 'flash', @@ -707,6 +720,7 @@ class HostStateTestCase(test.TestCase): 'allocated_capacity_gb': 0, 'qos': 'False', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'dying_disks': 200, 'super_hero_1': 'superman', 'super_hero_2': 'Hulk', @@ -752,6 +766,7 @@ class HostStateTestCase(test.TestCase): 'allocated_capacity_gb': 0, 'qos': 'False', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, }, ], 'timestamp': None, @@ -778,6 +793,7 @@ class HostStateTestCase(test.TestCase): 'free_capacity_gb': 'unknown', 'allocated_capacity_gb': 1, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None } fake_context = context.RequestContext('user', 'project', is_admin=True) @@ -806,6 +822,7 @@ class HostStateTestCase(test.TestCase): 'provisioned_capacity_gb': provisioned_capacity_gb, 'allocated_capacity_gb': provisioned_capacity_gb, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None } fake_host = host_manager.PoolState('host1', share_capability, '_pool0') @@ -827,6 +844,7 @@ class HostStateTestCase(test.TestCase): 'provisioned_capacity_gb': None, 'allocated_capacity_gb': 0, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None } fake_context = context.RequestContext('user', 'project', is_admin=True) @@ -864,6 +882,7 @@ class HostStateTestCase(test.TestCase): 'allocated_capacity_gb': 5000, 'timestamp': None, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, } fake_context = context.RequestContext('user', 'project', is_admin=True) fake_host = host_manager.HostState('host1') @@ -886,6 +905,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': True, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': @@ -908,6 +928,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': False, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -929,6 +950,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': [False], 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -950,6 +972,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': [True, False], 'cap1': 'val1', 'cap2': 'val2'}, 'instances': @@ -972,6 +995,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': True, 'ipv6_support': False}, 'instances': [] @@ -980,6 +1004,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': True, 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': True, 'ipv6_support': False}, 'instances': [] @@ -988,6 +1013,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': [False], 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': True, 'ipv6_support': False}, 'instances': [] @@ -996,6 +1022,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'reserved_percentage': 0, 'timestamp': None, + 'reserved_snapshot_percentage': 0, 'thin_provisioning': [True, False], 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': True, 'ipv6_support': False}, 'instances': [] @@ -1004,6 +1031,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': False, 'ipv6_support': True }, @@ -1021,6 +1049,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': True, 'ipv6_support': True}, 'instances': [] @@ -1029,6 +1058,7 @@ class PoolStateTestCase(test.TestCase): 'share_capability': {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'provisioned_capacity_gb': 256, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2', 'ipv4_support': False, 'ipv6_support': False }, @@ -1047,6 +1077,7 @@ class PoolStateTestCase(test.TestCase): {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'provisioned_capacity_gb': 1, 'thin_provisioning': True, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -1063,6 +1094,7 @@ class PoolStateTestCase(test.TestCase): {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'provisioned_capacity_gb': 1, 'thin_provisioning': [False], 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -1079,6 +1111,7 @@ class PoolStateTestCase(test.TestCase): {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'provisioned_capacity_gb': 1, 'thin_provisioning': [True, False], 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -1095,6 +1128,7 @@ class PoolStateTestCase(test.TestCase): {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'provisioned_capacity_gb': 256, 'thin_provisioning': False, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ @@ -1111,6 +1145,7 @@ class PoolStateTestCase(test.TestCase): {'total_capacity_gb': 1024, 'free_capacity_gb': 512, 'allocated_capacity_gb': 256, 'provisioned_capacity_gb': 256, 'thin_provisioning': [False], 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'timestamp': None, 'cap1': 'val1', 'cap2': 'val2'}, 'instances': [ diff --git a/manila/tests/share/drivers/cephfs/test_driver.py b/manila/tests/share/drivers/cephfs/test_driver.py index 905d9db81b..4b9a71ff27 100644 --- a/manila/tests/share/drivers/cephfs/test_driver.py +++ b/manila/tests/share/drivers/cephfs/test_driver.py @@ -542,11 +542,14 @@ class CephFSDriverTestCase(test.TestCase): self._driver.get_configured_ip_versions = mock.Mock(return_value=[4]) self._driver.configuration.local_conf.set_override( 'reserved_share_percentage', 5) + self._driver.configuration.local_conf.set_override( + 'reserved_share_from_snapshot_percentage', 2) self._driver._update_share_stats() result = self._driver._stats self.assertEqual(5, result['pools'][0]['reserved_percentage']) + self.assertEqual(2, result['pools'][0]['reserved_snapshot_percentage']) self.assertEqual(164.94, result['pools'][0]['total_capacity_gb']) self.assertEqual(149.84, result['pools'][0]['free_capacity_gb']) self.assertTrue(result['ipv4_support']) diff --git a/manila/tests/share/drivers/container/test_driver.py b/manila/tests/share/drivers/container/test_driver.py index 1fccaec636..e151fdad44 100644 --- a/manila/tests/share/drivers/container/test_driver.py +++ b/manila/tests/share/drivers/container/test_driver.py @@ -102,6 +102,8 @@ class ContainerShareDriverTestCase(test.TestCase): self.assertEqual('Docker', self._driver._stats['share_backend_name']) self.assertEqual('CIFS', self._driver._stats['storage_protocol']) self.assertEqual(0, self._driver._stats['reserved_percentage']) + self.assertEqual(0, + self._driver._stats['reserved_snapshot_percentage']) self.assertIsNone(self._driver._stats['consistency_group_support']) self.assertEqual(False, self._driver._stats['snapshot_support']) self.assertEqual('ContainerShareDriver', diff --git a/manila/tests/share/drivers/container/test_storage_helper.py b/manila/tests/share/drivers/container/test_storage_helper.py index 9b5a2474c6..f854661521 100644 --- a/manila/tests/share/drivers/container/test_storage_helper.py +++ b/manila/tests/share/drivers/container/test_storage_helper.py @@ -55,6 +55,7 @@ class LVMHelperTestCase(test.TestCase): @ddt.data("62.50g 72.50g", " 72.50g 62.50g\n", " <62.50g <72.50g\n") def test_get_share_server_pools(self, ret_vgs): expected_result = [{'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'pool_name': 'manila_docker_volumes', 'total_capacity_gb': 72.5, 'free_capacity_gb': 62.5}] diff --git a/manila/tests/share/drivers/dell_emc/plugins/unity/res_mock.py b/manila/tests/share/drivers/dell_emc/plugins/unity/res_mock.py index caead56989..6f4e28681b 100644 --- a/manila/tests/share/drivers/dell_emc/plugins/unity/res_mock.py +++ b/manila/tests/share/drivers/dell_emc/plugins/unity/res_mock.py @@ -350,6 +350,7 @@ def do_connection_connect(conn, res): conn.pool_conf = ['pool_1', 'pool_2'] conn.pool_set = set(['pool_1', 'pool_2']) conn.reserved_percentage = 0 + conn.reserved_snapshot_percentage = 0 conn.max_over_subscription_ratio = 20 conn.port_set = set(['spa_eth1', 'spa_eth2']) conn.nas_server_pool = StorageObjectMock(res['nas_server_pool']) diff --git a/manila/tests/share/drivers/dell_emc/plugins/unity/test_connection.py b/manila/tests/share/drivers/dell_emc/plugins/unity/test_connection.py index e17207a408..0e6a921ace 100644 --- a/manila/tests/share/drivers/dell_emc/plugins/unity/test_connection.py +++ b/manila/tests/share/drivers/dell_emc/plugins/unity/test_connection.py @@ -302,6 +302,7 @@ class TestConnection(test.TestCase): self.assertEqual( enas_utils.bytes_to_gb(10000.0), pool['allocated_capacity_gb']) self.assertEqual(0, pool['reserved_percentage']) + self.assertEqual(0, pool['reserved_snapshot_percentage']) self.assertTrue(pool['thin_provisioning']) self.assertEqual( enas_utils.bytes_to_gb(490000.0), pool['free_capacity_gb']) diff --git a/manila/tests/share/drivers/dell_emc/test_driver.py b/manila/tests/share/drivers/dell_emc/test_driver.py index c95eb042f5..abdb05e83c 100644 --- a/manila/tests/share/drivers/dell_emc/test_driver.py +++ b/manila/tests/share/drivers/dell_emc/test_driver.py @@ -127,6 +127,7 @@ class EMCShareFrameworkTestCase(test.TestCase): data['total_capacity_gb'] = 'unknown' data['free_capacity_gb'] = 'unknown' data['reserved_percentage'] = 0 + data['reserved_snapshot_percentage'] = 0 data['qos'] = False data['pools'] = None data['snapshot_support'] = True diff --git a/manila/tests/share/drivers/dummy.py b/manila/tests/share/drivers/dummy.py index c194ae77b9..c01447854f 100644 --- a/manila/tests/share/drivers/dummy.py +++ b/manila/tests/share/drivers/dummy.py @@ -432,7 +432,10 @@ class DummyDriver(driver.ShareDriver): "pool_name": "fake_pool_for_%s" % self.backend_name, "total_capacity_gb": 1230.0, "free_capacity_gb": 1210.0, - "reserved_percentage": self.configuration.reserved_share_percentage + "reserved_percentage": + self.configuration.reserved_share_percentage, + "reserved_snapshot_percentage": + self.configuration.reserved_share_from_snapshot_percentage }] if self.configuration.replication_domain: pools[0]["replication_type"] = "readable" @@ -446,6 +449,8 @@ class DummyDriver(driver.ShareDriver): "storage_protocol": "NFS_CIFS", "reserved_percentage": self.configuration.reserved_share_percentage, + "reserved_snapshot_percentage": + self.configuration.reserved_share_from_snapshot_percentage, "snapshot_support": True, "create_share_from_snapshot_support": True, "revert_to_snapshot_support": True, diff --git a/manila/tests/share/drivers/glusterfs/test_glusterfs_native.py b/manila/tests/share/drivers/glusterfs/test_glusterfs_native.py index 07139919cf..cf885960b2 100644 --- a/manila/tests/share/drivers/glusterfs/test_glusterfs_native.py +++ b/manila/tests/share/drivers/glusterfs/test_glusterfs_native.py @@ -252,6 +252,7 @@ class GlusterfsNativeShareDriverTestCase(test.TestCase): 'driver_version': '1.1', 'storage_protocol': 'glusterfs', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'qos': False, 'total_capacity_gb': 'unknown', 'free_capacity_gb': 'unknown', diff --git a/manila/tests/share/drivers/hitachi/hnas/test_driver.py b/manila/tests/share/drivers/hitachi/hnas/test_driver.py index 931abc49c6..ee48e210de 100644 --- a/manila/tests/share/drivers/hitachi/hnas/test_driver.py +++ b/manila/tests/share/drivers/hitachi/hnas/test_driver.py @@ -971,6 +971,8 @@ class HitachiHNASTestCase(test.TestCase): 'total_capacity_gb': 1000, 'free_capacity_gb': 200, 'reserved_percentage': driver.CONF.reserved_share_percentage, + 'reserved_snapshot_percentage': + driver.CONF.reserved_share_from_snapshot_percentage, 'qos': False, 'thin_provisioning': True, 'dedupe': True, diff --git a/manila/tests/share/drivers/hitachi/hsp/fakes.py b/manila/tests/share/drivers/hitachi/hsp/fakes.py index a8b770cee8..040e8a97c5 100644 --- a/manila/tests/share/drivers/hitachi/hsp/fakes.py +++ b/manila/tests/share/drivers/hitachi/hsp/fakes.py @@ -73,6 +73,7 @@ stats_data = { 'storage_protocol': 'NFS', 'pools': [{ 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'pool_name': 'HSP', 'thin_provisioning': True, 'total_capacity_gb': 100, diff --git a/manila/tests/share/drivers/hpe/test_hpe_3par_driver.py b/manila/tests/share/drivers/hpe/test_hpe_3par_driver.py index 3e809bb05a..1cd7b45291 100644 --- a/manila/tests/share/drivers/hpe/test_hpe_3par_driver.py +++ b/manila/tests/share/drivers/hpe/test_hpe_3par_driver.py @@ -727,6 +727,7 @@ class HPE3ParDriverTestCase(test.TestCase): 'free_capacity_gb': 0, 'max_over_subscription_ratio': None, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': 0, 'share_backend_name': 'HPE_3PAR', 'snapshot_support': True, @@ -788,6 +789,7 @@ class HPE3ParDriverTestCase(test.TestCase): 'hpe3par_flash_cache': False, 'hp3par_flash_cache': False, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': expected_capacity } @@ -801,6 +803,7 @@ class HPE3ParDriverTestCase(test.TestCase): 'free_capacity_gb': 0, 'provisioned_capacity_gb': 0, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'max_over_subscription_ratio': None, 'max_share_server_size': -1, 'max_shares_per_share_server': -1, @@ -815,6 +818,7 @@ class HPE3ParDriverTestCase(test.TestCase): 'hpe3par_flash_cache': False, 'hp3par_flash_cache': False, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'provisioned_capacity_gb': expected_capacity}], 'snapshot_support': True, 'create_share_from_snapshot_support': True, @@ -858,6 +862,7 @@ class HPE3ParDriverTestCase(test.TestCase): 'pools': None, 'provisioned_capacity_gb': 0, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'share_backend_name': 'HPE_3PAR', 'storage_protocol': 'NFS_CIFS', 'thin_provisioning': True, diff --git a/manila/tests/share/drivers/huawei/test_huawei_nas.py b/manila/tests/share/drivers/huawei/test_huawei_nas.py index d5a8ae2621..ae127cbb6e 100644 --- a/manila/tests/share/drivers/huawei/test_huawei_nas.py +++ b/manila/tests/share/drivers/huawei/test_huawei_nas.py @@ -2420,6 +2420,7 @@ class HuaweiShareDriverTestCase(test.TestCase): "driver_version": "1.3", "storage_protocol": "NFS_CIFS", "reserved_percentage": 0, + 'reserved_snapshot_percentage': 0, "total_capacity_gb": 0.0, "free_capacity_gb": 0.0, "qos": True, @@ -2447,6 +2448,7 @@ class HuaweiShareDriverTestCase(test.TestCase): allocated_capacity_gb=1.0, qos=True, reserved_percentage=0, + reserved_snapshot_percentage=0, compression=[True, False], dedupe=[True, False], max_over_subscription_ratio=1, diff --git a/manila/tests/share/drivers/infinidat/test_infinidat.py b/manila/tests/share/drivers/infinidat/test_infinidat.py index dd4e634e41..3eda0a469b 100644 --- a/manila/tests/share/drivers/infinidat/test_infinidat.py +++ b/manila/tests/share/drivers/infinidat/test_infinidat.py @@ -102,6 +102,7 @@ class InfiniboxDriverTestCaseBase(test.TestCase): self.configuration.admin_network_config_group = ( 'test_admin_network_config_group') self.configuration.reserved_share_percentage = 0 + self.configuration.reserved_share_from_snapshot_percentage = 0 self.configuration.filter_function = None self.configuration.goodness_function = None self.configuration.driver_handles_share_servers = False diff --git a/manila/tests/share/drivers/inspur/as13000/test_as13000_nas.py b/manila/tests/share/drivers/inspur/as13000/test_as13000_nas.py index 05344e7077..acd58a3e4e 100644 --- a/manila/tests/share/drivers/inspur/as13000/test_as13000_nas.py +++ b/manila/tests/share/drivers/inspur/as13000/test_as13000_nas.py @@ -59,6 +59,8 @@ class FakeConfig(object): self.config_group = kwargs.get("config_group", "fake_config_group") self.reserved_share_percentage = kwargs.get( "reserved_share_percentage", 0) + self.reserved_share_from_snapshot_percentage = kwargs.get( + "reserved_share_from_snapshot_percentage", 0) self.max_over_subscription_ratio = kwargs.get( "max_over_subscription_ratio", 20.0) self.filter_function = kwargs.get("filter_function", None) @@ -881,6 +883,7 @@ class AS13000ShareDriverTestCase(test.TestCase): pool = dict() pool['pool_name'] = 'fakepath' pool['reserved_percentage'] = 0 + pool['reserved_snapshot_percentage'] = 0 pool['max_over_subscription_ratio'] = 20.0 pool['dedupe'] = False pool['compression'] = False diff --git a/manila/tests/share/drivers/inspur/instorage/test_instorage.py b/manila/tests/share/drivers/inspur/instorage/test_instorage.py index 2fff7fc1f0..4eb831e516 100644 --- a/manila/tests/share/drivers/inspur/instorage/test_instorage.py +++ b/manila/tests/share/drivers/inspur/instorage/test_instorage.py @@ -59,6 +59,8 @@ class FakeConfig(object): self.config_group = kwargs.get("config_group", "fake_config_group") self.reserved_share_percentage = kwargs.get( "reserved_share_percentage", 0) + self.reserved_share_from_snapshot_percentage = kwargs.get( + "reserved_share_from_snapshot_percentage", 0) self.max_over_subscription_ratio = kwargs.get( "max_over_subscription_ratio", 0) self.filter_function = kwargs.get("filter_function", None) @@ -137,6 +139,7 @@ class InStorageShareDriverTestCase(test.TestCase): 'free_capacity_gb': 100, 'allocated_capacity_gb': 10, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'qos': False, 'dedupe': False, 'compression': False, @@ -160,6 +163,7 @@ class InStorageShareDriverTestCase(test.TestCase): 'driver_version': '1.0.0', 'storage_protocol': 'NFS_CIFS', 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'max_over_subscription_ratio': 0, 'snapshot_support': False, 'create_share_from_snapshot_support': False, @@ -905,6 +909,7 @@ class InStorageAssistantTestCase(test.TestCase): 'allocated_capacity_gb': 10, 'qos': False, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'dedupe': False, 'compression': False, 'thin_provisioning': False, diff --git a/manila/tests/share/drivers/maprfs/test_maprfs.py b/manila/tests/share/drivers/maprfs/test_maprfs.py index 7e2cd5295a..4fc19d542b 100644 --- a/manila/tests/share/drivers/maprfs/test_maprfs.py +++ b/manila/tests/share/drivers/maprfs/test_maprfs.py @@ -709,7 +709,8 @@ class MapRFSNativeShareDriverTestCase(test.TestCase): 'qos', 'driver_version', 'share_backend_name', 'free_capacity_gb', 'total_capacity_gb', 'driver_handles_share_servers', - 'reserved_percentage', 'vendor_name', 'storage_protocol', + 'reserved_percentage', 'reserved_snapshot_percentage', + 'vendor_name', 'storage_protocol', ] for key in expected_keys: self.assertIn(key, result) diff --git a/manila/tests/share/drivers/netapp/dataontap/fakes.py b/manila/tests/share/drivers/netapp/dataontap/fakes.py index 63381a510f..885c83d477 100644 --- a/manila/tests/share/drivers/netapp/dataontap/fakes.py +++ b/manila/tests/share/drivers/netapp/dataontap/fakes.py @@ -896,6 +896,7 @@ POOLS = [ 'free_capacity_gb': 1.1, 'allocated_capacity_gb': 2.2, 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'max_over_subscription_ratio': 2.0, 'dedupe': [True, False], 'compression': [True, False], @@ -920,6 +921,7 @@ POOLS = [ 'free_capacity_gb': 2.0, 'allocated_capacity_gb': 4.0, 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'max_over_subscription_ratio': 2.0, 'dedupe': [True, False], 'compression': [True, False], @@ -947,6 +949,7 @@ POOLS_VSERVER_CREDS = [ 'free_capacity_gb': 1.1, 'allocated_capacity_gb': 0.0, 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'max_over_subscription_ratio': 2.0, 'dedupe': [True, False], 'compression': [True, False], @@ -968,6 +971,7 @@ POOLS_VSERVER_CREDS = [ 'free_capacity_gb': 2.0, 'allocated_capacity_gb': 0.0, 'reserved_percentage': 5, + 'reserved_snapshot_percentage': 2, 'max_over_subscription_ratio': 2.0, 'dedupe': [True, False], 'compression': [True, False], @@ -1693,6 +1697,7 @@ def get_config_cmode(): config = na_fakes.create_configuration_cmode() config.local_conf.set_override('share_backend_name', BACKEND_NAME) config.reserved_share_percentage = 5 + config.reserved_share_from_snapshot_percentage = 2 config.max_over_subscription_ratio = 2.0 config.netapp_login = CLIENT_KWARGS['username'] config.netapp_password = CLIENT_KWARGS['password'] diff --git a/manila/tests/share/drivers/nexenta/ns4/test_nexenta_nas.py b/manila/tests/share/drivers/nexenta/ns4/test_nexenta_nas.py index efc76f6e3c..1e671e9a95 100644 --- a/manila/tests/share/drivers/nexenta/ns4/test_nexenta_nas.py +++ b/manila/tests/share/drivers/nexenta/ns4/test_nexenta_nas.py @@ -89,6 +89,7 @@ class TestNexentaNasDriver(test.TestCase): self.cfg.safe_get = mock.Mock(side_effect=_safe_get) self.cfg.nexenta_rest_port = 1000 self.cfg.reserved_share_percentage = 0 + self.cfg.reserved_share_from_snapshot_percentage = 0 self.cfg.max_over_subscription_ratio = 0 self.cfg.nexenta_rest_protocol = 'auto' self.cfg.nexenta_volume = 'volume' @@ -593,6 +594,8 @@ class TestNexentaNasDriver(test.TestCase): 'pool_name': 'volume', 'reserved_percentage': ( self.cfg.reserved_share_percentage), + 'reserved_snapshot_percentage': ( + self.cfg.reserved_share_from_snapshot_percentage), 'compression': True, 'dedupe': True, 'thin_provisioning': self.cfg.nexenta_thin_provisioning, diff --git a/manila/tests/share/drivers/nexenta/ns5/test_nexenta_nas.py b/manila/tests/share/drivers/nexenta/ns5/test_nexenta_nas.py index 0bce1400d9..2245a0cffa 100644 --- a/manila/tests/share/drivers/nexenta/ns5/test_nexenta_nas.py +++ b/manila/tests/share/drivers/nexenta/ns5/test_nexenta_nas.py @@ -54,6 +54,7 @@ class TestNexentaNasDriver(test.TestCase): self.cfg.nexenta_pool = 'pool1' self.cfg.nexenta_dataset_record_size = 131072 self.cfg.reserved_share_percentage = 0 + self.cfg.reserved_share_from_snapshot_percentage = 0 self.cfg.nexenta_folder = 'nfs_share' self.cfg.nexenta_user = 'user' self.cfg.share_backend_name = 'NexentaStor5' @@ -391,6 +392,8 @@ class TestNexentaNasDriver(test.TestCase): 'max_over_subscription_ratio': 20.0, 'reserved_percentage': ( self.cfg.reserved_share_percentage), + 'reserved_snapshot_percentage': ( + self.cfg.reserved_share_from_snapshot_percentage), 'thin_provisioning': self.cfg.nexenta_thin_provisioning, }], } diff --git a/manila/tests/share/drivers/quobyte/test_quobyte.py b/manila/tests/share/drivers/quobyte/test_quobyte.py index 76b75de57a..3fdc0f8c7c 100644 --- a/manila/tests/share/drivers/quobyte/test_quobyte.py +++ b/manila/tests/share/drivers/quobyte/test_quobyte.py @@ -343,7 +343,8 @@ class QuobyteShareDriverTestCase(test.TestCase): driver_version=self._driver.DRIVER_VERSION, total_capacity_gb=42, free_capacity_gb=23, - reserved_percentage=0)) + reserved_percentage=0, + reserved_snapshot_percentage=0)) def test_get_capacities_gb(self): capval = 42115548133 diff --git a/manila/tests/share/drivers/tegile/test_tegile.py b/manila/tests/share/drivers/tegile/test_tegile.py index 217c4c19ae..5b7e03c226 100644 --- a/manila/tests/share/drivers/tegile/test_tegile.py +++ b/manila/tests/share/drivers/tegile/test_tegile.py @@ -38,6 +38,7 @@ test_config.tegile_nas_server = 'some-ip' test_config.tegile_nas_login = 'some-user' test_config.tegile_nas_password = 'some-password' test_config.reserved_share_percentage = 10 +test_config.reserved_share_from_snapshot_percentage = 5 test_config.max_over_subscription_ratio = 30.0 test_share = { @@ -82,6 +83,7 @@ array_stats = { 'QoS_support': False, 'free_capacity_gb': 911.812650680542, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'pool_name': 'pyramid', }, { @@ -89,6 +91,7 @@ array_stats = { 'QoS_support': False, 'free_capacity_gb': 2740.148867149747, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'pool_name': 'cobalt', }, { @@ -96,6 +99,7 @@ array_stats = { 'QoS_support': False, 'free_capacity_gb': 913.4198722839355, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'pool_name': 'test', }, ], @@ -447,6 +451,7 @@ class TegileShareDriverTestCase(test.TestCase): 'pool_name': 'pyramid', 'qos': False, 'reserved_percentage': 10, + 'reserved_snapshot_percentage': 5, 'thin_provisioning': True, 'max_over_subscription_ratio': 30.0, 'total_capacity_gb': 913.5}, @@ -458,6 +463,7 @@ class TegileShareDriverTestCase(test.TestCase): 'pool_name': 'cobalt', 'qos': False, 'reserved_percentage': 10, + 'reserved_snapshot_percentage': 5, 'thin_provisioning': True, 'max_over_subscription_ratio': 30.0, 'total_capacity_gb': 2742.1996604874 @@ -470,11 +476,13 @@ class TegileShareDriverTestCase(test.TestCase): 'pool_name': 'test', 'qos': False, 'reserved_percentage': 10, + 'reserved_snapshot_percentage': 5, 'thin_provisioning': True, 'max_over_subscription_ratio': 30.0, 'total_capacity_gb': 913.5}, ], 'qos': False, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'replication_domain': None, 'share_backend_name': 'Tegile', 'snapshot_support': True, diff --git a/manila/tests/share/drivers/test_generic.py b/manila/tests/share/drivers/test_generic.py index 139a77eb0b..dc5aa3b56b 100644 --- a/manila/tests/share/drivers/test_generic.py +++ b/manila/tests/share/drivers/test_generic.py @@ -1332,7 +1332,8 @@ class GenericShareDriverTestCase(test.TestCase): 'qos', 'driver_version', 'share_backend_name', 'free_capacity_gb', 'total_capacity_gb', 'driver_handles_share_servers', - 'reserved_percentage', 'vendor_name', 'storage_protocol', + 'reserved_percentage', 'reserved_snapshot_percentage', + 'vendor_name', 'storage_protocol', ] result = self._driver.get_share_stats(True) diff --git a/manila/tests/share/drivers/test_glusterfs.py b/manila/tests/share/drivers/test_glusterfs.py index dcabde3a61..6bda8df8b7 100644 --- a/manila/tests/share/drivers/test_glusterfs.py +++ b/manila/tests/share/drivers/test_glusterfs.py @@ -64,6 +64,7 @@ class GlusterfsShareDriverTestCase(test.TestCase): self.addCleanup(fake_utils.fake_execute_clear_log) CONF.set_default('reserved_share_percentage', 50) + CONF.set_default('reserved_share_from_snapshot_percentage', 30) CONF.set_default('driver_handles_share_servers', False) self.fake_conf = config.Configuration(None) @@ -155,7 +156,8 @@ class GlusterfsShareDriverTestCase(test.TestCase): assert_called_once_with({'storage_protocol': 'NFS', 'vendor_name': 'Red Hat', 'share_backend_name': 'GlusterFS', - 'reserved_percentage': 50})) + 'reserved_percentage': 50, + 'reserved_snapshot_percentage': 30})) def test_get_network_allocations_number(self): self.assertEqual(0, self._driver.get_network_allocations_number()) diff --git a/manila/tests/share/drivers/test_lvm.py b/manila/tests/share/drivers/test_lvm.py index 9301bbcdbd..49154c67f2 100644 --- a/manila/tests/share/drivers/test_lvm.py +++ b/manila/tests/share/drivers/test_lvm.py @@ -92,6 +92,7 @@ class LVMShareDriverTestCase(test.TestCase): CONF.set_default('lvm_share_export_ips', ['10.0.0.1', '10.0.0.2']) CONF.set_default('driver_handles_share_servers', False) CONF.set_default('reserved_share_percentage', 50) + CONF.set_default('reserved_share_from_snapshot_percentage', 30) self._helper_cifs = mock.Mock() self._helper_nfs = mock.Mock() @@ -531,6 +532,7 @@ class LVMShareDriverTestCase(test.TestCase): 'total_capacity_gb': 33, 'free_capacity_gb': 22, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, }, ] self.mock_object( self._driver, diff --git a/manila/tests/share/drivers/veritas/test_veritas_isa.py b/manila/tests/share/drivers/veritas/test_veritas_isa.py index df8de690d2..02c9e4e57b 100644 --- a/manila/tests/share/drivers/veritas/test_veritas_isa.py +++ b/manila/tests/share/drivers/veritas/test_veritas_isa.py @@ -432,6 +432,7 @@ class ACCESSShareDriverTestCase(test.TestCase): 'total_capacity_gb': 10, 'free_capacity_gb': 9, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'QoS_support': False, 'create_share_from_snapshot_support': True, 'driver_handles_share_servers': False, diff --git a/manila/tests/share/drivers/zadara/test_zadara.py b/manila/tests/share/drivers/zadara/test_zadara.py index 72d6f5ea4a..04519f9e51 100644 --- a/manila/tests/share/drivers/zadara/test_zadara.py +++ b/manila/tests/share/drivers/zadara/test_zadara.py @@ -736,6 +736,7 @@ class ZadaraVPSAShareDriverTestCase(test.TestCase): self.configuration.admin_network_config_group = ( 'fake_admin_network_config_group') self.configuration.reserved_percentage = 0 + self.configuration.reserved_snapshot_percentage = 0 self.configuration.zadara_use_iser = True self.configuration.zadara_vpsa_host = '192.168.5.5' self.configuration.zadara_vpsa_port = '80' @@ -755,6 +756,7 @@ class ZadaraVPSAShareDriverTestCase(test.TestCase): self.configuration.zadara_gen3_vol_dedupe = True self.configuration.share_backend_name = 'zadaravpsa' self.configuration.reserved_share_percentage = '0' + self.configuration.reserved_share_from_snapshot_percentage = '0' self.configuration.replication_domain = None self.configuration.filter_function = None self.configuration.goodness_function = None @@ -959,6 +961,8 @@ class ZadaraVPSAShareDriverTestCase(test.TestCase): self.assertEqual('unknown', data['free_capacity_gb']) self.assertEqual(data['reserved_percentage'], self.configuration.reserved_percentage) + self.assertEqual(data['reserved_snapshot_percentage'], + self.configuration.reserved_snapshot_percentage) self.assertEqual(data['snapshot_support'], True) self.assertEqual(data['create_share_from_snapshot_support'], True) self.assertEqual(data['revert_to_snapshot_support'], False) diff --git a/manila/tests/share/drivers/zfsonlinux/test_driver.py b/manila/tests/share/drivers/zfsonlinux/test_driver.py index 76241870c1..e4cbe2e020 100644 --- a/manila/tests/share/drivers/zfsonlinux/test_driver.py +++ b/manila/tests/share/drivers/zfsonlinux/test_driver.py @@ -62,6 +62,8 @@ class FakeConfig(object): self.config_group = kwargs.get("config_group", "fake_config_group") self.reserved_share_percentage = kwargs.get( "reserved_share_percentage", 0) + self.reserved_share_from_snapshot_percentage = kwargs.get( + "reserved_share_from_snapshot_percentage", 0) self.max_over_subscription_ratio = kwargs.get( "max_over_subscription_ratio", 15.0) self.filter_function = kwargs.get("filter_function", None) @@ -279,6 +281,7 @@ class ZFSonLinuxShareDriverTestCase(test.TestCase): expected = [ {'pool_name': 'foo', 'total_capacity_gb': 3.0, 'free_capacity_gb': 2.0, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'compression': [True, False], 'dedupe': [True, False], 'thin_provisioning': [True], @@ -287,6 +290,7 @@ class ZFSonLinuxShareDriverTestCase(test.TestCase): 'qos': [False]}, {'pool_name': 'bar', 'total_capacity_gb': 4.0, 'free_capacity_gb': 5.0, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'compression': [True, False], 'dedupe': [True, False], 'thin_provisioning': [True], @@ -355,6 +359,7 @@ class ZFSonLinuxShareDriverTestCase(test.TestCase): 'qos': False, 'replication_domain': replication_domain, 'reserved_percentage': 0, + 'reserved_snapshot_percentage': 0, 'share_backend_name': self.driver.backend_name, 'share_group_stats': {'consistent_snapshot_support': None}, 'snapshot_support': True, diff --git a/manila/tests/share/test_driver.py b/manila/tests/share/test_driver.py index 3e009b2cee..d9dcf35c28 100644 --- a/manila/tests/share/test_driver.py +++ b/manila/tests/share/test_driver.py @@ -140,7 +140,8 @@ class ShareDriverTestCase(test.TestCase): 'qos', 'driver_version', 'share_backend_name', 'free_capacity_gb', 'total_capacity_gb', 'driver_handles_share_servers', - 'reserved_percentage', 'vendor_name', 'storage_protocol', + 'reserved_percentage', 'reserved_snapshot_percentage', + 'vendor_name', 'storage_protocol', 'snapshot_support', 'mount_snapshot_support', ] share_driver = driver.ShareDriver(True, configuration=conf) diff --git a/releasenotes/notes/add-reserved-share-from-snapshot-percentage-2d913ae1fc533690.yaml b/releasenotes/notes/add-reserved-share-from-snapshot-percentage-2d913ae1fc533690.yaml new file mode 100644 index 0000000000..2d3cf93cf6 --- /dev/null +++ b/releasenotes/notes/add-reserved-share-from-snapshot-percentage-2d913ae1fc533690.yaml @@ -0,0 +1,10 @@ +--- +features: + - | + 'reserved_share_from_snapshot_percentage' backend config option allows + Manila to consider different reservation percentage for shares that are + being created from the snapshot. + In case this config option is not set, the shares created from snapshot + will use reservation percentage value set in 'reserved_share_percentage'. + This will be useful for users who want to keep same reservation percentage + for both non-snapshot/regular and snapshot shares.