From 956fd14f5014605b16e2edbc88f20fa8e0084551 Mon Sep 17 00:00:00 2001 From: Hang Yang Date: Thu, 9 Apr 2020 15:51:57 -0500 Subject: [PATCH] Convert str to bytes for py3 socket compatibility socket.sendto() requires bytes and we need explicitly convert str to bytes in py3. Change-Id: Ib3f928963b11a2041caf1c3b15825125567ce360 Story: #2007537 Task: #39356 --- ironic_lib/metrics_statsd.py | 2 +- ironic_lib/tests/test_metrics_statsd.py | 8 ++++---- .../notes/conver-str-to-bytes-11a665d0fa8828ec.yaml | 7 +++++++ 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 releasenotes/notes/conver-str-to-bytes-11a665d0fa8828ec.yaml diff --git a/ironic_lib/metrics_statsd.py b/ironic_lib/metrics_statsd.py index 3295fbc7..26c72af2 100644 --- a/ironic_lib/metrics_statsd.py +++ b/ironic_lib/metrics_statsd.py @@ -80,7 +80,7 @@ class StatsdMetricLogger(metrics.MetricLogger): with contextlib.closing(self._open_socket()) as sock: try: sock.settimeout(0.0) - sock.sendto(metric, self._target) + sock.sendto(metric.encode(), self._target) except socket.error as e: LOG.warning("Failed to send the metric value to host " "%(host)s, port %(port)s. Error: %(error)s", diff --git a/ironic_lib/tests/test_metrics_statsd.py b/ironic_lib/tests/test_metrics_statsd.py index c2ccb84b..7ad952e3 100644 --- a/ironic_lib/tests/test_metrics_statsd.py +++ b/ironic_lib/tests/test_metrics_statsd.py @@ -75,27 +75,27 @@ class TestStatsdMetricLogger(base.IronicLibTestCase): self.ml._send('part1.part2', 2, 'type') mock_socket.sendto.assert_called_once_with( - 'part1.part2:2|type', + b'part1.part2:2|type', ('test-host', 4321)) mock_socket.close.assert_called_once_with() mock_socket.reset_mock() self.ml._send('part1.part2', 3.14159, 'type') mock_socket.sendto.assert_called_once_with( - 'part1.part2:3.14159|type', + b'part1.part2:3.14159|type', ('test-host', 4321)) mock_socket.close.assert_called_once_with() mock_socket.reset_mock() self.ml._send('part1.part2', 5, 'type') mock_socket.sendto.assert_called_once_with( - 'part1.part2:5|type', + b'part1.part2:5|type', ('test-host', 4321)) mock_socket.close.assert_called_once_with() mock_socket.reset_mock() self.ml._send('part1.part2', 5, 'type', sample_rate=0.5) mock_socket.sendto.assert_called_once_with( - 'part1.part2:5|type@0.5', + b'part1.part2:5|type@0.5', ('test-host', 4321)) mock_socket.close.assert_called_once_with() diff --git a/releasenotes/notes/conver-str-to-bytes-11a665d0fa8828ec.yaml b/releasenotes/notes/conver-str-to-bytes-11a665d0fa8828ec.yaml new file mode 100644 index 00000000..b94872f7 --- /dev/null +++ b/releasenotes/notes/conver-str-to-bytes-11a665d0fa8828ec.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes an py3 compatibility issue in metrics_statsd where str need be + explicitly converted to bytes before send with socket. + See `Story 2007537 `_ + for details.