diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2020-04-28 12:54:56 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2020-05-04 10:49:11 +0200 |
commit | 0242f8219a3704dd4b3154ffd6971262ea5be0b0 (patch) | |
tree | 85897008c6256a7d900101e82cc2e1a59aaffc0b /ironicclient | |
parent | a44a77e6d37e4730606b274fb5f60d7b36eb1832 (diff) | |
download | python-ironicclient-0242f8219a3704dd4b3154ffd6971262ea5be0b0.tar.gz |
Get rid of the oslo.serialization dependency
It was used to smoothen out the difference in handling bytes in
Python 2 and 3. Now that we only support Python 3, it can be
replaced.
A side effect of this change is that we no longer accept bytes
in JSON. JSON does not support bytes, but this problem has been
hidden due to oslo.serialization until now. The configdrive
handling has been updated to account for that.
Change-Id: I230b55db55bce08d46f5023ad7a3f6501c96d100
Diffstat (limited to 'ironicclient')
-rw-r--r-- | ironicclient/common/http.py | 8 | ||||
-rw-r--r-- | ironicclient/common/utils.py | 4 | ||||
-rw-r--r-- | ironicclient/tests/unit/common/test_http.py | 6 | ||||
-rw-r--r-- | ironicclient/tests/unit/v1/test_node.py | 12 | ||||
-rw-r--r-- | ironicclient/v1/node.py | 6 |
5 files changed, 26 insertions, 10 deletions
diff --git a/ironicclient/common/http.py b/ironicclient/common/http.py index f72afa3..136ac1f 100644 --- a/ironicclient/common/http.py +++ b/ironicclient/common/http.py @@ -16,6 +16,7 @@ from distutils.version import StrictVersion import functools from http import client as http_client +import json import logging import re import textwrap @@ -24,7 +25,6 @@ from urllib import parse as urlparse from keystoneauth1 import adapter from keystoneauth1 import exceptions as kexc -from oslo_serialization import jsonutils from ironicclient.common import filecache from ironicclient.common.i18n import _ @@ -67,7 +67,7 @@ def _trim_endpoint_api_version(url): def _extract_error_json(body): """Return error_message from the HTTP response body.""" try: - body_json = jsonutils.loads(body) + body_json = json.loads(body) except ValueError: return {} @@ -75,7 +75,7 @@ def _extract_error_json(body): return {} try: - error_json = jsonutils.loads(body_json['error_message']) + error_json = json.loads(body_json['error_message']) except ValueError: return body_json @@ -393,7 +393,7 @@ class SessionClient(VersionNegotiationMixin, adapter.LegacyJsonAdapter): kwargs['headers'].setdefault('Accept', 'application/json') if 'body' in kwargs: - kwargs['data'] = jsonutils.dump_as_bytes(kwargs.pop('body')) + kwargs['json'] = kwargs.pop('body') resp = self._http_request(url, method, **kwargs) body = resp.content diff --git a/ironicclient/common/utils.py b/ironicclient/common/utils.py index cf3b1ba..0fa0b28 100644 --- a/ironicclient/common/utils.py +++ b/ironicclient/common/utils.py @@ -16,6 +16,7 @@ from __future__ import print_function import argparse +import base64 import contextlib import gzip import json @@ -26,7 +27,6 @@ import sys import tempfile import time -from oslo_serialization import base64 from oslo_utils import strutils from ironicclient.common.i18n import _ @@ -296,7 +296,7 @@ def make_configdrive(path): shutil.copyfileobj(tmpfile, gz_file) tmpzipfile.seek(0) - return base64.encode_as_bytes(tmpzipfile.read()) + return base64.b64encode(tmpzipfile.read()) def check_empty_arg(arg, arg_descriptor): diff --git a/ironicclient/tests/unit/common/test_http.py b/ironicclient/tests/unit/common/test_http.py index 0a7abd3..483f3c1 100644 --- a/ironicclient/tests/unit/common/test_http.py +++ b/ironicclient/tests/unit/common/test_http.py @@ -14,11 +14,11 @@ # under the License. from http import client as http_client +import json import time from unittest import mock from keystoneauth1 import exceptions as kexc -from oslo_serialization import jsonutils from ironicclient.common import filecache from ironicclient.common import http @@ -40,9 +40,9 @@ def _get_error_body(faultstring=None, debuginfo=None, description=None): 'faultstring': faultstring, 'debuginfo': debuginfo } - raw_error_body = jsonutils.dump_as_bytes(error_body) + raw_error_body = json.dumps(error_body) body = {'error_message': raw_error_body} - return jsonutils.dumps(body) + return json.dumps(body) def _session_client(**kwargs): diff --git a/ironicclient/tests/unit/v1/test_node.py b/ironicclient/tests/unit/v1/test_node.py index ade4f47..70a23ef 100644 --- a/ironicclient/tests/unit/v1/test_node.py +++ b/ironicclient/tests/unit/v1/test_node.py @@ -1498,6 +1498,15 @@ class NodeManagerTest(testtools.TestCase): ] self.assertEqual(expect, self.api.calls) + def test_node_set_provision_state_with_configdrive_invalid_bytes(self): + invalid_utf8 = b"\xc3\x28" + target_state = 'active' + self.assertRaisesRegex(ValueError, + 'Config drive', + self.mgr.set_provision_state, + NODE1['uuid'], target_state, + configdrive=invalid_utf8) + def test_node_set_provision_state_with_configdrive_as_dict(self): target_state = 'active' self.mgr.set_provision_state(NODE1['uuid'], target_state, @@ -1518,7 +1527,8 @@ class NodeManagerTest(testtools.TestCase): self.mgr.set_provision_state(NODE1['uuid'], target_state, configdrive=f.name) - body = {'target': target_state, 'configdrive': file_content} + body = {'target': target_state, + 'configdrive': file_content.decode('utf-8')} expect = [ ('PUT', '/v1/nodes/%s/states/provision' % NODE1['uuid'], {}, body), ] diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index 969d191..d70fc6c 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -557,6 +557,12 @@ class NodeManager(base.CreateManager): if os.path.isdir(configdrive): configdrive = utils.make_configdrive(configdrive) + if isinstance(configdrive, bytes): + try: + configdrive = configdrive.decode('utf-8') + except UnicodeError: + raise ValueError('Config drive must be a dictionary or ' + 'a base64 encoded string') body['configdrive'] = configdrive elif cleansteps: body['clean_steps'] = cleansteps |