Merge "Add Cinder v3 detach call to _terminate_volume_connections"

This commit is contained in:
Jenkins 2017-05-26 00:36:50 +00:00 committed by Gerrit Code Review
commit 8ccf47cf37
2 changed files with 49 additions and 3 deletions

View File

@ -3983,11 +3983,18 @@ class ComputeManager(manager.Manager):
self.instance_events.clear_events_for_instance(instance)
def _terminate_volume_connections(self, context, instance, bdms):
connector = self.driver.get_volume_connector(instance)
connector = None
for bdm in bdms:
if bdm.is_volume:
self.volume_api.terminate_connection(context, bdm.volume_id,
connector)
if bdm.attachment_id:
self.volume_api.attachment_delete(context,
bdm.attachment_id)
else:
if connector is None:
connector = self.driver.get_volume_connector(instance)
self.volume_api.terminate_connection(context,
bdm.volume_id,
connector)
@staticmethod
def _set_instance_info(instance, instance_type):

View File

@ -3462,6 +3462,45 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
# make sure nothing was logged at exception level
mock_log.assert_not_called()
@mock.patch('nova.volume.cinder.API.attachment_delete')
@mock.patch('nova.volume.cinder.API.terminate_connection')
def test_terminate_volume_connections(self, mock_term_conn,
mock_attach_delete):
"""Tests _terminate_volume_connections with cinder v2 style,
cinder v3.27 style, and non-volume BDMs.
"""
bdms = objects.BlockDeviceMappingList(
objects=[
# We use two old-style BDMs to make sure we only build the
# connector object once.
objects.BlockDeviceMapping(volume_id=uuids.v2_volume_id_1,
destination_type='volume',
attachment_id=None),
objects.BlockDeviceMapping(volume_id=uuids.v2_volume_id_2,
destination_type='volume',
attachment_id=None),
objects.BlockDeviceMapping(volume_id=uuids.v3_volume_id,
destination_type='volume',
attachment_id=uuids.attach_id),
objects.BlockDeviceMapping(volume_id=None,
destination_type='local')
])
fake_connector = mock.sentinel.fake_connector
with mock.patch.object(self.compute.driver, 'get_volume_connector',
return_value=fake_connector) as connector_mock:
self.compute._terminate_volume_connections(
self.context, mock.sentinel.instance, bdms)
# assert we called terminate_connection twice (once per old volume bdm)
mock_term_conn.assert_has_calls([
mock.call(self.context, uuids.v2_volume_id_1, fake_connector),
mock.call(self.context, uuids.v2_volume_id_2, fake_connector)
])
# assert we only build the connector once
connector_mock.assert_called_once_with(mock.sentinel.instance)
# assert we called delete_attachment once for the single new volume bdm
mock_attach_delete.assert_called_once_with(
self.context, uuids.attach_id)
class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
def setUp(self):