Beispiel #1
0
    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)
Beispiel #2
0
    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()
Beispiel #3
0
    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")
Beispiel #4
0
 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")
Beispiel #5
0
    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)
Beispiel #6
0
    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
Beispiel #7
0
 def delete(self, context, volmap):
     cinder = cinder_workflow.CinderWorkflow(context)
     cinder.delete_volume(volmap)
Beispiel #8
0
 def detach(self, context, volmap):
     self._unmount_device(volmap)
     cinder = cinder_workflow.CinderWorkflow(context)
     cinder.detach_volume(context, volmap)
Beispiel #9
0
 def delete(self, context, volume):
     self._unmount_device(volume)
     cinder = cinder_workflow.CinderWorkflow(context)
     cinder.delete_volume(volume)
Beispiel #10
0
 def detach(self, volume):
     self._unmount_device(volume)
     cinder = cinder_workflow.CinderWorkflow(self.context)
     cinder.detach_volume(volume)