From e7b4670516d9db4606efdeae36052c8da6470072 Mon Sep 17 00:00:00 2001 From: Eric Harney Date: Mon, 18 Jan 2021 21:43:32 +0000 Subject: [PATCH] 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 --- cinder/backup/manager.py | 6 +- cinder/tests/unit/backup/test_backup.py | 26 +++---- cinder/tests/unit/test_utils.py | 12 ++-- .../drivers/dell_emc/unity/test_adapter.py | 2 +- .../drivers/ibm/test_ibm_flashsystem.py | 2 +- .../unit/volume/drivers/test_infinidat.py | 24 +++---- .../unit/volume/drivers/test_kaminario.py | 9 ++- .../volume/drivers/test_macrosan_drivers.py | 17 +++-- cinder/tests/unit/volume/test_driver.py | 21 +++--- cinder/tests/unit/volume/test_image.py | 8 +-- cinder/tests/unit/volume/test_volume.py | 2 +- .../tests/unit/volume/test_volume_manager.py | 2 +- cinder/utils.py | 70 ------------------- cinder/volume/driver.py | 22 +++--- cinder/volume/drivers/datera/datera_api21.py | 3 +- cinder/volume/drivers/datera/datera_api22.py | 3 +- .../volume/drivers/dell_emc/unity/adapter.py | 2 +- cinder/volume/drivers/hitachi/hbsd_common.py | 3 +- .../volume/drivers/ibm/flashsystem_common.py | 24 ++++--- cinder/volume/drivers/infinidat.py | 8 +-- .../drivers/kaminario/kaminario_common.py | 4 +- cinder/volume/flows/manager/create_volume.py | 2 +- cinder/volume/manager.py | 17 ++--- cinder/volume/volume_utils.py | 68 ++++++++++++++++++ 24 files changed, 181 insertions(+), 176 deletions(-) diff --git a/cinder/backup/manager.py b/cinder/backup/manager.py index 671c240d459..7df64ce13a0 100644 --- a/cinder/backup/manager.py +++ b/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, diff --git a/cinder/tests/unit/backup/test_backup.py b/cinder/tests/unit/backup/test_backup.py index a2e49df0df1..6e5a76d9a7d 100644 --- a/cinder/tests/unit/backup/test_backup.py +++ b/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, diff --git a/cinder/tests/unit/test_utils.py b/cinder/tests/unit/test_utils.py index 116ba9b59b2..fb2417f9f09 100644 --- a/cinder/tests/unit/test_utils.py +++ b/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'] diff --git a/cinder/tests/unit/volume/drivers/dell_emc/unity/test_adapter.py b/cinder/tests/unit/volume/drivers/dell_emc/unity/test_adapter.py index 77cf2303c5b..6ac3092985a 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/unity/test_adapter.py +++ b/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) diff --git a/cinder/tests/unit/volume/drivers/ibm/test_ibm_flashsystem.py b/cinder/tests/unit/volume/drivers/ibm/test_ibm_flashsystem.py index b5fd2564760..1f24ab05a91 100644 --- a/cinder/tests/unit/volume/drivers/ibm/test_ibm_flashsystem.py +++ b/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, diff --git a/cinder/tests/unit/volume/drivers/test_infinidat.py b/cinder/tests/unit/volume/drivers/test_infinidat.py index c67e8ff32fc..e4918337498 100644 --- a/cinder/tests/unit/volume/drivers/test_infinidat.py +++ b/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) diff --git a/cinder/tests/unit/volume/drivers/test_kaminario.py b/cinder/tests/unit/volume/drivers/test_kaminario.py index 9926ddf8952..4e55646685c 100644 --- a/cinder/tests/unit/volume/drivers/test_kaminario.py +++ b/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): diff --git a/cinder/tests/unit/volume/drivers/test_macrosan_drivers.py b/cinder/tests/unit/volume/drivers/test_macrosan_drivers.py index 4d56243dc8d..bfccf150b91 100644 --- a/cinder/tests/unit/volume/drivers/test_macrosan_drivers.py +++ b/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) diff --git a/cinder/tests/unit/volume/test_driver.py b/cinder/tests/unit/volume/test_driver.py index 76d75cbdc0b..f216700690a 100644 --- a/cinder/tests/unit/volume/test_driver.py +++ b/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( diff --git a/cinder/tests/unit/volume/test_image.py b/cinder/tests/unit/volume/test_image.py index fc17c99673d..6323a28269a 100644 --- a/cinder/tests/unit/volume/test_image.py +++ b/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') diff --git a/cinder/tests/unit/volume/test_volume.py b/cinder/tests/unit/volume/test_volume.py index c5a1de6c815..721f46ebf68 100644 --- a/cinder/tests/unit/volume/test_volume.py +++ b/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, diff --git a/cinder/tests/unit/volume/test_volume_manager.py b/cinder/tests/unit/volume/test_volume_manager.py index ef1ce48c8a9..17e91201c74 100644 --- a/cinder/tests/unit/volume/test_volume_manager.py +++ b/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, diff --git a/cinder/utils.py b/cinder/utils.py index ce6de66680b..4d807c7674d 100644 --- a/cinder/utils.py +++ b/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 diff --git a/cinder/volume/driver.py b/cinder/volume/driver.py index 10c90604252..ebd2599aba6 100644 --- a/cinder/volume/driver.py +++ b/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, diff --git a/cinder/volume/drivers/datera/datera_api21.py b/cinder/volume/drivers/datera/datera_api21.py index 75a7a6c6fa4..2379f3606c5 100644 --- a/cinder/volume/drivers/datera/datera_api21.py +++ b/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, diff --git a/cinder/volume/drivers/datera/datera_api22.py b/cinder/volume/drivers/datera/datera_api22.py index cfd6c21af18..4dab3d9b798 100644 --- a/cinder/volume/drivers/datera/datera_api22.py +++ b/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, diff --git a/cinder/volume/drivers/dell_emc/unity/adapter.py b/cinder/volume/drivers/dell_emc/unity/adapter.py index 3f88a6d7571..a73e193b987 100644 --- a/cinder/volume/drivers/dell_emc/unity/adapter.py +++ b/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, \ diff --git a/cinder/volume/drivers/hitachi/hbsd_common.py b/cinder/volume/drivers/hitachi/hbsd_common.py index 5845e5c3598..1db86f43b17 100644 --- a/cinder/volume/drivers/hitachi/hbsd_common.py +++ b/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'] diff --git a/cinder/volume/drivers/ibm/flashsystem_common.py b/cinder/volume/drivers/ibm/flashsystem_common.py index 1d5a336d462..e27ea7034e4 100644 --- a/cinder/volume/drivers/ibm/flashsystem_common.py +++ b/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'] diff --git a/cinder/volume/drivers/infinidat.py b/cinder/volume/drivers/infinidat.py index e174da1b6b1..f9a7853196a 100644 --- a/cinder/volume/drivers/infinidat.py +++ b/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, diff --git a/cinder/volume/drivers/kaminario/kaminario_common.py b/cinder/volume/drivers/kaminario/kaminario_common.py index 11b28ce8147..7a644b20303 100644 --- a/cinder/volume/drivers/kaminario/kaminario_common.py +++ b/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) diff --git a/cinder/volume/flows/manager/create_volume.py b/cinder/volume/flows/manager/create_volume.py index f8468dbd8e2..209980d7706 100644 --- a/cinder/volume/flows/manager/create_volume.py +++ b/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 = {} diff --git a/cinder/volume/manager.py b/cinder/volume/manager.py index 8cd2d40d040..0127805b5d6 100644 --- a/cinder/volume/manager.py +++ b/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( diff --git a/cinder/volume/volume_utils.py b/cinder/volume/volume_utils.py index 915a4707f1e..08870aa26ed 100644 --- a/cinder/volume/volume_utils.py +++ b/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)