diff --git a/cinder/tests/targets/test_base_iscsi_driver.py b/cinder/tests/targets/test_base_iscsi_driver.py index 23dec8158d4..78de70a34be 100644 --- a/cinder/tests/targets/test_base_iscsi_driver.py +++ b/cinder/tests/targets/test_base_iscsi_driver.py @@ -27,9 +27,7 @@ class FakeDriver(iscsi.ISCSITarget): def create_export(self, context, vref): pass - def ensure_export(self, context, vref, - iscsi_name, vol_path, - vol_group, cfg): + def ensure_export(self, context, vref, vol_path): pass def remove_export(self, context, vref): diff --git a/cinder/tests/targets/test_iser_driver.py b/cinder/tests/targets/test_iser_driver.py new file mode 100644 index 00000000000..aaa6ca7af90 --- /dev/null +++ b/cinder/tests/targets/test_iser_driver.py @@ -0,0 +1,25 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cinder.tests.targets import test_tgt_driver as test_tgt +from cinder import utils +from cinder.volume.targets import iser + + +class TestIserAdmDriver(test_tgt.TestTgtAdmDriver): + + def setUp(self): + super(TestIserAdmDriver, self).setUp() + self.configuration.iser_ip_address = '10.9.8.7' + self.configuration.iser_target_prefix = 'iqn.2010-10.org.openstack:' + self.target = iser.ISERTgtAdm(root_helper=utils.get_root_helper(), + configuration=self.configuration) diff --git a/cinder/tests/targets/test_lio_driver.py b/cinder/tests/targets/test_lio_driver.py new file mode 100644 index 00000000000..3210572ec3a --- /dev/null +++ b/cinder/tests/targets/test_lio_driver.py @@ -0,0 +1,89 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock +from oslo_concurrency import processutils as putils + +from cinder import context +from cinder import exception +from cinder.tests.targets import test_tgt_driver as test_tgt +from cinder import utils +from cinder.volume.targets import lio + + +class TestLioAdmDriver(test_tgt.TestTgtAdmDriver): + + def setUp(self): + super(TestLioAdmDriver, self).setUp() + self.target = lio.LioAdm(root_helper=utils.get_root_helper(), + configuration=self.configuration) + self.fake_iscsi_scan = ('iqn.2010-10.org.openstack:' + 'volume-83c2e877-feed-46be-8435-77884fe55b45') + self.target.db = mock.MagicMock( + volume_get=lambda x, y: {'provider_auth': 'IncomingUser foo bar'}) + + def test_get_target(self): + + def _fake_execute(*args, **kwargs): + return self.fake_iscsi_scan, None + + self.stubs.Set(utils, + 'execute', + _fake_execute) + + self.assertEqual('iqn.2010-10.org.openstack:' + 'volume-83c2e877-feed-46be-8435-77884fe55b45', + self.target._get_target('iqn.2010-10.org.openstack:' + 'volume-83c2e877-feed-46be-' + '8435-77884fe55b45')) + + def test_verify_backing_lun(self): + pass + + def test_create_iscsi_target_already_exists(self): + def _fake_execute(*args, **kwargs): + raise putils.ProcessExecutionError(exit_code=1) + + self.stubs.Set(utils, + 'execute', + _fake_execute) + + self.stubs.Set(self.target, + '_get_target', + lambda x: 1) + + self.stubs.Set(self.target, + '_verify_backing_lun', + lambda x, y: True) + + test_vol = 'iqn.2010-10.org.openstack:'\ + 'volume-83c2e877-feed-46be-8435-77884fe55b45' + chap_auth = 'chap foo bar' + self.assertRaises(exception.ISCSITargetCreateFailed, + self.target.create_iscsi_target, + test_vol, + 1, + 0, + self.fake_volumes_dir, + chap_auth) + + @mock.patch.object(lio.LioAdm, 'create_iscsi_target') + def test_ensure_export(self, _mock_create): + + ctxt = context.get_admin_context() + self.target.ensure_export(ctxt, + self.testvol_1, + self.fake_volumes_dir) + self.target.create_iscsi_target.assert_called_once_with( + 'iqn.2010-10.org.openstack:testvol', + 1, 0, self.fake_volumes_dir, 'IncomingUser foo bar', + check_exit_code=False) diff --git a/cinder/tests/targets/test_tgt_driver.py b/cinder/tests/targets/test_tgt_driver.py index 8ceff1f139f..b88720b34b2 100644 --- a/cinder/tests/targets/test_tgt_driver.py +++ b/cinder/tests/targets/test_tgt_driver.py @@ -9,6 +9,7 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. + import os import tempfile @@ -231,7 +232,7 @@ class TestTgtAdmDriver(test.TestCase): 0, self.fake_volumes_dir)) - def test_create_create_export(self): + def test_create_export(self): def _fake_execute(*args, **kwargs): return '', '' @@ -265,3 +266,16 @@ class TestTgtAdmDriver(test.TestCase): self.target.create_export(ctxt, self.testvol_1, self.fake_volumes_dir)) + + def test_ensure_export(self): + ctxt = context.get_admin_context() + with mock.patch.object(self.target, 'create_iscsi_target'): + self.target.ensure_export(ctxt, + self.testvol_1, + self.fake_volumes_dir) + self.target.create_iscsi_target.assert_called_once_with( + 'iqn.2010-10.org.openstack:testvol', + 1, 0, self.fake_volumes_dir, None, + iscsi_write_cache='on', + check_exit_code=False, + old_name=None) diff --git a/cinder/volume/targets/lio.py b/cinder/volume/targets/lio.py index 6a8c71eba63..90bb964ce2d 100644 --- a/cinder/volume/targets/lio.py +++ b/cinder/volume/targets/lio.py @@ -95,6 +95,8 @@ class LioAdm(TgtAdm): LOG.info(_LI('Creating iscsi_target for volume: %s') % vol_id) + chap_auth_userid = "" + chap_auth_password = "" if chap_auth is not None: (chap_auth_userid, chap_auth_password) = chap_auth.split(' ')[1:]