summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-03-22 12:05:00 +0000
committerGerrit Code Review <review@openstack.org>2016-03-22 12:05:00 +0000
commiteb98bb5c7e42f7e131c1c155565c0354f9ddda82 (patch)
tree8eb01fe260248a17c4db302af85830a018be1f6d
parent72185e0e979dda23d640f46df367b28ac57c8b95 (diff)
parent2acf7a7a48434eb5f95b2ee88fa7f35c57ac0fda (diff)
downloadironic-python-agent-eb98bb5c7e42f7e131c1c155565c0354f9ddda82.tar.gz
Merge "determine tgtd ready status through tgtadm" into stable/liberty1.0.2
-rw-r--r--ironic_python_agent/extensions/iscsi.py23
-rw-r--r--ironic_python_agent/tests/unit/extensions/test_iscsi.py37
2 files changed, 26 insertions, 34 deletions
diff --git a/ironic_python_agent/extensions/iscsi.py b/ironic_python_agent/extensions/iscsi.py
index 4cd7de0b..9993da8c 100644
--- a/ironic_python_agent/extensions/iscsi.py
+++ b/ironic_python_agent/extensions/iscsi.py
@@ -15,8 +15,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-import os
-import time
from oslo_concurrency import processutils
from oslo_log import log
@@ -30,27 +28,20 @@ from ironic_python_agent import utils
LOG = log.getLogger(__name__)
-def _execute(cmd, error_msg, check_exit_code=None):
- if check_exit_code is None:
- check_exit_code = [0]
-
+def _execute(cmd, error_msg, **kwargs):
try:
- stdout, stderr = utils.execute(*cmd, check_exit_code=check_exit_code)
+ stdout, stderr = utils.execute(*cmd, **kwargs)
except processutils.ProcessExecutionError as e:
LOG.error(error_msg)
raise errors.ISCSIError(error_msg, e.exit_code, e.stdout, e.stderr)
-def _wait_for_iscsi_daemon(interval=1, attempts=10):
+def _wait_for_iscsi_daemon(attempts=10):
"""Wait for the ISCSI daemon to start."""
- for attempt in range(attempts):
- if os.path.exists("/var/run/tgtd.ipc_abstract_namespace.0"):
- break
- time.sleep(interval)
- else:
- error_msg = "ISCSI daemon didn't initialize"
- LOG.error(error_msg)
- raise errors.ISCSIError(error_msg, 1, '', error_msg)
+ # here, iscsi daemon is considered not running in case
+ # tgtadm is not able to talk to tgtd to show iscsi targets
+ cmd = ['tgtadm', '--lld', 'iscsi', '--mode', 'target', '--op', 'show']
+ _execute(cmd, "ISCSI daemon didn't initialize", attempts=attempts)
def _start_iscsi_daemon(iqn, device):
diff --git a/ironic_python_agent/tests/unit/extensions/test_iscsi.py b/ironic_python_agent/tests/unit/extensions/test_iscsi.py
index 646a4e26..ca96b549 100644
--- a/ironic_python_agent/tests/unit/extensions/test_iscsi.py
+++ b/ironic_python_agent/tests/unit/extensions/test_iscsi.py
@@ -16,7 +16,6 @@
# under the License.
import mock
-import os
import time
from oslo_concurrency import processutils
@@ -39,41 +38,44 @@ class TestISCSIExtension(test_base.BaseTestCase):
self.fake_dev = '/dev/fake'
self.fake_iqn = 'iqn-fake'
- @mock.patch.object(iscsi, '_wait_for_iscsi_daemon')
- def test_start_iscsi_target(self, mock_wait_iscsi, mock_execute,
- mock_dispatch):
+ def test_start_iscsi_target(self, mock_execute, mock_dispatch):
mock_dispatch.return_value = self.fake_dev
mock_execute.return_value = ('', '')
result = self.agent_extension.start_iscsi_target(iqn=self.fake_iqn)
- expected = [mock.call('tgtd', check_exit_code=[0]),
+ expected = [mock.call('tgtd'),
+ mock.call('tgtadm', '--lld', 'iscsi', '--mode',
+ 'target', '--op', 'show', attempts=10),
mock.call('tgtadm', '--lld', 'iscsi', '--mode',
'target', '--op', 'new', '--tid', '1',
- '--targetname', self.fake_iqn,
- check_exit_code=[0]),
+ '--targetname', self.fake_iqn),
mock.call('tgtadm', '--lld', 'iscsi', '--mode',
'logicalunit', '--op', 'new', '--tid', '1',
- '--lun', '1', '--backing-store',
- self.fake_dev, check_exit_code=[0]),
+ '--lun', '1', '--backing-store', self.fake_dev),
mock.call('tgtadm', '--lld', 'iscsi', '--mode', 'target',
'--op', 'bind', '--tid', '1',
- '--initiator-address', 'ALL',
- check_exit_code=[0])]
+ '--initiator-address', 'ALL')]
mock_execute.assert_has_calls(expected)
mock_dispatch.assert_called_once_with('get_os_install_device')
- mock_wait_iscsi.assert_called_once_with()
self.assertEqual({'iscsi_target_iqn': self.fake_iqn},
result.command_result)
- @mock.patch.object(os.path, 'exists', lambda x: False)
def test_start_iscsi_target_fail_wait_daemon(self, mock_execute,
mock_dispatch):
mock_dispatch.return_value = self.fake_dev
- mock_execute.return_value = ('', '')
+ # side effects here:
+ # - execute tgtd: stdout=='', stderr==''
+ # - induce tgtadm failure while in _wait_for_scsi_daemon
+ mock_execute.side_effect = [('', ''),
+ processutils.ProcessExecutionError('blah')]
self.assertRaises(errors.ISCSIError,
self.agent_extension.start_iscsi_target,
iqn=self.fake_iqn)
- mock_execute.assert_called_once_with('tgtd', check_exit_code=[0])
+ expected = [mock.call('tgtd'),
+ mock.call('tgtadm', '--lld', 'iscsi', '--mode', 'target',
+ '--op', 'show', attempts=10)]
+
+ mock_execute.assert_has_calls(expected)
mock_dispatch.assert_called_once_with('get_os_install_device')
@mock.patch.object(iscsi, '_wait_for_iscsi_daemon')
@@ -86,10 +88,9 @@ class TestISCSIExtension(test_base.BaseTestCase):
self.agent_extension.start_iscsi_target,
iqn=self.fake_iqn)
- expected = [mock.call('tgtd', check_exit_code=[0]),
+ expected = [mock.call('tgtd'),
mock.call('tgtadm', '--lld', 'iscsi', '--mode',
'target', '--op', 'new', '--tid', '1',
- '--targetname', self.fake_iqn,
- check_exit_code=[0])]
+ '--targetname', self.fake_iqn)]
mock_execute.assert_has_calls(expected)
mock_dispatch.assert_called_once_with('get_os_install_device')