Allow None for block_device_mapping_v2.boot_index
The legacy v2 API allowed None for the boot_index [1]. It allowed this implicitly because the API code would convert the block_device_mapping_v2 dict from the request into a BlockDeviceMapping object, which has a boot_index field that is nullable (allows None). The API reference documentation [2] also says: "To disable a device from booting, set the boot index to a negative value or use the default boot index value, which is None." It appears that with the move to v2.1 and request schema validation, the boot_index schema was erroneously set to not allow None for a value, which is not backward compatible with the v2 API behavior. This change fixes the schema to allow boot_index=None again and adds a test to show it working. This should not require a microversion bump since it's fixing a regression in the v2.1 API which worked in the v2 API and is already handled throughout Nova's block device code. Closes-Bug: #1662699 [1] https://github.com/openstack/nova/blob/13.0.0/nova/compute/api.py#L1268 [2] http://developer.openstack.org/api-ref/compute/#create-server Change-Id: Ice78a0982bcce491f0c9690903ed2c6b6aaab1be
This commit is contained in:
@@ -197,7 +197,13 @@ class BlockDeviceDict(dict):
|
||||
api_dict[source_type + '_id'] = device_uuid
|
||||
if source_type == 'image' and destination_type == 'local':
|
||||
try:
|
||||
boot_index = int(api_dict.get('boot_index', -1))
|
||||
# NOTE(mriedem): boot_index can be None so we need to
|
||||
# account for that to avoid a TypeError.
|
||||
boot_index = api_dict.get('boot_index', -1)
|
||||
if boot_index is None:
|
||||
# boot_index=None is equivalent to -1.
|
||||
boot_index = -1
|
||||
boot_index = int(boot_index)
|
||||
except ValueError:
|
||||
raise exception.InvalidBDMFormat(
|
||||
details=_("Boot index is invalid."))
|
||||
|
||||
Reference in New Issue
Block a user