Merge "iscsi: Listen for connections on both IPv4 and IPv6 ports"

This commit is contained in:
Jenkins 2017-01-19 22:34:11 +00:00 committed by Gerrit Code Review
commit bbbea4601a
3 changed files with 35 additions and 3 deletions
ironic_python_agent
extensions
tests/unit/extensions
releasenotes/notes

@ -26,6 +26,7 @@ except ImportError:
from ironic_python_agent import errors
from ironic_python_agent.extensions import base
from ironic_python_agent import hardware
from ironic_python_agent import netutils
from ironic_python_agent import utils
LOG = log.getLogger(__name__)
@ -97,7 +98,8 @@ def _start_lio(iqn, portal_port, device):
try:
# bind to the default port on all interfaces
rtslib_fb.NetworkPortal(tpg, '0.0.0.0', portal_port)
listen_ip = netutils.wrap_ipv6(netutils.get_wildcard_address())
rtslib_fb.NetworkPortal(tpg, listen_ip, portal_port)
except rtslib_fb.utils.RTSLibError as exc:
msg = 'Failed to publish a target: {}'.format(exc)
raise errors.ISCSIError(msg)

@ -155,6 +155,30 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
mock_dispatch.return_value = self.fake_dev
result = self.agent_extension.start_iscsi_target(iqn=self.fake_iqn)
self.assertEqual({'iscsi_target_iqn': self.fake_iqn},
result.command_result)
mock_rtslib.BlockStorageObject.assert_called_once_with(
name=self.fake_iqn, dev=self.fake_dev)
mock_rtslib.Target.assert_called_once_with(mock.ANY, self.fake_iqn,
mode='create')
mock_rtslib.TPG.assert_called_once_with(
mock_rtslib.Target.return_value, mode='create')
mock_rtslib.LUN.assert_called_once_with(
mock_rtslib.TPG.return_value,
storage_object=mock_rtslib.BlockStorageObject.return_value,
lun=1)
mock_rtslib.NetworkPortal.assert_called_once_with(
mock_rtslib.TPG.return_value, '[::]', 3260)
self.assertFalse(mock_destroy.called)
@mock.patch('ironic_python_agent.netutils.get_wildcard_address')
def test_start_iscsi_target_noipv6(self, mock_get_wildcard_address,
mock_rtslib, mock_dispatch,
mock_destroy):
mock_get_wildcard_address.return_value = '0.0.0.0'
mock_dispatch.return_value = self.fake_dev
result = self.agent_extension.start_iscsi_target(iqn=self.fake_iqn)
self.assertEqual({'iscsi_target_iqn': self.fake_iqn},
result.command_result)
mock_rtslib.BlockStorageObject.assert_called_once_with(
@ -191,7 +215,7 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
storage_object=mock_rtslib.BlockStorageObject.return_value,
lun=1)
mock_rtslib.NetworkPortal.assert_called_once_with(
mock_rtslib.TPG.return_value, '0.0.0.0', 3266)
mock_rtslib.TPG.return_value, '[::]', 3266)
def test_failed_to_start_iscsi(self, mock_rtslib, mock_dispatch,
mock_destroy):
@ -221,7 +245,7 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
storage_object=mock_rtslib.BlockStorageObject.return_value,
lun=1)
mock_rtslib.NetworkPortal.assert_called_once_with(
mock_rtslib.TPG.return_value, '0.0.0.0', 3260)
mock_rtslib.TPG.return_value, '[::]', 3260)
self.assertFalse(mock_destroy.called)
def test_failed_to_start_iscsi_wipe_disk_metadata(self, mock_rtslib,

@ -0,0 +1,6 @@
---
fixes:
- If using Linux-IO, ISCSI targets now support deploying over
a IPv6 network if booted into a IPv6 enabled kernel. IPv6 will
be used for deployments for all traffic between ironic and IPA
if IPA is passed a IPv6 address in the Ironic api url.