def test_detach_volume_fail_disconnect(self, mock_cinder_api_cls, mock_get_connector_prprts, mock_get_volume_connector): volume = mock.MagicMock() volume.volume_id = self.fake_volume_id volume.connection_info = jsonutils.dumps(self.fake_conn_info) mock_cinder_api = mock.MagicMock() mock_cinder_api_cls.return_value = mock_cinder_api mock_connector = mock.MagicMock() mock_get_connector_prprts.return_value = self.fake_conn_prprts mock_get_volume_connector.return_value = mock_connector mock_connector.disconnect_volume.side_effect = \ os_brick_exception.BrickException() cinder = cinder_workflow.CinderWorkflow(self.context) self.assertRaises(os_brick_exception.BrickException, cinder.detach_volume, volume) mock_cinder_api.begin_detaching.assert_called_once_with( self.fake_volume_id) mock_connector.disconnect_volume.assert_called_once_with( self.fake_conn_info['data'], None) mock_cinder_api.terminate_connection.assert_not_called() mock_cinder_api.detach.assert_not_called() mock_cinder_api.roll_detaching.assert_called_once_with( self.fake_volume_id)
def test_detach_volume(self, mock_cinder_api_cls, mock_get_connector_prprts, mock_get_volume_connector, mock_connection_keep): volume = mock.MagicMock() volume.cinder_volume_id = self.fake_volume_id volume.connection_info = jsonutils.dumps(self.fake_conn_info) mock_cinder_api = mock.MagicMock() mock_cinder_api_cls.return_value = mock_cinder_api mock_connector = mock.MagicMock() mock_get_connector_prprts.return_value = self.fake_conn_prprts mock_get_volume_connector.return_value = mock_connector mock_connection_keep.return_value = False cinder = cinder_workflow.CinderWorkflow(self.context) cinder.detach_volume(self.context, volume) mock_cinder_api.begin_detaching.assert_called_once_with( self.fake_volume_id) mock_connector.disconnect_volume.assert_called_once_with( self.fake_conn_info['data'], None) mock_cinder_api.terminate_connection.assert_called_once_with( self.fake_volume_id, self.fake_conn_prprts) mock_cinder_api.detach.assert_called_once_with(volume) mock_cinder_api.roll_detaching.assert_not_called()
def attach(self, context, volmap): cinder = cinder_workflow.CinderWorkflow(context) if volmap.connection_info: # this is a re-attach of the volume connection_info = jsonutils.loads(volmap.connection_info) device_info = cinder._connect_volume(connection_info) connection_info['data']['device_path'] = device_info['path'] try: volmap.connection_info = jsonutils.dumps(connection_info) except TypeError: pass volmap.save(context) devpath = connection_info['data']['device_path'] else: # this is the first time to attach the volume devpath = cinder.attach_volume(volmap) try: self._mount_device(volmap, devpath) except Exception: with excutils.save_and_reraise_exception(): LOG.exception("Failed to mount device") try: cinder.detach_volume(context, volmap) except Exception: LOG.exception("Failed to detach volume")
def attach(self, context, volmap): cinder = cinder_workflow.CinderWorkflow(context) devpath = cinder.attach_volume(volmap) try: self._mount_device(volmap, devpath) except Exception: with excutils.save_and_reraise_exception(): LOG.exception("Failed to mount device") try: cinder.detach_volume(volmap) except Exception: LOG.exception("Failed to detach volume")
def test_delete_volume(self, mock_cinder_api_cls): volume = mock.MagicMock() volume.volume_id = self.fake_volume_id volume.connection_info = jsonutils.dumps(self.fake_conn_info) mock_cinder_api = mock.MagicMock() mock_cinder_api_cls.return_value = mock_cinder_api cinder = cinder_workflow.CinderWorkflow(self.context) cinder.delete_volume(volume) mock_cinder_api.delete_volume.assert_called_once_with( self.fake_volume_id)
def _test_attach_volume(self, mock_cinder_api_cls, mock_get_connector_prprts, mock_get_volume_connector, fail_reserve=False, fail_init=False, fail_connect=False, fail_attach=False): volume = mock.MagicMock() volume.volume_id = self.fake_volume_id volume.container_uuid = '123' mock_cinder_api = mock.MagicMock() mock_cinder_api_cls.return_value = mock_cinder_api mock_connector = mock.MagicMock() mock_get_connector_prprts.return_value = self.fake_conn_prprts mock_get_volume_connector.return_value = mock_connector mock_cinder_api.initialize_connection.return_value = \ self.fake_conn_info mock_connector.connect_volume.return_value = self.fake_device_info cinder = cinder_workflow.CinderWorkflow(self.context) if fail_reserve: mock_cinder_api.reserve_volume.side_effect = \ cinder_exception.ClientException(400) self.assertRaises(cinder_exception.ClientException, cinder.attach_volume, volume) elif fail_init: mock_cinder_api.initialize_connection.side_effect = \ cinder_exception.ClientException(400) self.assertRaises(cinder_exception.ClientException, cinder.attach_volume, volume) elif fail_connect: mock_connector.connect_volume.side_effect = \ os_brick_exception.BrickException() self.assertRaises(os_brick_exception.BrickException, cinder.attach_volume, volume) elif fail_attach: mock_cinder_api.attach.side_effect = \ cinder_exception.ClientException(400) self.assertRaises(cinder_exception.ClientException, cinder.attach_volume, volume) else: device_path = cinder.attach_volume(volume) self.assertEqual('/foo', device_path) return mock_cinder_api, mock_connector
def delete(self, context, volmap): cinder = cinder_workflow.CinderWorkflow(context) cinder.delete_volume(volmap)
def detach(self, context, volmap): self._unmount_device(volmap) cinder = cinder_workflow.CinderWorkflow(context) cinder.detach_volume(context, volmap)
def delete(self, context, volume): self._unmount_device(volume) cinder = cinder_workflow.CinderWorkflow(context) cinder.delete_volume(volume)
def detach(self, volume): self._unmount_device(volume) cinder = cinder_workflow.CinderWorkflow(self.context) cinder.detach_volume(volume)