
In order to do more sophisticated scheduling (e.g. schedule based on volume type), filter scheduler is introduced. Several changes are made to make this possible, some of them are similar to the counterpart in Nova: - add HostState class to host_manager in order to store volume capabilities - implement get_volume_stats() method of iSCSIDriver as an example to demonstrate how volume backend driver reports capabilities as well as status - add scheduler_options.py and 'scheduler_json_config_location' flag to be allow loading json configuration file for scheduler at run time - port common filters/weights from oslo - add capacity weigher (scheduler/weights/capacity.py) for picking up target volume backend by weighing free capacity of the host. The default behavior is to spread volumes across hosts; by changing the 'capacity_weight_multiplier' to negative number, volume placing behavior will become stacking. - add capacity filter which filters those hosts have insufficient storage space to serve the request. - add 'reserved_percentage' config option to indicate how much space is reserved. Capacity reservation is needed when volume resize is enabled. - add 'publish_service_capabilities()' method to volume RPC API to allow scheduler to have volume service report capabilities. This bumps volume RPC API to version 1.2 - remove 'volume_force_update_capabilities' config option, volume status will be report to scheduler in every checking. The implication of this change to storage/backend driver developer: - implementation of get_volume_stats() of the driver is now a *MUST*, filter scheduler heavily relies on the status/capabilities reported by backend driver to makeplacement decision. To ensure Cinder works seamlessly on the storage system, driver should at least report following capabilities/status: ----------------------+---------------------------+--------------------------- Capability/Status | Description | Example ----------------------+---------------------------+--------------------------- 'volume_backend_name'| back-end name, string | 'Example_Storage_Backend' ----------------------+---------------------------+--------------------------- 'vendor_name' | vendor name, string | 'OpenStackCinder' ----------------------+---------------------------+--------------------------- 'driver_version' | version, string | '1.0a' ----------------------+---------------------------+--------------------------- 'storage_protocol' | supported protocols, | 'iSCSI', 'RBD', 'FC', 'NFS' | string or list of strings | ['iSCSI', 'NFS', 'FC'] ----------------------+---------------------------+--------------------------- 'total_capacity_gb' | capacity in GB, integer | 102400 ----------------------+---------------------------+--------------------------- 'free_capacity_gb' | available capacity in GB, | 1000 | integer | ----------------------+---------------------------+--------------------------- 'reserved_percentage' | reserved space in | 0, 10 | percentage, integer | ----------------------+---------------------------+--------------------------- The implication of this change to Cinder administrator: - the default setting for filter scheduler should work well with the benefits of: * being able to fully utilize capacity of backends (driver now has to report actul total space and space utilization and scheduler uses these info) not limited by the 'max_gigabytes' config option any more; * being able to choose placement policy between spreading & stacking for volume creation (by modifying the 'capacity_weight_multiplier' in CapacityWeigher) - with filter scheduler, Cinder is now able to utilize the advanced features/ capabilities provided by different storage back-ends via: defining different volume types with proper extra_specs. Volume types can be considered as sets of back-end capabilities requirement. For example, a volume type which has 'storage_protocol':'FC' key/value pair definition in its extra_spec can only be served by those back-ends who report they support FiberChannel protocol. Another example is volume type has 'QoS' requirement can only be served by back-ends support QoS. Note/TODO: * Currently scheduler makes its decision based on the status and capabilities information reported by volume nodes, and these information is stored in memory of scheduler process. More sophisticated way may be add on table in DB to record status/capabilities of all volume nodes, like Nova does for compute nodes. implement bp volume-type-scheduler DocImpact Change-Id: I296b3727db8de0d4cf085fac602d122a7b474842
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2010 United States Government as represented by the
|
|
# Administrator of the National Aeronautics and Space Administration.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import setuptools
|
|
|
|
from cinder.openstack.common import setup as common_setup
|
|
from cinder import version
|
|
|
|
requires = common_setup.parse_requirements()
|
|
|
|
filters = [
|
|
"AvailabilityZoneFilter = "
|
|
"cinder.openstack.common.scheduler.filters."
|
|
"availability_zone_filter:AvailabilityZoneFilter",
|
|
"CapabilitiesFilter = "
|
|
"cinder.openstack.common.scheduler.filters."
|
|
"capabilities_filter:CapabilitiesFilter",
|
|
"CapacityFilter = "
|
|
"cinder.scheduler.filters.capacity_filter:CapacityFilter",
|
|
"JsonFilter = "
|
|
"cinder.openstack.common.scheduler.filters.json_filter:JsonFilter",
|
|
]
|
|
|
|
weights = [
|
|
"CapacityWeigher = cinder.scheduler.weights.capacity:CapacityWeigher",
|
|
]
|
|
|
|
setuptools.setup(
|
|
name='cinder',
|
|
version=version.canonical_version_string(),
|
|
description='block storage service',
|
|
author='OpenStack',
|
|
author_email='cinder@lists.launchpad.net',
|
|
url='http://www.openstack.org/',
|
|
classifiers=[
|
|
'Environment :: OpenStack',
|
|
'Intended Audience :: Information Technology',
|
|
'Intended Audience :: System Administrators',
|
|
'License :: OSI Approved :: Apache Software License',
|
|
'Operating System :: POSIX :: Linux',
|
|
'Programming Language :: Python',
|
|
'Programming Language :: Python :: 2',
|
|
'Programming Language :: Python :: 2.7',
|
|
],
|
|
cmdclass=common_setup.get_cmdclass(),
|
|
packages=setuptools.find_packages(exclude=['bin', 'smoketests']),
|
|
install_requires=requires,
|
|
entry_points={
|
|
'cinder.scheduler.filters': filters,
|
|
'cinder.scheduler.weights': weights,
|
|
},
|
|
include_package_data=True,
|
|
test_suite='nose.collector',
|
|
setup_requires=['setuptools_git>=0.4'],
|
|
scripts=['bin/cinder-all',
|
|
'bin/cinder-api',
|
|
'bin/cinder-clear-rabbit-queues',
|
|
'bin/cinder-manage',
|
|
'bin/cinder-rootwrap',
|
|
'bin/cinder-scheduler',
|
|
'bin/cinder-volume',
|
|
'bin/cinder-volume-usage-audit'],
|
|
py_modules=[])
|