Add check on docker_volume_size

In magnum server side, docker_volume_size allowed minimum value is 1GB.
In fact, the minimum value should be 3GB when docker-storage-driver is
devicemapper, because the limitation of docker-storage-setup. So, I add
check on "--docker-volume-size". If "--docker-storage-driver=devicemapper",
the minimum docker-volume-size should be 3GB, otherwise it should 1GB.

Change-Id: I53c6a9c93ee156fa9afabdbd72a87bb4044d71ca
Closes-Bug: #1583878
This commit is contained in:
ztetfger 2016-07-19 17:58:19 +08:00
parent 7a66c1cf56
commit 635e79e82e
5 changed files with 49 additions and 3 deletions

View File

@ -47,7 +47,7 @@ Create a baymodel, by default TLS is enabled in Magnum::
--external-network-id public \
--image-id fedora-atomic-latest \
--flavor-id m1.small \
--docker-volume-size 1 \
--docker-volume-size 3 \
--coe kubernetes \
--network-driver flannel
@ -65,7 +65,7 @@ Create a baymodel, by default TLS is enabled in Magnum::
| keypair_id | default |
| public | False |
| labels | {} |
| docker_volume_size | 1 |
| docker_volume_size | 3 |
| external_network_id | public |
| cluster_distro | fedora-atomic |
| image_id | fedora-atomic-latest |

View File

@ -200,7 +200,9 @@ They are loosely grouped as: mandatory, infrastructure, COE specific.
--docker-volume-size \<docker-volume-size\>
The size in GB for the local storage on each server for the Docker
daemon to cache the images and host the containers. Cinder volumes
provide the storage. The default is 25 GB.
provide the storage. The default is 25 GB. For the 'devicemapper'
storage driver, the minimum value is 3GB. For the 'overlay' storage
driver, the minimum value is 1GB.
--docker-storage-driver \<docker-storage-driver\>
The name of a driver to manage the storage for the images and the

View File

@ -318,6 +318,7 @@ class BayModelsController(rest.RestController):
@expose.expose(BayModel, body=BayModel, status_code=201)
@validation.enforce_network_driver_types_create()
@validation.enforce_volume_driver_types_create()
@validation.enforce_volume_storage_size_create()
def post(self, baymodel):
"""Create a new baymodel.

View File

@ -133,6 +133,16 @@ def enforce_volume_driver_types_create():
return wrapper
def enforce_volume_storage_size_create():
@decorator.decorator
def wrapper(func, *args, **kwargs):
baymodel = args[1]
_enforce_volume_storage_size(baymodel.as_dict())
return func(*args, **kwargs)
return wrapper
def enforce_volume_driver_types_update():
@decorator.decorator
def wrapper(func, *args, **kwargs):
@ -157,6 +167,19 @@ def _enforce_volume_driver_types(baymodel):
validator.validate_volume_driver(baymodel['volume_driver'])
def _enforce_volume_storage_size(baymodel):
if not baymodel.get('docker_volume_size'):
return
volume_size = baymodel.get('docker_volume_size')
storage_driver = baymodel.get('docker_storage_driver')
if storage_driver == 'devicemapper':
if volume_size < 3:
raise exception.InvalidParameterValue(
'docker volume size %s GB is not valid, '
'expecting minimum value 3GB for %s storage '
'driver.') % (volume_size, storage_driver)
def validate_bay_properties(delta):
update_disallowed_properties = delta - bay_update_allowed_properties

View File

@ -541,6 +541,12 @@ class TestPost(api_base.FunctionalTest):
def test_create_baymodel_with_invalid_docker_volume_size(self):
self._create_baymodel_raises_app_error(docker_volume_size=0)
self._create_baymodel_raises_app_error(docker_volume_size=-1)
self._create_baymodel_raises_app_error(
docker_volume_size=1,
docker_storage_driver="devicemapper")
self._create_baymodel_raises_app_error(
docker_volume_size=2,
docker_storage_driver="devicemapper")
self._create_baymodel_raises_app_error(docker_volume_size='notanint')
def test_create_baymodel_with_invalid_dns_nameserver(self):
@ -583,6 +589,20 @@ class TestPost(api_base.FunctionalTest):
cc_mock.assert_called_once_with(mock.ANY)
self.assertNotIn('id', cc_mock.call_args[0][0])
@mock.patch('magnum.api.attr_validator.validate_image')
def test_create_baymodel_with_overlay(self, mock_image_data):
with mock.patch.object(self.dbapi, 'create_baymodel',
wraps=self.dbapi.create_baymodel) as cc_mock:
mock_image_data.return_value = {'name': 'mock_name',
'os_distro': 'fedora-atomic'}
bdict = apiutils.baymodel_post_data(
docker_volume_size=1, docker_storage_driver="overlay")
response = self.post_json('/baymodels', bdict)
self.assertEqual(bdict['docker_volume_size'],
response.json['docker_volume_size'])
cc_mock.assert_called_once_with(mock.ANY)
self.assertNotIn('id', cc_mock.call_args[0][0])
@mock.patch('magnum.api.attr_validator.validate_image')
def test_create_baymodel_generate_uuid(self,
mock_image_data):