From d726e0d7008354dcc054b5d8b95b6071c83f8da2 Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Tue, 20 Dec 2016 23:20:43 -0800 Subject: [PATCH] Fix BDM JSON-Schema validation Current BDM JSON-Schema validation doesn't work for invalid device parameter in 2nd dict, because JSON-Schema definition is wrong. This patch fixes it. Co-Authored-By: Zhenyu Zheng Conflicts: nova/api/openstack/compute/schemas/block_device_mapping.py nova/tests/unit/api/openstack/compute/test_block_device_mapping.py NOTE(mriedem): The conflicts were due to some additional validation and tests added for BDMs v2.1 in Newton which are not in Mitaka. Change-Id: I56348dc2b7abd9526dfbf21305755505765811c5 Closes-Bug: #1651064 (cherry picked from commit a65551ecd09b3116a13d9b6cc833be0c05b716da) (cherry picked from commit c00d433d2951386648260f005c5cb0ffd159dca4) --- .../compute/schemas/block_device_mapping.py | 2 +- .../schemas/block_device_mapping_v1.py | 2 +- .../compute/test_block_device_mapping.py | 20 +++++++++++++++++++ .../compute/test_block_device_mapping_v1.py | 12 ++++++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/nova/api/openstack/compute/schemas/block_device_mapping.py b/nova/api/openstack/compute/schemas/block_device_mapping.py index 6c32199180c0..b991142bb323 100644 --- a/nova/api/openstack/compute/schemas/block_device_mapping.py +++ b/nova/api/openstack/compute/schemas/block_device_mapping.py @@ -68,6 +68,6 @@ block_device_mapping['properties'].update(block_device_mapping_new_item) server_create = { 'block_device_mapping_v2': { 'type': 'array', - 'items': [block_device_mapping] + 'items': block_device_mapping } } diff --git a/nova/api/openstack/compute/schemas/block_device_mapping_v1.py b/nova/api/openstack/compute/schemas/block_device_mapping_v1.py index 5528e3d1375d..91ca3a2ec9e0 100644 --- a/nova/api/openstack/compute/schemas/block_device_mapping_v1.py +++ b/nova/api/openstack/compute/schemas/block_device_mapping_v1.py @@ -44,6 +44,6 @@ legacy_block_device_mapping = { server_create = { 'block_device_mapping': { 'type': 'array', - 'items': [legacy_block_device_mapping] + 'items': legacy_block_device_mapping } } diff --git a/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py b/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py index c342236f0506..8471a534794f 100644 --- a/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py +++ b/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py @@ -150,6 +150,21 @@ class BlockDeviceMappingTestV21(test.TestCase): params = {block_device_mapping.ATTRIBUTE_NAME: self.bdm} self._test_create(params, no_image=True) + def test_create_instance_with_invalid_bdm_in_2nd_dict(self): + bdm_1st = {"source_type": "image", "delete_on_termination": True, + "boot_index": 0, + "uuid": "2ff3a1d3-ed70-4c3f-94ac-941461153bc0", + "destination_type": "local"} + bdm_2nd = {"source_type": "volume", + "uuid": "99d92140-3d0c-4ea5-a49c-f94c38c607f0", + "destination_type": "invalid"} + bdm = [bdm_1st, bdm_2nd] + + params = {block_device_mapping.ATTRIBUTE_NAME: bdm, + 'imageRef': '2ff3a1d3-ed70-4c3f-94ac-941461153bc0'} + self.assertRaises(exception.ValidationError, + self._test_create, params) + def test_create_instance_with_device_name_not_string(self): self.bdm[0]['device_name'] = 123 old_create = compute_api.API.create @@ -385,3 +400,8 @@ class BlockDeviceMappingTestV2(BlockDeviceMappingTestV21): # Add a check whether the destination type is invalid # in V2.1 API only. So this test is skipped in V2.0 API pass + + def test_create_instance_with_invalid_bdm_in_2nd_dict(self): + # Add a check whether the destination type is invalid + # in V2.1 API only. So this test is skipped in V2.0 API + pass diff --git a/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py b/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py index d851e8b5b56d..d771d92009b8 100644 --- a/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py +++ b/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py @@ -277,7 +277,7 @@ class BlockDeviceMappingTestV21(test.TestCase): {'device_name': 'foo2', 'volume_id': fakes.FAKE_UUID, 'delete_on_termination': True}, {'device_name': 'foo3', 'volume_id': fakes.FAKE_UUID, - 'delete_on_termination': 'invalid'}, + 'delete_on_termination': 'False'}, {'device_name': 'foo4', 'volume_id': fakes.FAKE_UUID, 'delete_on_termination': False}, {'device_name': 'foo5', 'volume_id': fakes.FAKE_UUID, @@ -307,6 +307,16 @@ class BlockDeviceMappingTestV21(test.TestCase): self.stubs.Set(compute_api.API, '_validate_bdm', _validate_bdm) self._test_create(params) + def test_create_instance_with_bdm_delete_on_termination_invalid_2nd(self): + bdm = [{'device_name': 'foo1', 'volume_id': fakes.FAKE_UUID, + 'delete_on_termination': 'True'}, + {'device_name': 'foo2', 'volume_id': fakes.FAKE_UUID, + 'delete_on_termination': 'invalid'}] + + params = {'block_device_mapping': bdm} + self.assertRaises(self.validation_error, + self._test_create, params) + def test_create_instance_decide_format_legacy(self): ext_info = extension_info.LoadedExtensionInfo() CONF.set_override('extensions_blacklist',