Browse Source

Move brick calls from cinder.utils to volume_utils

Move code that calls out to os-brick for connectors,
encryptors, etc., into volume_utils.

This leaves cinder/utils.py more general-purpose
cinder-wide code, which reduces unnecessary binding
between things like "cinder-manage db" and calls
that load much more of cinder's code (and external
libraries like os-brick).

This also means that some drivers only need to
import volume_utils and not cinder.utils.

Partial-Bug: #1912278
Change-Id: Ib2e2960ca354a47d303e0633c7d84e6da4b55b82
changes/90/771290/6
Eric Harney 7 months ago
parent
commit
e7b4670516
  1. 6
      cinder/backup/manager.py
  2. 26
      cinder/tests/unit/backup/test_backup.py
  3. 12
      cinder/tests/unit/test_utils.py
  4. 2
      cinder/tests/unit/volume/drivers/dell_emc/unity/test_adapter.py
  5. 2
      cinder/tests/unit/volume/drivers/ibm/test_ibm_flashsystem.py
  6. 24
      cinder/tests/unit/volume/drivers/test_infinidat.py
  7. 9
      cinder/tests/unit/volume/drivers/test_kaminario.py
  8. 17
      cinder/tests/unit/volume/drivers/test_macrosan_drivers.py
  9. 21
      cinder/tests/unit/volume/test_driver.py
  10. 8
      cinder/tests/unit/volume/test_image.py
  11. 2
      cinder/tests/unit/volume/test_volume.py
  12. 2
      cinder/tests/unit/volume/test_volume_manager.py
  13. 70
      cinder/utils.py
  14. 22
      cinder/volume/driver.py
  15. 3
      cinder/volume/drivers/datera/datera_api21.py
  16. 3
      cinder/volume/drivers/datera/datera_api22.py
  17. 2
      cinder/volume/drivers/dell_emc/unity/adapter.py
  18. 3
      cinder/volume/drivers/hitachi/hbsd_common.py
  19. 24
      cinder/volume/drivers/ibm/flashsystem_common.py
  20. 8
      cinder/volume/drivers/infinidat.py
  21. 4
      cinder/volume/drivers/kaminario/kaminario_common.py
  22. 2
      cinder/volume/flows/manager/create_volume.py
  23. 17
      cinder/volume/manager.py
  24. 68
      cinder/volume/volume_utils.py

6
cinder/backup/manager.py

@ -455,7 +455,7 @@ class BackupManager(manager.SchedulerDependentManager):
backup_service = self.service(context)
properties = utils.brick_get_connector_properties()
properties = volume_utils.brick_get_connector_properties()
# NOTE(geguileo): Not all I/O disk operations properly do greenthread
# context switching and may end up blocking the greenthread, so we go
@ -631,7 +631,7 @@ class BackupManager(manager.SchedulerDependentManager):
orig_key_id = volume.encryption_key_id
backup_service = self.service(context)
properties = utils.brick_get_connector_properties()
properties = volume_utils.brick_get_connector_properties()
secure_enabled = (
self.volume_rpcapi.secure_file_operations_enabled(context,
volume))
@ -1046,7 +1046,7 @@ class BackupManager(manager.SchedulerDependentManager):
use_multipath = CONF.use_multipath_for_image_xfer
device_scan_attempts = CONF.num_volume_device_scan_tries
protocol = conn['driver_volume_type']
connector = utils.brick_get_connector(
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=device_scan_attempts,

26
cinder/tests/unit/backup/test_backup.py

@ -685,7 +685,7 @@ class BackupTestCase(BaseBackupTest):
self.assertEqual(fields.BackupStatus.ERROR, backup.status)
self.assertTrue(mock_run_backup.called)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open', wraps=open)
@ -735,7 +735,7 @@ class BackupTestCase(BaseBackupTest):
self.assertEqual(vol_size, backup['size'])
self.assertIsNone(backup.encryption_key_id)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open')
@ -771,7 +771,7 @@ class BackupTestCase(BaseBackupTest):
self.assertEqual(vol_size, backup.size)
self.assertIsNone(backup.parent_id)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open')
@ -806,7 +806,7 @@ class BackupTestCase(BaseBackupTest):
self.assertEqual(vol_size, backup.size)
self.assertEqual(parent_backup.id, backup.parent_id)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open')
@ -843,7 +843,7 @@ class BackupTestCase(BaseBackupTest):
backup = db.backup_get(self.ctxt, backup.id)
self.assertEqual(fields.BackupStatus.ERROR, backup.status)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open')
@ -901,7 +901,7 @@ class BackupTestCase(BaseBackupTest):
self.assertRaises(exception.InvalidSnapshot,
self.backup_mgr.create_backup, self.ctxt, backup)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open')
@ -1026,7 +1026,7 @@ class BackupTestCase(BaseBackupTest):
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.volume.volume_utils.clone_encryption_key')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
def test_create_backup_encrypted_volume(self,
mock_connector_properties,
mock_clone_encryption_key,
@ -1054,7 +1054,7 @@ class BackupTestCase(BaseBackupTest):
@mock.patch('cinder.volume.rpcapi.VolumeAPI.get_backup_device')
@mock.patch('cinder.volume.volume_utils.clone_encryption_key')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
def test_create_backup_encrypted_volume_again(self,
mock_connector_properties,
mock_clone_encryption_key,
@ -1217,7 +1217,7 @@ class BackupTestCase(BaseBackupTest):
backup = db.backup_get(self.ctxt, backup.id)
self.assertEqual(fields.BackupStatus.AVAILABLE, backup['status'])
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open', wraps=open)
@mock.patch.object(os.path, 'isdir', return_value=False)
@ -1267,7 +1267,7 @@ class BackupTestCase(BaseBackupTest):
self.assertNotEqual(backup.id, vol.metadata.get('src_backup_id'))
self.assertEqual(fields.BackupStatus.AVAILABLE, backup['status'])
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.utils.temporary_chown')
@mock.patch('builtins.open', wraps=open)
@mock.patch.object(os.path, 'isdir', return_value=False)
@ -1355,7 +1355,7 @@ class BackupTestCase(BaseBackupTest):
@mock.patch('cinder.volume.volume_utils.delete_encryption_key')
@mock.patch(
'cinder.tests.unit.backup.fake_service.FakeBackupService.restore')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
def test_restore_backup_encrypted_volume(self,
mock_connector_properties,
mock_backup_driver_restore,
@ -1388,7 +1388,7 @@ class BackupTestCase(BaseBackupTest):
@mock.patch('cinder.volume.volume_utils.delete_encryption_key')
@mock.patch(
'cinder.tests.unit.backup.fake_service.FakeBackupService.restore')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
def test_restore_backup_new_encrypted_volume(self,
mock_connector_properties,
mock_backup_driver_restore,
@ -1449,7 +1449,7 @@ class BackupTestCase(BaseBackupTest):
@mock.patch('cinder.volume.volume_utils.delete_encryption_key')
@mock.patch(
'cinder.tests.unit.backup.fake_service.FakeBackupService.restore')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
def test_restore_backup_glean_key_id(self,
mock_connector_properties,
mock_backup_driver_restore,

12
cinder/tests/unit/test_utils.py

@ -723,13 +723,13 @@ class AuditPeriodTest(test.TestCase):
class BrickUtils(test.TestCase):
"""Unit test to test the brick utility wrapper functions."""
@mock.patch('cinder.utils.CONF')
@mock.patch('cinder.volume.volume_utils.CONF')
@mock.patch('os_brick.initiator.connector.get_connector_properties')
@mock.patch('cinder.utils.get_root_helper')
def test_brick_get_connector_properties(self, mock_helper, mock_get,
mock_conf):
mock_conf.my_ip = '1.2.3.4'
output = utils.brick_get_connector_properties()
output = volume_utils.brick_get_connector_properties()
mock_helper.assert_called_once_with()
mock_get.assert_called_once_with(mock_helper.return_value, '1.2.3.4',
False, False)
@ -738,7 +738,7 @@ class BrickUtils(test.TestCase):
@mock.patch('os_brick.initiator.connector.InitiatorConnector.factory')
@mock.patch('cinder.utils.get_root_helper')
def test_brick_get_connector(self, mock_helper, mock_factory):
output = utils.brick_get_connector('protocol')
output = volume_utils.brick_get_connector('protocol')
mock_helper.assert_called_once_with()
self.assertEqual(mock_factory.return_value, output)
mock_factory.assert_called_once_with(
@ -756,7 +756,9 @@ class BrickUtils(test.TestCase):
ctxt = mock.Mock(name='context')
mock_encryptor = mock.Mock()
mock_get_encryptor.return_value = mock_encryptor
utils.brick_attach_volume_encryptor(ctxt, attach_info, encryption)
volume_utils.brick_attach_volume_encryptor(ctxt,
attach_info,
encryption)
connection_info = attach_info['conn']
connection_info['data']['device_path'] = attach_info['device']['path']
@ -779,7 +781,7 @@ class BrickUtils(test.TestCase):
encryption = {'encryption_key_id': fake.ENCRYPTION_KEY_ID}
mock_encryptor = mock.Mock()
mock_get_encryptor.return_value = mock_encryptor
utils.brick_detach_volume_encryptor(attach_info, encryption)
volume_utils.brick_detach_volume_encryptor(attach_info, encryption)
mock_helper.assert_called_once_with()
connection_info = attach_info['conn']

2
cinder/tests/unit/volume/drivers/dell_emc/unity/test_adapter.py

@ -470,7 +470,7 @@ def patch_for_unity_adapter(func):
@mock.patch('cinder.volume.drivers.dell_emc.unity.utils.'
'group_is_cg',
new=group_is_cg)
@mock.patch('cinder.utils.brick_get_connector_properties',
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties',
new=get_connector_properties)
def func_wrapper(*args, **kwargs):
return func(*args, **kwargs)

2
cinder/tests/unit/volume/drivers/ibm/test_ibm_flashsystem.py

@ -1107,7 +1107,7 @@ class FlashSystemDriverTestCase(test.TestCase):
@mock.patch.object(volume_utils, 'copy_volume')
@mock.patch.object(flashsystem_fc.FlashSystemFCDriver, '_scan_device')
@mock.patch.object(flashsystem_fc.FlashSystemFCDriver, '_remove_device')
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
def test_flashsystem_copy_vdisk_data(self,
_connector,
_remove_device,

24
cinder/tests/unit/volume/drivers/test_infinidat.py

@ -352,8 +352,8 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
self.driver.create_snapshot, test_snapshot)
@mock.patch("cinder.volume.volume_utils.copy_volume")
@mock.patch("cinder.utils.brick_get_connector")
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector")
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch("cinder.volume.volume_types.get_volume_type_qos_specs")
def test_create_volume_from_snapshot(self, *mocks):
@ -371,7 +371,7 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
self.driver.create_volume_from_snapshot,
test_clone, test_snapshot)
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch("cinder.volume.volume_types.get_volume_type_qos_specs")
def test_create_volume_from_snapshot_map_fails(self, *mocks):
@ -381,8 +381,8 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
test_clone, test_snapshot)
@mock.patch("cinder.volume.volume_utils.copy_volume")
@mock.patch("cinder.utils.brick_get_connector")
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector")
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
def test_create_volume_from_snapshot_delete_clone_fails(self, *mocks):
self._mock_volume.delete.side_effect = self._raise_infinisdk
@ -404,8 +404,8 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
self.driver.delete_snapshot, test_snapshot)
@mock.patch("cinder.volume.volume_utils.copy_volume")
@mock.patch("cinder.utils.brick_get_connector")
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector")
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch("cinder.volume.volume_types.get_volume_type_qos_specs")
def test_create_cloned_volume(self, *mocks):
@ -425,7 +425,7 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
self.driver.create_cloned_volume,
test_clone, test_volume)
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch("cinder.volume.volume_types.get_volume_type_qos_specs")
def test_create_cloned_volume_map_fails(self, *mocks):
@ -494,8 +494,8 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
[test_volume], [test_volume])
@mock.patch("cinder.volume.volume_utils.copy_volume")
@mock.patch("cinder.utils.brick_get_connector")
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector")
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch('cinder.volume.volume_utils.is_group_a_cg_snapshot_type',
return_value=True)
@ -506,8 +506,8 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
None, None)
@mock.patch("cinder.volume.volume_utils.copy_volume")
@mock.patch("cinder.utils.brick_get_connector")
@mock.patch("cinder.utils.brick_get_connector_properties",
@mock.patch("cinder.volume.volume_utils.brick_get_connector")
@mock.patch("cinder.volume.volume_utils.brick_get_connector_properties",
return_value=test_connector)
@mock.patch('cinder.volume.volume_utils.is_group_a_cg_snapshot_type',
return_value=True)

9
cinder/tests/unit/volume/drivers/test_kaminario.py

@ -28,7 +28,6 @@ from cinder.objects import fields
from cinder.tests.unit import fake_snapshot
from cinder.tests.unit import fake_volume
from cinder.tests.unit import test
from cinder import utils
from cinder.volume import configuration
from cinder.volume.drivers.kaminario import kaminario_common
from cinder.volume.drivers.kaminario import kaminario_fc
@ -207,7 +206,7 @@ class TestKaminarioCommon(test.TestCase):
self.assertRaises(kaminario_common.KaminarioCinderDriverException,
self.driver.delete_snapshot, self.snap)
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'copy_volume')
def test_create_volume_from_snapshot(self, mock_copy_volume,
mock_brick_get):
@ -218,7 +217,7 @@ class TestKaminarioCommon(test.TestCase):
result = self.driver.create_volume_from_snapshot(self.vol, self.snap)
self.assertIsNone(result)
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'copy_volume')
def test_create_volume_from_snapshot_with_exception(self, mock_copy_volume,
mock_brick_get):
@ -230,7 +229,7 @@ class TestKaminarioCommon(test.TestCase):
self.driver.create_volume_from_snapshot, self.vol,
self.snap)
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'copy_volume')
def test_create_cloned_volume(self, mock_copy_volume, mock_brick_get):
"""Test create_cloned_volume."""
@ -240,7 +239,7 @@ class TestKaminarioCommon(test.TestCase):
result = self.driver.create_cloned_volume(self.vol, self.vol)
self.assertIsNone(result)
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'copy_volume')
def test_create_cloned_volume_with_exception(self, mock_copy_volume,
mock_brick_get):

17
cinder/tests/unit/volume/drivers/test_macrosan_drivers.py

@ -21,7 +21,6 @@ from six.moves import UserDict
from cinder import exception
from cinder.tests.unit import test
from cinder import utils
from cinder.volume import configuration as conf
from cinder.volume.drivers.macrosan import devop_client
from cinder.volume.drivers.macrosan import driver
@ -458,7 +457,7 @@ class MacroSANISCSIDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -478,7 +477,7 @@ class MacroSANISCSIDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -565,7 +564,7 @@ class MacroSANISCSIDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -586,7 +585,7 @@ class MacroSANISCSIDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -697,7 +696,7 @@ class MacroSANFCDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -718,7 +717,7 @@ class MacroSANFCDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -739,7 +738,7 @@ class MacroSANFCDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)
@ -761,7 +760,7 @@ class MacroSANFCDriverTestCase(test.TestCase):
@mock.patch.object(qos_specs, 'get_qos_specs',
return_value={'specs': {'qos-strategy': 'QoS-1'}})
@mock.patch.object(socket, 'gethostname', return_value='controller')
@mock.patch.object(utils, 'brick_get_connector',
@mock.patch.object(volume_utils, 'brick_get_connector',
return_value=DummyBrickGetConnector())
@mock.patch.object(volume_utils, 'copy_volume', return_value=None)
@mock.patch.object(os.path, 'realpath', return_value=None)

21
cinder/tests/unit/volume/test_driver.py

@ -37,7 +37,6 @@ from cinder.tests.unit import fake_volume
from cinder.tests.unit.image import fake as fake_image
from cinder.tests.unit import test
from cinder.tests.unit import utils as tests_utils
from cinder import utils
import cinder.volume
from cinder.volume import configuration as conf
from cinder.volume import driver
@ -272,7 +271,7 @@ class GenericVolumeDriverTestCase(BaseDriverTestCase):
self.assertEqual('fakezone', temp_vol.availability_zone)
self.assertEqual('fakecluster', temp_vol.cluster_name)
@mock.patch.object(utils, 'brick_get_connector_properties')
@mock.patch.object(volume_utils, 'brick_get_connector_properties')
@mock.patch.object(cinder.volume.manager.VolumeManager, '_attach_volume')
@mock.patch.object(cinder.volume.manager.VolumeManager, '_detach_volume')
@mock.patch.object(volume_utils, 'copy_volume')
@ -392,8 +391,10 @@ class GenericVolumeDriverTestCase(BaseDriverTestCase):
@mock.patch.object(image_utils, 'fetch_to_raw')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_attach_volume')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_detach_volume')
@mock.patch.object(cinder.utils, 'brick_attach_volume_encryptor')
@mock.patch.object(cinder.utils, 'brick_detach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_attach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_detach_volume_encryptor')
def test_copy_image_to_encrypted_volume(self,
mock_detach_encryptor,
mock_attach_encryptor,
@ -438,8 +439,10 @@ class GenericVolumeDriverTestCase(BaseDriverTestCase):
@mock.patch.object(image_utils, 'fetch_to_raw')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_attach_volume')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_detach_volume')
@mock.patch.object(cinder.utils, 'brick_attach_volume_encryptor')
@mock.patch.object(cinder.utils, 'brick_detach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_attach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_detach_volume_encryptor')
def test_copy_image_to_encrypted_volume_failed_attach_encryptor(
self,
mock_detach_encryptor,
@ -486,8 +489,10 @@ class GenericVolumeDriverTestCase(BaseDriverTestCase):
@mock.patch.object(image_utils, 'fetch_to_raw')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_attach_volume')
@mock.patch.object(cinder.volume.driver.VolumeDriver, '_detach_volume')
@mock.patch.object(cinder.utils, 'brick_attach_volume_encryptor')
@mock.patch.object(cinder.utils, 'brick_detach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_attach_volume_encryptor')
@mock.patch.object(cinder.volume.volume_utils,
'brick_detach_volume_encryptor')
@ddt.data(exception.ImageUnacceptable(
reason='fake', image_id=fake.IMAGE_ID),
exception.ImageTooBig(

8
cinder/tests/unit/volume/test_image.py

@ -629,8 +629,8 @@ class ImageVolumeTestCases(base.BaseVolumeTestCase):
self.assertRaises(exception.ImageTooBig,
self._create_volume_from_image)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.utils.brick_get_connector')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector')
@mock.patch('cinder.volume.driver.BaseVD.secure_file_operations_enabled')
@mock.patch('cinder.volume.driver.BaseVD._detach_volume')
@mock.patch('cinder.image.image_utils.qemu_img_info')
@ -656,8 +656,8 @@ class ImageVolumeTestCases(base.BaseVolumeTestCase):
# We must have called detach method.
self.assertEqual(1, mock_detach.call_count)
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.utils.brick_get_connector')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector')
@mock.patch('cinder.volume.driver.BaseVD._connect_device')
@mock.patch('cinder.volume.driver.BaseVD._detach_volume')
@mock.patch('cinder.image.image_utils.qemu_img_info')

2
cinder/tests/unit/volume/test_volume.py

@ -1685,7 +1685,7 @@ class VolumeTestCase(base.BaseVolumeTestCase):
@mock.patch('cinder.image.image_utils.qemu_img_info')
@mock.patch('cinder.volume.driver.VolumeDriver._detach_volume')
@mock.patch('cinder.volume.driver.VolumeDriver._attach_volume')
@mock.patch('cinder.utils.brick_get_connector_properties')
@mock.patch('cinder.volume.volume_utils.brick_get_connector_properties')
@mock.patch('cinder.utils.execute')
def test_create_volume_from_volume_with_enc(
self, mock_execute, mock_brick_gcp, mock_at, mock_det,

2
cinder/tests/unit/volume/test_volume_manager.py

@ -213,7 +213,7 @@ class VolumeManagerTestCase(base.BaseVolumeTestCase):
ctxt, None, vol, mock.sentinel.properties, force=True,
remote=mock.sentinel.remote)
@mock.patch('cinder.utils.brick_attach_volume_encryptor')
@mock.patch('cinder.volume.volume_utils.brick_attach_volume_encryptor')
@mock.patch('cinder.volume.volume_types.is_encrypted')
@mock.patch('cinder.volume.rpcapi.VolumeAPI')
def test_attach_volume_fail_decrypt(self, mock_api, mock_is_encrypted,

70
cinder/utils.py

@ -37,11 +37,8 @@ import tempfile
import time
import types
from castellan import key_manager
import eventlet
from eventlet import tpool
from os_brick import encryptors
from os_brick.initiator import connector
from oslo_concurrency import lockutils
from oslo_concurrency import processutils
from oslo_config import cfg
@ -420,73 +417,6 @@ def get_root_helper():
return 'sudo cinder-rootwrap %s' % CONF.rootwrap_config
def brick_get_connector_properties(multipath=False, enforce_multipath=False):
"""Wrapper to automatically set root_helper in brick calls.
:param multipath: A boolean indicating whether the connector can
support multipath.
:param enforce_multipath: If True, it raises exception when multipath=True
is specified but multipathd is not running.
If False, it falls back to multipath=False
when multipathd is not running.
"""
root_helper = get_root_helper()
return connector.get_connector_properties(root_helper,
CONF.my_ip,
multipath,
enforce_multipath)
def brick_get_connector(protocol, driver=None,
use_multipath=False,
device_scan_attempts=3,
*args, **kwargs):
"""Wrapper to get a brick connector object.
This automatically populates the required protocol as well
as the root_helper needed to execute commands.
"""
root_helper = get_root_helper()
return connector.InitiatorConnector.factory(protocol, root_helper,
driver=driver,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
*args, **kwargs)
def brick_get_encryptor(connection_info, *args, **kwargs):
"""Wrapper to get a brick encryptor object."""
root_helper = get_root_helper()
km = key_manager.API(CONF)
return encryptors.get_volume_encryptor(root_helper=root_helper,
connection_info=connection_info,
keymgr=km,
*args, **kwargs)
def brick_attach_volume_encryptor(context, attach_info, encryption):
"""Attach encryption layer."""
connection_info = attach_info['conn']
connection_info['data']['device_path'] = attach_info['device']['path']
encryptor = brick_get_encryptor(connection_info,
**encryption)
encryptor.attach_volume(context, **encryption)
def brick_detach_volume_encryptor(attach_info, encryption):
"""Detach encryption layer."""
connection_info = attach_info['conn']
connection_info['data']['device_path'] = attach_info['device']['path']
encryptor = brick_get_encryptor(connection_info,
**encryption)
encryptor.detach_volume(**encryption)
def require_driver_initialized(driver):
"""Verifies if `driver` is initialized

22
cinder/volume/driver.py

@ -870,16 +870,17 @@ class BaseVD(object, metaclass=abc.ABCMeta):
use_multipath = self.configuration.use_multipath_for_image_xfer
enforce_multipath = self.configuration.enforce_multipath_for_image_xfer
properties = utils.brick_get_connector_properties(use_multipath,
enforce_multipath)
properties = volume_utils.brick_get_connector_properties(
use_multipath,
enforce_multipath)
attach_info, volume = self._attach_volume(context, volume, properties)
try:
if encrypted:
encryption = self.db.volume_encryption_metadata_get(context,
volume.id)
utils.brick_attach_volume_encryptor(context,
attach_info,
encryption)
volume_utils.brick_attach_volume_encryptor(context,
attach_info,
encryption)
try:
image_utils.fetch_to_raw(
context,
@ -897,8 +898,8 @@ class BaseVD(object, metaclass=abc.ABCMeta):
finally:
if encrypted:
utils.brick_detach_volume_encryptor(attach_info,
encryption)
volume_utils.brick_detach_volume_encryptor(attach_info,
encryption)
finally:
self._detach_volume(context, attach_info, volume, properties,
force=True)
@ -909,8 +910,9 @@ class BaseVD(object, metaclass=abc.ABCMeta):
use_multipath = self.configuration.use_multipath_for_image_xfer
enforce_multipath = self.configuration.enforce_multipath_for_image_xfer
properties = utils.brick_get_connector_properties(use_multipath,
enforce_multipath)
properties = volume_utils.brick_get_connector_properties(
use_multipath,
enforce_multipath)
attach_info, volume = self._attach_volume(context, volume, properties)
try:
@ -1125,7 +1127,7 @@ class BaseVD(object, metaclass=abc.ABCMeta):
use_multipath = self.configuration.use_multipath_for_image_xfer
device_scan_attempts = self.configuration.num_volume_device_scan_tries
protocol = conn['driver_volume_type']
connector = utils.brick_get_connector(
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=device_scan_attempts,

3
cinder/volume/drivers/datera/datera_api21.py

@ -31,7 +31,6 @@ import six
from cinder import exception
from cinder.i18n import _
from cinder.image import image_utils
from cinder import utils
import cinder.volume.drivers.datera.datera_common as datc
from cinder.volume import volume_types
from cinder.volume import volume_utils as volutils
@ -885,7 +884,7 @@ class DateraApi(object):
# export (ACL, IP-Pools, etc)
conn = self._initialize_connection_2_1(
vol, {'multipath': False})
connector = utils.brick_get_connector(
connector = volutils.brick_get_connector(
conn['driver_volume_type'],
use_multipath=False,
device_scan_attempts=10,

3
cinder/volume/drivers/datera/datera_api22.py

@ -31,7 +31,6 @@ import six
from cinder import exception
from cinder.i18n import _
from cinder.image import image_utils
from cinder import utils
import cinder.volume.drivers.datera.datera_common as datc
from cinder.volume import volume_types
from cinder.volume import volume_utils as volutils
@ -935,7 +934,7 @@ class DateraApi(object):
# export (ACL, IP-Pools, etc)
conn = self._initialize_connection_2_2(
vol, {'multipath': False})
connector = utils.brick_get_connector(
connector = volutils.brick_get_connector(
conn['driver_volume_type'],
use_multipath=False,
device_scan_attempts=10,

2
cinder/volume/drivers/dell_emc/unity/adapter.py

@ -813,7 +813,7 @@ class CommonAdapter(object):
is_compressed=vol_params.is_compressed)
src_id = src_snap.get_id()
try:
conn_props = cinder_utils.brick_get_connector_properties()
conn_props = volume_utils.brick_get_connector_properties()
with self._connect_resource(dest_lun, conn_props,
vol_params.volume_id) as dest_info, \

3
cinder/volume/drivers/hitachi/hbsd_common.py

@ -22,7 +22,6 @@ from oslo_utils import excutils
from cinder import coordination
from cinder import exception
from cinder import utils as cinder_utils
from cinder.volume import configuration
from cinder.volume.drivers.hitachi import hbsd_utils as utils
from cinder.volume import volume_utils
@ -582,7 +581,7 @@ class HBSDCommon():
"""Initialize server-storage connection."""
targets = kwargs.pop(
'targets', {'info': {}, 'list': [], 'iqns': {}, 'target_map': {}})
connector = cinder_utils.brick_get_connector_properties(
connector = volume_utils.brick_get_connector_properties(
multipath=self.conf.use_multipath_for_image_xfer,
enforce_multipath=self.conf.enforce_multipath_for_image_xfer)
target_ports = self.storage_info['controller_ports']

24
cinder/volume/drivers/ibm/flashsystem_common.py

@ -219,7 +219,7 @@ class FlashSystemDriver(san.SanDriver,
LOG.debug('enter: _copy_vdisk_data: %(src)s -> %(dest)s.',
{'src': src_vdisk_name, 'dest': dest_vdisk_name})
connector = utils.brick_get_connector_properties()
connector = volume_utils.brick_get_connector_properties()
(src_map, src_lun_id) = self._is_vdisk_map(
src_vdisk_name, connector)
(dest_map, dest_lun_id) = self._is_vdisk_map(
@ -852,11 +852,12 @@ class FlashSystemDriver(san.SanDriver,
use_multipath = self.configuration.use_multipath_for_image_xfer
device_scan_attempts = self.configuration.num_volume_device_scan_tries
protocol = properties['driver_volume_type']
connector = utils.brick_get_connector(protocol,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
conn=properties)
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
conn=properties)
connector.disconnect_volume(properties['data'], device)
@ -888,11 +889,12 @@ class FlashSystemDriver(san.SanDriver,
use_multipath = self.configuration.use_multipath_for_image_xfer
device_scan_attempts = self.configuration.num_volume_device_scan_tries
protocol = properties['driver_volume_type']
connector = utils.brick_get_connector(protocol,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
conn=properties)
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
conn=properties)
device = connector.connect_volume(properties['data'])
host_device = device['path']

8
cinder/volume/drivers/infinidat.py

@ -29,7 +29,6 @@ from cinder import exception
from cinder.i18n import _
from cinder import interface
from cinder.objects import fields
from cinder import utils
from cinder import version
from cinder.volume import configuration
from cinder.volume.drivers.san import san
@ -569,8 +568,9 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
def _connection_context(self, volume):
use_multipath = self.configuration.use_multipath_for_image_xfer
enforce_multipath = self.configuration.enforce_multipath_for_image_xfer
connector = utils.brick_get_connector_properties(use_multipath,
enforce_multipath)
connector = volume_utils.brick_get_connector_properties(
use_multipath,
enforce_multipath)
connection = self.initialize_connection(volume, connector)
try:
yield connection
@ -582,7 +582,7 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
use_multipath = self.configuration.use_multipath_for_image_xfer
device_scan_attempts = self.configuration.num_volume_device_scan_tries
protocol = connection['driver_volume_type']
connector = utils.brick_get_connector(
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=device_scan_attempts,

4
cinder/volume/drivers/kaminario/kaminario_common.py

@ -553,7 +553,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver):
vol_name = self.get_volume_name(volume.id)
cview = src_attach_info = dest_attach_info = None
rpolicy = self.get_policy()
properties = utils.brick_get_connector_properties()
properties = volume_utils.brick_get_connector_properties()
LOG.debug("Searching for snapshot: %s in K2.", snap_name)
snap_rs = self.client.search("snapshots", short_name=snap_name)
if hasattr(snap_rs, 'hits') and snap_rs.total != 0:
@ -624,7 +624,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver):
LOG.error(msg)
raise KaminarioCinderDriverException(reason=msg)
try:
properties = utils.brick_get_connector_properties()
properties = volume_utils.brick_get_connector_properties()
conn = self.initialize_connection(src_vref, properties)
src_attach_info = self._connect_device(conn)
self.create_volume(volume)

2
cinder/volume/flows/manager/create_volume.py

@ -509,7 +509,7 @@ class CreateVolumeFromSpecTask(flow_utils.CinderTask):
LOG.debug('rekey volume %s', volume.name)
properties = utils.brick_get_connector_properties(False, False)
properties = volume_utils.brick_get_connector_properties(False, False)
LOG.debug("properties: %s", properties)
attach_info = None
model_update = {}

17
cinder/volume/manager.py

@ -2038,7 +2038,7 @@ class VolumeManager(manager.CleanableManager,
use_multipath = self.configuration.use_multipath_for_image_xfer
device_scan_attempts = self.configuration.num_volume_device_scan_tries
protocol = conn['driver_volume_type']
connector = utils.brick_get_connector(
connector = volume_utils.brick_get_connector(
protocol,
use_multipath=use_multipath,
device_scan_attempts=device_scan_attempts,
@ -2088,9 +2088,9 @@ class VolumeManager(manager.CleanableManager,
encryption = self.db.volume_encryption_metadata_get(
ctxt.elevated(), volume.id)
if encryption:
utils.brick_attach_volume_encryptor(ctxt,
attach_info,
encryption)
volume_utils.brick_attach_volume_encryptor(ctxt,
attach_info,
encryption)
except Exception:
with excutils.save_and_reraise_exception():
LOG.error("Failed to attach volume encryptor"
@ -2110,8 +2110,8 @@ class VolumeManager(manager.CleanableManager,
encryption = self.db.volume_encryption_metadata_get(
ctxt.elevated(), volume.id)
if encryption:
utils.brick_detach_volume_encryptor(attach_info,
encryption)
volume_utils.brick_detach_volume_encryptor(attach_info,
encryption)
connector.disconnect_volume(attach_info['conn']['data'],
attach_info['device'], force=force)
@ -2144,8 +2144,9 @@ class VolumeManager(manager.CleanableManager,
attach_encryptor = True
use_multipath = self.configuration.use_multipath_for_image_xfer
enforce_multipath = self.configuration.enforce_multipath_for_image_xfer
properties = utils.brick_get_connector_properties(use_multipath,
enforce_multipath)
properties = volume_utils.brick_get_connector_properties(
use_multipath,
enforce_multipath)
dest_remote = remote in ['dest', 'both']
dest_attach_info = self._attach_volume(

68
cinder/volume/volume_utils.py

@ -35,6 +35,7 @@ import eventlet
from eventlet import tpool
from keystoneauth1 import loading as ks_loading
from os_brick import encryptors
from os_brick.initiator import connector
from oslo_concurrency import processutils
from oslo_config import cfg
from oslo_log import log as logging
@ -1295,3 +1296,70 @@ def get_backend_configuration(backend_name, backend_opts=None):
config.append_config_values(backend_opts)
return config
def brick_get_connector_properties(multipath=False, enforce_multipath=False):
"""Wrapper to automatically set root_helper in brick calls.
:param multipath: A boolean indicating whether the connector can
support multipath.
:param enforce_multipath: If True, it raises exception when multipath=True
is specified but multipathd is not running.
If False, it falls back to multipath=False
when multipathd is not running.
"""
root_helper = utils.get_root_helper()
return connector.get_connector_properties(root_helper,
CONF.my_ip,
multipath,
enforce_multipath)
def brick_get_connector(protocol, driver=None,
use_multipath=False,
device_scan_attempts=3,
*args, **kwargs):
"""Wrapper to get a brick connector object.
This automatically populates the required protocol as well
as the root_helper needed to execute commands.
"""
root_helper = utils.get_root_helper()
return connector.InitiatorConnector.factory(protocol, root_helper,
driver=driver,
use_multipath=use_multipath,
device_scan_attempts=
device_scan_attempts,
*args, **kwargs)
def brick_get_encryptor(connection_info, *args, **kwargs):
"""Wrapper to get a brick encryptor object."""
root_helper = utils.get_root_helper()
km = castellan_key_manager.API(CONF)
return encryptors.get_volume_encryptor(root_helper=root_helper,
connection_info=connection_info,
keymgr=km,
*args, **kwargs)
def brick_attach_volume_encryptor(context, attach_info, encryption):
"""Attach encryption layer."""
connection_info = attach_info['conn']
connection_info['data']['device_path'] = attach_info['device']['path']
encryptor = brick_get_encryptor(connection_info,
**encryption)
encryptor.attach_volume(context, **encryption)
def brick_detach_volume_encryptor(attach_info, encryption):
"""Detach encryption layer."""
connection_info = attach_info['conn']
connection_info['data']['device_path'] = attach_info['device']['path']
encryptor = brick_get_encryptor(connection_info,
**encryption)
encryptor.detach_volume(**encryption)
Loading…
Cancel
Save