diff --git a/ironic_python_agent/inspector.py b/ironic_python_agent/inspector.py index 31ca0a926..8e570c3b4 100644 --- a/ironic_python_agent/inspector.py +++ b/ironic_python_agent/inspector.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import os import time @@ -20,7 +21,6 @@ from ironic_lib import mdns from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging -from oslo_serialization import jsonutils from oslo_utils import excutils import requests import stevedore @@ -290,10 +290,10 @@ def collect_extra_hardware(data, failures): return try: - data['data'] = jsonutils.loads(out) - except ValueError as exc: + data['data'] = json.loads(out) + except json.decoder.JSONDecodeError as ex: msg = 'JSON returned from hardware-detect cannot be decoded: %s' - failures.add(msg, exc) + failures.add(msg, ex) def collect_pci_devices_info(data, failures): diff --git a/ironic_python_agent/ironic_api_client.py b/ironic_python_agent/ironic_api_client.py index dc6f0cf71..a2e7e1d00 100644 --- a/ironic_python_agent/ironic_api_client.py +++ b/ironic_python_agent/ironic_api_client.py @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json + from oslo_config import cfg from oslo_log import log -from oslo_serialization import jsonutils import requests import tenacity @@ -103,7 +104,7 @@ class APIClient(object): try: response = self._request('GET', '/') - data = jsonutils.loads(response.content) + data = json.loads(response.content) version = data['default_version']['version'].split('.') self._ironic_api_version = (int(version[0]), int(version[1])) return self._ironic_api_version @@ -127,8 +128,8 @@ class APIClient(object): if not isinstance(body, dict): # Old ironic format try: - body = jsonutils.loads(body) - except ValueError: + body = json.loads(body) + except json.decoder.JSONDecodeError: body = {} text = (body.get('faultstring') @@ -253,8 +254,8 @@ class APIClient(object): return False try: - content = jsonutils.loads(response.content) - except Exception as e: + content = json.loads(response.content) + except json.decoder.JSONDecodeError as e: LOG.warning('Error decoding response: %s', e) return False diff --git a/ironic_python_agent/tests/unit/test_agent.py b/ironic_python_agent/tests/unit/test_agent.py index d90b04140..b5e40bf6c 100644 --- a/ironic_python_agent/tests/unit/test_agent.py +++ b/ironic_python_agent/tests/unit/test_agent.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import socket import time from unittest import mock @@ -19,7 +20,6 @@ from unittest import mock from ironic_lib import exception as lib_exc from oslo_concurrency import processutils from oslo_config import cfg -from oslo_serialization import jsonutils import pkg_resources from stevedore import extension @@ -192,8 +192,8 @@ class TestBaseAgent(ironic_agent_base.IronicAgentTest): # object. a_encoded = self.encoder.encode(a) b_encoded = self.encoder.encode(b) - self.assertEqual(jsonutils.loads(a_encoded), - jsonutils.loads(b_encoded)) + self.assertEqual(json.loads(a_encoded), + json.loads(b_encoded)) def test_get_status(self): started_at = time.time() diff --git a/ironic_python_agent/tests/unit/test_ironic_api_client.py b/ironic_python_agent/tests/unit/test_ironic_api_client.py index ba603651d..8c05652ce 100644 --- a/ironic_python_agent/tests/unit/test_ironic_api_client.py +++ b/ironic_python_agent/tests/unit/test_ironic_api_client.py @@ -16,7 +16,6 @@ import json from unittest import mock from oslo_config import cfg -from oslo_serialization import jsonutils import requests from ironic_python_agent import errors @@ -149,7 +148,7 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): expected_data = { 'callback_url': 'http://192.0.2.1:9999', 'agent_version': version.__version__} - self.assertEqual(jsonutils.dumps(expected_data), data) + self.assertEqual(json.dumps(expected_data), data) def test_successful_heartbeat_ip6(self): response = FakeResponse(status_code=202) @@ -172,7 +171,7 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): expected_data = { 'callback_url': 'http://[fc00:1111::4]:9999', 'agent_version': version.__version__} - self.assertEqual(jsonutils.dumps(expected_data), data) + self.assertEqual(json.dumps(expected_data), data) def test_successful_heartbeat_with_token(self): response = FakeResponse(status_code=202) @@ -197,7 +196,7 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): 'callback_url': 'http://192.0.2.1:9999', 'agent_token': 'magical', 'agent_version': version.__version__} - self.assertEqual(jsonutils.dumps(expected_data), data) + self.assertEqual(json.dumps(expected_data), data) def test_heartbeat_agent_version_unsupported(self): response = FakeResponse(status_code=202) @@ -218,7 +217,7 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): self.assertEqual(API_URL + heartbeat_path, request_args[1]) expected_data = { 'callback_url': 'http://[fc00:1111::4]:9999'} - self.assertEqual(jsonutils.dumps(expected_data), data) + self.assertEqual(json.dumps(expected_data), data) def test_successful_heartbeat_with_verify_ca(self): response = FakeResponse(status_code=202) @@ -246,7 +245,7 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): 'agent_token': 'magical', 'agent_version': version.__version__, 'agent_verify_ca': 'I am a cert'} - self.assertEqual(jsonutils.dumps(expected_data), data) + self.assertEqual(json.dumps(expected_data), data) headers = self.api_client.session.request.call_args[1]['headers'] self.assertEqual( '%d.%d' % ironic_api_client.AGENT_VERIFY_CA_IRONIC_VERSION, diff --git a/ironic_python_agent/tests/unit/test_utils.py b/ironic_python_agent/tests/unit/test_utils.py index 8adb78cc3..9382a6b45 100644 --- a/ironic_python_agent/tests/unit/test_utils.py +++ b/ironic_python_agent/tests/unit/test_utils.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import base64 import errno import glob import io @@ -26,7 +27,6 @@ from unittest import mock from ironic_lib import utils as ironic_utils from oslo_concurrency import processutils -from oslo_serialization import base64 import requests import testtools @@ -321,7 +321,7 @@ class TestUtils(ironic_agent_base.IronicAgentTest): data = utils.gzip_and_b64encode(io_dict=io_dict) self.assertIsInstance(data, str) - res = io.BytesIO(base64.decode_as_bytes(data)) + res = io.BytesIO(base64.b64decode(data)) with tarfile.open(fileobj=res) as tar: members = [(m.name, m.size) for m in tar] self.assertEqual([('fake-name', len(contents))], members) diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py index bcf9a0a43..09d726cf1 100644 --- a/ironic_python_agent/utils.py +++ b/ironic_python_agent/utils.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import base64 from collections import abc import contextlib import copy @@ -31,8 +32,6 @@ from ironic_lib import utils as ironic_utils from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging -from oslo_serialization import base64 -from oslo_serialization import jsonutils from oslo_utils import units import pyudev import requests @@ -504,6 +503,13 @@ def get_journalctl_output(lines=None, units=None): return get_command_output(cmd) +def _encode_as_text(s): + if isinstance(s, str): + s = s.encode('utf-8') + s = base64.b64encode(s) + return s.decode('ascii') + + def gzip_and_b64encode(io_dict=None, file_list=None): """Gzip and base64 encode files and BytesIO buffers. @@ -529,7 +535,8 @@ def gzip_and_b64encode(io_dict=None, file_list=None): tar.add(f) fp.seek(0) - return base64.encode_as_text(fp.getvalue()) + + return _encode_as_text(fp.getvalue()) def _collect_udev(io_dict): @@ -686,8 +693,8 @@ def parse_capabilities(root): capabilities = root.get('capabilities', {}) if isinstance(capabilities, str): try: - capabilities = jsonutils.loads(capabilities) - except (ValueError, TypeError): + capabilities = json.loads(capabilities) + except json.decoder.JSONDecodeError: capabilities = _parse_capabilities_str(capabilities) if not isinstance(capabilities, dict): diff --git a/requirements.txt b/requirements.txt index 55ec66506..18eea6913 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,6 @@ netifaces>=0.10.4 # MIT oslo.config>=5.2.0 # Apache-2.0 oslo.concurrency>=3.26.0 # Apache-2.0 oslo.log>=4.6.1 # Apache-2.0 -oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 oslo.service!=1.28.1,>=1.24.0 # Apache-2.0 oslo.utils>=3.34.0 # Apache-2.0 Pint>=0.5 # BSD