Catch BDM related InvalidBDM exceptions for server create v2.1
For v2.1 api, we should catch exception explicitly. There are some BDM related InvalidBDM* exceptions missing catch. This patch fix this. Also move the related unittests into block_device_mapping unittests. Change-Id: Id1bef4adc71ffedd52eb9278b5d09954fc1b1193
This commit is contained in:
parent
e2fd04e281
commit
606d25ffdc
@ -546,7 +546,12 @@ class ServersController(wsgi.Controller):
|
||||
exception.PortRequiresFixedIP,
|
||||
exception.NetworkRequiresSubnet,
|
||||
exception.NetworkNotFound,
|
||||
exception.InvalidBDMVolumeNotBootable) as error:
|
||||
exception.InvalidBDMVolumeNotBootable,
|
||||
exception.InvalidBDMSnapshot,
|
||||
exception.InvalidBDMVolume,
|
||||
exception.InvalidBDMImage,
|
||||
exception.InvalidBDMBootSequence,
|
||||
exception.InvalidBDMLocalsLimit) as error:
|
||||
raise exc.HTTPBadRequest(explanation=error.format_message())
|
||||
except (exception.PortInUse,
|
||||
exception.NetworkAmbiguous,
|
||||
|
@ -26,6 +26,7 @@ from nova.api.openstack.compute import servers as servers_v2
|
||||
from nova import block_device
|
||||
from nova.compute import api as compute_api
|
||||
from nova import exception
|
||||
from nova import objects
|
||||
from nova.openstack.common import jsonutils
|
||||
from nova import test
|
||||
from nova.tests.api.openstack import fakes
|
||||
@ -291,6 +292,39 @@ class BlockDeviceMappingTestV21(test.TestCase):
|
||||
self.assertRaises(exc.HTTPBadRequest, self._test_create, params,
|
||||
no_image=True)
|
||||
|
||||
def test_create_instance_bdm_api_validation_fails(self):
|
||||
self.validation_fail_test_validate_called = False
|
||||
self.validation_fail_instance_destroy_called = False
|
||||
|
||||
bdm_exceptions = ((exception.InvalidBDMSnapshot, {'id': 'fake'}),
|
||||
(exception.InvalidBDMVolume, {'id': 'fake'}),
|
||||
(exception.InvalidBDMImage, {'id': 'fake'}),
|
||||
(exception.InvalidBDMBootSequence, {}),
|
||||
(exception.InvalidBDMLocalsLimit, {}))
|
||||
|
||||
ex_iter = iter(bdm_exceptions)
|
||||
|
||||
def _validate_bdm(*args, **kwargs):
|
||||
self.validation_fail_test_validate_called = True
|
||||
ex, kargs = ex_iter.next()
|
||||
raise ex(**kargs)
|
||||
|
||||
def _instance_destroy(*args, **kwargs):
|
||||
self.validation_fail_instance_destroy_called = True
|
||||
|
||||
self.stubs.Set(compute_api.API, '_validate_bdm', _validate_bdm)
|
||||
self.stubs.Set(objects.Instance, 'destroy', _instance_destroy)
|
||||
|
||||
for _unused in xrange(len(bdm_exceptions)):
|
||||
params = {block_device_mapping.ATTRIBUTE_NAME:
|
||||
[self.bdm[0].copy()]}
|
||||
self.assertRaises(exc.HTTPBadRequest,
|
||||
self._test_create, params)
|
||||
self.assertTrue(self.validation_fail_test_validate_called)
|
||||
self.assertTrue(self.validation_fail_instance_destroy_called)
|
||||
self.validation_fail_test_validate_called = False
|
||||
self.validation_fail_instance_destroy_called = False
|
||||
|
||||
|
||||
class BlockDeviceMappingTestV2(BlockDeviceMappingTestV21):
|
||||
|
||||
|
@ -2779,47 +2779,6 @@ class ServersControllerCreateTest(test.TestCase):
|
||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||
self._test_create_extra, params)
|
||||
|
||||
def test_create_instance_bdm_api_validation_fails(self):
|
||||
self.ext_mgr.extensions = {'os-volumes': 'fake',
|
||||
'os-block-devic-emapping-v2-boot': 'fake'}
|
||||
bdm = {'delete_on_termination': 1,
|
||||
'device_name': 'vda',
|
||||
'source_type': 'volume',
|
||||
'destination_type': 'volume',
|
||||
'volume_size': 1,
|
||||
'boot_index': 0,
|
||||
'uuid': '11111111-1111-1111-1111-111111111111'}
|
||||
self.validation_fail_test_validate_called = False
|
||||
self.validation_fail_instance_destroy_called = False
|
||||
|
||||
bdm_exceptions = ((exception.InvalidBDMSnapshot, {'id': 'fake'}),
|
||||
(exception.InvalidBDMVolume, {'id': 'fake'}),
|
||||
(exception.InvalidBDMImage, {'id': 'fake'}),
|
||||
(exception.InvalidBDMBootSequence, {}),
|
||||
(exception.InvalidBDMLocalsLimit, {}))
|
||||
|
||||
ex_iter = iter(bdm_exceptions)
|
||||
|
||||
def _validate_bdm(*args, **kwargs):
|
||||
self.validation_fail_test_validate_called = True
|
||||
ex, kargs = ex_iter.next()
|
||||
raise ex(**kargs)
|
||||
|
||||
def _instance_destroy(*args, **kwargs):
|
||||
self.validation_fail_instance_destroy_called = True
|
||||
|
||||
self.stubs.Set(compute_api.API, '_validate_bdm', _validate_bdm)
|
||||
self.stubs.Set(objects.Instance, 'destroy', _instance_destroy)
|
||||
|
||||
for _unused in xrange(len(bdm_exceptions)):
|
||||
params = {'block_device_mapping_v2': [bdm.copy()]}
|
||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||
self._test_create_extra, params)
|
||||
self.assertTrue(self.validation_fail_test_validate_called)
|
||||
self.assertTrue(self.validation_fail_instance_destroy_called)
|
||||
self.validation_fail_test_validate_called = False
|
||||
self.validation_fail_instance_destroy_called = False
|
||||
|
||||
def test_create_instance_with_bdm_delete_on_termination(self):
|
||||
self.ext_mgr.extensions = {'os-volumes': 'fake'}
|
||||
bdm = [{'device_name': 'foo1', 'volume_id': 'fake_vol',
|
||||
|
Loading…
Reference in New Issue
Block a user