Add test coverage for SCTP health checker script

Also removed a block of shell code in install-ubuntu.rst,
because the block triggered an error in the doc job and it was unused.

Change-Id: I41033e8cd9710a91b9502db11577b1f1cb85fa46
This commit is contained in:
Gregory Thiemonge 2021-02-18 22:18:09 +01:00
parent 38887c6f0f
commit ce2e0d7425
2 changed files with 176 additions and 9 deletions

View File

@ -289,15 +289,6 @@ Install and configure components
$ MGMT_PORT_MAC=$(openstack port show -c mac_address -f value \
$MGMT_PORT_ID)
$ MGMT_PORT_IP=$(openstack port show -f yaml -c fixed_ips \
$MGMT_PORT_ID | awk '{FS=",|";gsub(",","");gsub("'\''",""); \
for(line = 1; line <= NF; ++line) {if ($line ~ /^- ip_address:/) \
{split($line, word, " ");if (ENVIRON["IPV6_ENABLED"] == "" && word[3] ~ /\./) \
print word[3];if (ENVIRON["IPV6_ENABLED"] != "" && word[3] ~ /:/) print word[3];} \
else {split($line, word, " ");for(ind in word) {if (word[ind] ~ /^ip_address=/) \
{split(word[ind], token, "=");if (ENVIRON["IPV6_ENABLED"] == "" && token[2] ~ /\./) \
print token[2];if (ENVIRON["IPV6_ENABLED"] != "" && token[2] ~ /:/) print token[2];}}}}}')
$ sudo ip link add o-hm0 type veth peer name o-bhm0
$ NETID=$(openstack network show lb-mgmt-net -c id -f value)
$ BRNAME=brq$(echo $NETID|cut -c 1-11)

View File

@ -19,6 +19,7 @@ from oslo_config import cfg
from oslo_config import fixture as oslo_fixture
from octavia.cmd import health_checker
from octavia.tests.common import utils as test_utils
from octavia.tests.unit import base
CONF = cfg.CONF
@ -150,3 +151,178 @@ class TestHealthCheckerCMD(base.TestCase):
ret = health_checker._sctp_decode_packet(data, family, expected_tag)
self.assertFalse(ret)
@mock.patch("time.time")
@mock.patch("socket.socket")
@mock.patch("octavia.cmd.health_checker._sctp_decode_packet")
@mock.patch("octavia.cmd.health_checker._sctp_build_abort_packet")
def test_sctp_health_check(self, mock_build_abort_packet,
mock_decode_packet, mock_socket,
mock_time):
mock_time.side_effect = [1, 2, 3, 4]
socket_mock = mock.Mock()
socket_mock.recvfrom = mock.Mock()
socket_mock.recvfrom.side_effect = [
socket.timeout(),
(None, None)
]
mock_socket.return_value = socket_mock
mock_decode_packet.return_value = 2 # INIT ACK
abrt_mock = mock.Mock()
mock_build_abort_packet.return_value = abrt_mock
mock_open = self.useFixture(
test_utils.OpenFixture('/proc/net/protocols',
'bar\n')).mock_open
with mock.patch('builtins.open', mock_open):
ret = health_checker.sctp_health_check(
"192.168.0.27", 1234, timeout=3)
self.assertEqual(0, ret) # Success
mock_decode_packet.assert_called()
socket_mock.send.assert_called_with(abrt_mock)
@mock.patch("time.time")
@mock.patch("socket.socket")
@mock.patch("octavia.cmd.health_checker._sctp_decode_packet")
@mock.patch("octavia.cmd.health_checker._sctp_build_abort_packet")
def test_sctp_health_check_with_sctp_support(self,
mock_build_abort_packet,
mock_decode_packet,
mock_socket,
mock_time):
mock_time.side_effect = [1, 2, 3, 4]
socket_mock = mock.Mock()
socket_mock.recvfrom = mock.Mock()
socket_mock.recvfrom.side_effect = [
socket.timeout(),
(None, None)
]
mock_socket.return_value = socket_mock
mock_decode_packet.return_value = 2 # INIT ACK
abrt_mock = mock.Mock()
mock_build_abort_packet.return_value = abrt_mock
mock_open = self.useFixture(
test_utils.OpenFixture('/proc/net/protocols',
'SCTP\n')).mock_open
with mock.patch('builtins.open', mock_open):
ret = health_checker.sctp_health_check(
"192.168.0.27", 1234, timeout=3)
self.assertEqual(0, ret) # Success
mock_decode_packet.assert_called()
for call in socket_mock.send.mock_calls:
self.assertNotEqual(mock.call(abrt_mock), call)
@mock.patch("time.time")
@mock.patch("socket.socket")
@mock.patch("octavia.cmd.health_checker._sctp_decode_packet")
@mock.patch("octavia.cmd.health_checker._sctp_build_abort_packet")
def test_sctp_health_check_fail(self, mock_build_abort_packet,
mock_decode_packet, mock_socket,
mock_time):
mock_time.side_effect = [1, 2, 3, 4]
socket_mock = mock.Mock()
socket_mock.recvfrom = mock.Mock()
socket_mock.recvfrom.side_effect = [
socket.timeout(),
(None, None)
]
mock_socket.return_value = socket_mock
mock_decode_packet.return_value = 6 # ABRT
abrt_mock = mock.Mock()
mock_build_abort_packet.return_value = abrt_mock
mock_open = self.useFixture(
test_utils.OpenFixture('/proc/net/protocols',
'bar\n')).mock_open
with mock.patch('builtins.open', mock_open):
ret = health_checker.sctp_health_check(
"192.168.0.27", 1234, timeout=3)
self.assertEqual(1, ret) # Error
mock_decode_packet.assert_called()
for call in socket_mock.send.mock_calls:
self.assertNotEqual(mock.call(abrt_mock), call)
@mock.patch("time.time")
@mock.patch("socket.socket")
@mock.patch("octavia.cmd.health_checker._sctp_decode_packet")
@mock.patch("octavia.cmd.health_checker._sctp_build_abort_packet")
def test_sctp_health_check_error(self, mock_build_abort_packet,
mock_decode_packet, mock_socket,
mock_time):
mock_time.side_effect = [1, 2, 3, 4]
socket_mock = mock.Mock()
socket_mock.recvfrom = mock.Mock()
socket_mock.recvfrom.side_effect = [
socket.timeout(),
(None, None)
]
mock_socket.return_value = socket_mock
mock_decode_packet.return_value = 1234 # Unknown
abrt_mock = mock.Mock()
mock_build_abort_packet.return_value = abrt_mock
mock_open = self.useFixture(
test_utils.OpenFixture('/proc/net/protocols',
'bar\n')).mock_open
with mock.patch('builtins.open', mock_open):
ret = health_checker.sctp_health_check(
"192.168.0.27", 1234, timeout=3)
self.assertEqual(3, ret) # Unknown error
mock_decode_packet.assert_called()
socket_mock.send.assert_called_with(abrt_mock)
@mock.patch("time.time")
@mock.patch("socket.socket")
@mock.patch("octavia.cmd.health_checker._sctp_decode_packet")
@mock.patch("octavia.cmd.health_checker._sctp_build_abort_packet")
def test_sctp_health_check_timeout(self, mock_build_abort_packet,
mock_decode_packet, mock_socket,
mock_time):
mock_time.side_effect = [1, 2, 3, 4]
socket_mock = mock.Mock()
socket_mock.recvfrom = mock.Mock()
socket_mock.recvfrom.side_effect = [
socket.timeout(),
socket.timeout(),
socket.timeout(),
socket.timeout(),
]
mock_socket.return_value = socket_mock
abrt_mock = mock.Mock()
mock_build_abort_packet.return_value = abrt_mock
mock_open = self.useFixture(
test_utils.OpenFixture('/proc/net/protocols',
'bar\n')).mock_open
with mock.patch('builtins.open', mock_open):
ret = health_checker.sctp_health_check(
"192.168.0.27", 1234, timeout=3)
self.assertEqual(2, ret) # Timeout
mock_decode_packet.assert_not_called()
for call in socket_mock.send.mock_calls:
self.assertNotEqual(mock.call(abrt_mock), call)