summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen'ichi Ohmichi <ken-oomichi@wx.jp.nec.com>2016-12-20 23:20:43 -0800
committerMatt Riedemann <mriedem@us.ibm.com>2016-12-28 10:41:00 -0500
commitd726e0d7008354dcc054b5d8b95b6071c83f8da2 (patch)
tree026b4bc99a973e7cdc512255b3f26c6f374a2fe4
parent752c987789bb600507d388e52ec9ff8c4d144479 (diff)
downloadnova-d726e0d7008354dcc054b5d8b95b6071c83f8da2.tar.gz
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 <zhengzhenyu@huawei.com> 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)
-rw-r--r--nova/api/openstack/compute/schemas/block_device_mapping.py2
-rw-r--r--nova/api/openstack/compute/schemas/block_device_mapping_v1.py2
-rw-r--r--nova/tests/unit/api/openstack/compute/test_block_device_mapping.py20
-rw-r--r--nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py12
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 6c32199180..b991142bb3 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 5528e3d137..91ca3a2ec9 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 c342236f05..8471a53479 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 d851e8b5b5..d771d92009 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',