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.