rtstool surrounds IPv6 addresses by brackets
Currently rtstool fails to create rtslib_fb.NetworkPortal with IPv6 addresses because rtslib expects IPv6 addresses to be surrounded by brackets. mitaka-backport-potential Closes-Bug: #1562737 Change-Id: I3cffde726ecbb1ddea77d57bd7edd02792872ea6
This commit is contained in:
parent
6a6e5a15dc
commit
4f1300cbae
|
@ -82,14 +82,15 @@ def create(backing_device, name, userid, password, iser_enabled,
|
||||||
|
|
||||||
# If no ips are given we'll bind to all IPv4 and v6
|
# If no ips are given we'll bind to all IPv4 and v6
|
||||||
if not portals_ips:
|
if not portals_ips:
|
||||||
portals_ips = ('0.0.0.0', '::0')
|
portals_ips = ('0.0.0.0', '[::0]')
|
||||||
# TODO(emh): Binding to IPv6 fails sometimes -- let pass for now.
|
# TODO(emh): Binding to IPv6 fails sometimes -- let pass for now.
|
||||||
ips_allow_fail = ('::0',)
|
ips_allow_fail = ('[::0]',)
|
||||||
|
|
||||||
for ip in portals_ips:
|
for ip in portals_ips:
|
||||||
try:
|
try:
|
||||||
portal = rtslib_fb.NetworkPortal(tpg_new, ip, portals_port,
|
# rtslib expects IPv6 addresses to be surrounded by brackets
|
||||||
mode='any')
|
portal = rtslib_fb.NetworkPortal(tpg_new, _canonicalize_ip(ip),
|
||||||
|
portals_port, mode='any')
|
||||||
except rtslib_fb.utils.RTSLibError:
|
except rtslib_fb.utils.RTSLibError:
|
||||||
raise_exc = ip not in ips_allow_fail
|
raise_exc = ip not in ips_allow_fail
|
||||||
msg_type = 'Error' if raise_exc else 'Warning'
|
msg_type = 'Error' if raise_exc else 'Warning'
|
||||||
|
@ -258,6 +259,12 @@ def parse_optional_create(argv):
|
||||||
return optional_args
|
return optional_args
|
||||||
|
|
||||||
|
|
||||||
|
def _canonicalize_ip(ip):
|
||||||
|
if ip.startswith('[') or "." in ip:
|
||||||
|
return ip
|
||||||
|
return "[" + ip + "]"
|
||||||
|
|
||||||
|
|
||||||
def main(argv=None):
|
def main(argv=None):
|
||||||
if argv is None:
|
if argv is None:
|
||||||
argv = sys.argv
|
argv = sys.argv
|
||||||
|
|
|
@ -925,11 +925,11 @@ class TestCinderRtstoolCmd(test.TestCase):
|
||||||
lun.assert_called_once_with(tpg_new,
|
lun.assert_called_once_with(tpg_new,
|
||||||
storage_object=mock.sentinel.so_new)
|
storage_object=mock.sentinel.so_new)
|
||||||
self.assertEqual(1, tpg_new.enable)
|
self.assertEqual(1, tpg_new.enable)
|
||||||
network_portal.assert_any_call(tpg_new, ip, 3260,
|
|
||||||
mode='any')
|
|
||||||
|
|
||||||
if ip == '::0':
|
if ip == '::0':
|
||||||
network_portal.assert_any_call(tpg_new, ip, 3260, mode='any')
|
ip = '[::0]'
|
||||||
|
|
||||||
|
network_portal.assert_any_call(tpg_new, ip, 3260, mode='any')
|
||||||
|
|
||||||
def test_create_rtslib_error_network_portal_ipv4(self):
|
def test_create_rtslib_error_network_portal_ipv4(self):
|
||||||
with mock.patch('sys.stdout', new=six.StringIO()):
|
with mock.patch('sys.stdout', new=six.StringIO()):
|
||||||
|
@ -956,12 +956,6 @@ class TestCinderRtstoolCmd(test.TestCase):
|
||||||
tpg_new = tpg.return_value
|
tpg_new = tpg.return_value
|
||||||
lun.return_value = mock.sentinel.lun_new
|
lun.return_value = mock.sentinel.lun_new
|
||||||
|
|
||||||
def network_portal_exception(*args, **kwargs):
|
|
||||||
if set([tpg_new, '::0', 3260]).issubset(list(args)):
|
|
||||||
raise rtslib_fb.utils.RTSLibError()
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
cinder_rtstool.create(mock.sentinel.backing_device,
|
cinder_rtstool.create(mock.sentinel.backing_device,
|
||||||
mock.sentinel.name,
|
mock.sentinel.name,
|
||||||
mock.sentinel.userid,
|
mock.sentinel.userid,
|
||||||
|
@ -981,11 +975,11 @@ class TestCinderRtstoolCmd(test.TestCase):
|
||||||
lun.assert_called_once_with(tpg_new,
|
lun.assert_called_once_with(tpg_new,
|
||||||
storage_object=mock.sentinel.so_new)
|
storage_object=mock.sentinel.so_new)
|
||||||
self.assertEqual(1, tpg_new.enable)
|
self.assertEqual(1, tpg_new.enable)
|
||||||
network_portal.assert_any_call(tpg_new, ip, 3260,
|
|
||||||
mode='any')
|
|
||||||
|
|
||||||
if ip == '::0':
|
if ip == '::0':
|
||||||
network_portal.assert_any_call(tpg_new, ip, 3260, mode='any')
|
ip = '[::0]'
|
||||||
|
|
||||||
|
network_portal.assert_any_call(tpg_new, ip, 3260, mode='any')
|
||||||
|
|
||||||
def test_create_ipv4(self):
|
def test_create_ipv4(self):
|
||||||
self._test_create('0.0.0.0')
|
self._test_create('0.0.0.0')
|
||||||
|
@ -993,11 +987,7 @@ class TestCinderRtstoolCmd(test.TestCase):
|
||||||
def test_create_ipv6(self):
|
def test_create_ipv6(self):
|
||||||
self._test_create('::0')
|
self._test_create('::0')
|
||||||
|
|
||||||
@mock.patch.object(cinder_rtstool, 'rtslib_fb', autospec=True)
|
def _test_create_ips_and_port(self, mock_rtslib, port, ips, expected_ips):
|
||||||
def test_create_ips_and_port(self, mock_rtslib):
|
|
||||||
port = 3261
|
|
||||||
ips = ['ip1', 'ip2', 'ip3']
|
|
||||||
|
|
||||||
mock_rtslib.BlockStorageObject.return_value = mock.sentinel.bso
|
mock_rtslib.BlockStorageObject.return_value = mock.sentinel.bso
|
||||||
mock_rtslib.Target.return_value = mock.sentinel.target_new
|
mock_rtslib.Target.return_value = mock.sentinel.target_new
|
||||||
mock_rtslib.FabricModule.return_value = mock.sentinel.iscsi_fabric
|
mock_rtslib.FabricModule.return_value = mock.sentinel.iscsi_fabric
|
||||||
|
@ -1021,10 +1011,24 @@ class TestCinderRtstoolCmd(test.TestCase):
|
||||||
storage_object=mock.sentinel.bso)
|
storage_object=mock.sentinel.bso)
|
||||||
|
|
||||||
mock_rtslib.NetworkPortal.assert_has_calls(
|
mock_rtslib.NetworkPortal.assert_has_calls(
|
||||||
map(lambda ip: mock.call(tpg_new, ip, port, mode='any'), ips),
|
map(lambda ip: mock.call(tpg_new, ip, port, mode='any'),
|
||||||
any_order=True
|
expected_ips), any_order=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@mock.patch.object(cinder_rtstool, 'rtslib_fb', autospec=True)
|
||||||
|
def test_create_ips_and_port_ipv4(self, mock_rtslib):
|
||||||
|
ips = ['10.0.0.2', '10.0.0.3', '10.0.0.4']
|
||||||
|
port = 3261
|
||||||
|
self._test_create_ips_and_port(mock_rtslib, port, ips, ips)
|
||||||
|
|
||||||
|
@mock.patch.object(cinder_rtstool, 'rtslib_fb', autospec=True)
|
||||||
|
def test_create_ips_and_port_ipv6(self, mock_rtslib):
|
||||||
|
ips = ['fe80::fc16:3eff:fecb:ad2f']
|
||||||
|
expected_ips = ['[fe80::fc16:3eff:fecb:ad2f]']
|
||||||
|
port = 3261
|
||||||
|
self._test_create_ips_and_port(mock_rtslib, port, ips,
|
||||||
|
expected_ips)
|
||||||
|
|
||||||
@mock.patch.object(rtslib_fb.root, 'RTSRoot')
|
@mock.patch.object(rtslib_fb.root, 'RTSRoot')
|
||||||
def test_add_initiator_rtslib_error(self, rtsroot):
|
def test_add_initiator_rtslib_error(self, rtsroot):
|
||||||
rtsroot.side_effect = rtslib_fb.utils.RTSLibError()
|
rtsroot.side_effect = rtslib_fb.utils.RTSLibError()
|
||||||
|
|
Loading…
Reference in New Issue