Merge "iscsi: Listen for connections on both IPv4 and IPv6 ports"
This commit is contained in:
@@ -26,6 +26,7 @@ except ImportError:
|
|||||||
from ironic_python_agent import errors
|
from ironic_python_agent import errors
|
||||||
from ironic_python_agent.extensions import base
|
from ironic_python_agent.extensions import base
|
||||||
from ironic_python_agent import hardware
|
from ironic_python_agent import hardware
|
||||||
|
from ironic_python_agent import netutils
|
||||||
from ironic_python_agent import utils
|
from ironic_python_agent import utils
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
@@ -97,7 +98,8 @@ def _start_lio(iqn, portal_port, device):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# bind to the default port on all interfaces
|
# 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:
|
except rtslib_fb.utils.RTSLibError as exc:
|
||||||
msg = 'Failed to publish a target: {}'.format(exc)
|
msg = 'Failed to publish a target: {}'.format(exc)
|
||||||
raise errors.ISCSIError(msg)
|
raise errors.ISCSIError(msg)
|
||||||
|
@@ -155,6 +155,30 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
|
|||||||
mock_dispatch.return_value = self.fake_dev
|
mock_dispatch.return_value = self.fake_dev
|
||||||
result = self.agent_extension.start_iscsi_target(iqn=self.fake_iqn)
|
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},
|
self.assertEqual({'iscsi_target_iqn': self.fake_iqn},
|
||||||
result.command_result)
|
result.command_result)
|
||||||
mock_rtslib.BlockStorageObject.assert_called_once_with(
|
mock_rtslib.BlockStorageObject.assert_called_once_with(
|
||||||
@@ -191,7 +215,7 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
|
|||||||
storage_object=mock_rtslib.BlockStorageObject.return_value,
|
storage_object=mock_rtslib.BlockStorageObject.return_value,
|
||||||
lun=1)
|
lun=1)
|
||||||
mock_rtslib.NetworkPortal.assert_called_once_with(
|
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,
|
def test_failed_to_start_iscsi(self, mock_rtslib, mock_dispatch,
|
||||||
mock_destroy):
|
mock_destroy):
|
||||||
@@ -221,7 +245,7 @@ class TestISCSIExtensionLIO(test_base.BaseTestCase):
|
|||||||
storage_object=mock_rtslib.BlockStorageObject.return_value,
|
storage_object=mock_rtslib.BlockStorageObject.return_value,
|
||||||
lun=1)
|
lun=1)
|
||||||
mock_rtslib.NetworkPortal.assert_called_once_with(
|
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)
|
self.assertFalse(mock_destroy.called)
|
||||||
|
|
||||||
def test_failed_to_start_iscsi_wipe_disk_metadata(self, mock_rtslib,
|
def test_failed_to_start_iscsi_wipe_disk_metadata(self, mock_rtslib,
|
||||||
|
6
releasenotes/notes/ipv6-provision-42e9000f6f6a7a3a.yaml
Normal file
6
releasenotes/notes/ipv6-provision-42e9000f6f6a7a3a.yaml
Normal file
@@ -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.
|
Reference in New Issue
Block a user