diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-01-17 18:49:28 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-01-17 18:49:28 +0000 |
| commit | c3cf7ea354983dad7a7eed17ff35980997167c72 (patch) | |
| tree | e0880bfcd1bbd2ee434557116c9564da680c1753 | |
| parent | 1d8dc1eca40c7cb28dac622a81655576d4a43f3f (diff) | |
| parent | 3b5679e44754ad5138e1697ba233d91776199853 (diff) | |
| download | nova-c3cf7ea354983dad7a7eed17ff35980997167c72.tar.gz nova-c3cf7ea354983dad7a7eed17ff35980997167c72.tar.xz nova-c3cf7ea354983dad7a7eed17ff35980997167c72.zip | |
Merge "Validated device_name value in block device map"
| -rw-r--r-- | nova/api/openstack/compute/servers.py | 22 | ||||
| -rw-r--r-- | nova/tests/api/openstack/compute/test_servers.py | 68 |
2 files changed, 85 insertions, 5 deletions
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index f0fdb5a15..308530b8e 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -561,17 +561,28 @@ class Controller(wsgi.Controller): req.cache_db_instance(instance) return instance - def _validate_server_name(self, value): + def _check_string_length(self, value, name, max_length=None): if not isinstance(value, basestring): - msg = _("Server name is not a string or unicode") + msg = _("%s is not a string or unicode") % name raise exc.HTTPBadRequest(explanation=msg) if not value.strip(): - msg = _("Server name is an empty string") + msg = _("%s is an empty string") % name + raise exc.HTTPBadRequest(explanation=msg) + + if max_length and len(value) > max_length: + msg = _("%(name)s can be at most %(max_length)s " + "characters.") % locals() raise exc.HTTPBadRequest(explanation=msg) - if not len(value) < 256: - msg = _("Server name must be less than 256 characters.") + def _validate_server_name(self, value): + self._check_string_length(value, 'Server name', max_length=255) + + def _validate_device_name(self, value): + self._check_string_length(value, 'Device name', max_length=255) + + if ' ' in value: + msg = _("Device name cannot include spaces.") raise exc.HTTPBadRequest(explanation=msg) def _get_injected_files(self, personality): @@ -809,6 +820,7 @@ class Controller(wsgi.Controller): if self.ext_mgr.is_loaded('os-volumes'): block_device_mapping = server_dict.get('block_device_mapping', []) for bdm in block_device_mapping: + self._validate_device_name(bdm["device_name"]) if 'delete_on_termination' in bdm: bdm['delete_on_termination'] = utils.bool_from_str( bdm['delete_on_termination']) diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py index b69268d2a..43746223a 100644 --- a/nova/tests/api/openstack/compute/test_servers.py +++ b/nova/tests/api/openstack/compute/test_servers.py @@ -2197,6 +2197,74 @@ class ServersControllerCreateTest(test.TestCase): self.stubs.Set(compute_api.API, 'create', create) self._test_create_extra(params) + def test_create_instance_with_device_name_not_string(self): + self.ext_mgr.extensions = {'os-volumes': 'fake'} + bdm = [{'delete_on_termination': 1, + 'device_name': 123, + 'volume_size': 1, + 'volume_id': '11111111-1111-1111-1111-111111111111'}] + params = {'block_device_mapping': bdm} + old_create = compute_api.API.create + + def create(*args, **kwargs): + self.assertEqual(kwargs['block_device_mapping'], bdm) + return old_create(*args, **kwargs) + + self.stubs.Set(compute_api.API, 'create', create) + self.assertRaises(webob.exc.HTTPBadRequest, + self._test_create_extra, params) + + def test_create_instance_with_device_name_empty(self): + self.ext_mgr.extensions = {'os-volumes': 'fake'} + bdm = [{'delete_on_termination': 1, + 'device_name': '', + 'volume_size': 1, + 'volume_id': '11111111-1111-1111-1111-111111111111'}] + params = {'block_device_mapping': bdm} + old_create = compute_api.API.create + + def create(*args, **kwargs): + self.assertEqual(kwargs['block_device_mapping'], bdm) + return old_create(*args, **kwargs) + + self.stubs.Set(compute_api.API, 'create', create) + self.assertRaises(webob.exc.HTTPBadRequest, + self._test_create_extra, params) + + def test_create_instance_with_device_name_too_long(self): + self.ext_mgr.extensions = {'os-volumes': 'fake'} + bdm = [{'delete_on_termination': 1, + 'device_name': 'a' * 256, + 'volume_size': 1, + 'volume_id': '11111111-1111-1111-1111-111111111111'}] + params = {'block_device_mapping': bdm} + old_create = compute_api.API.create + + def create(*args, **kwargs): + self.assertEqual(kwargs['block_device_mapping'], bdm) + return old_create(*args, **kwargs) + + self.stubs.Set(compute_api.API, 'create', create) + self.assertRaises(webob.exc.HTTPBadRequest, + self._test_create_extra, params) + + def test_create_instance_with_space_in_device_name(self): + self.ext_mgr.extensions = {'os-volumes': 'fake'} + bdm = [{'delete_on_termination': 1, + 'device_name': 'vd a', + 'volume_size': 1, + 'volume_id': '11111111-1111-1111-1111-111111111111'}] + params = {'block_device_mapping': bdm} + old_create = compute_api.API.create + + def create(*args, **kwargs): + self.assertEqual(kwargs['block_device_mapping'], bdm) + return old_create(*args, **kwargs) + + self.stubs.Set(compute_api.API, 'create', create) + self.assertRaises(webob.exc.HTTPBadRequest, + self._test_create_extra, params) + def test_create_instance_with_bdm_delete_on_termination(self): self.ext_mgr.extensions = {'os-volumes': 'fake'} bdm = [{'device_name': 'foo1', 'delete_on_termination': 1}, |
