summaryrefslogtreecommitdiff
path: root/ironicclient
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2020-04-28 12:54:56 +0200
committerDmitry Tantsur <dtantsur@protonmail.com>2020-05-04 10:49:11 +0200
commit0242f8219a3704dd4b3154ffd6971262ea5be0b0 (patch)
tree85897008c6256a7d900101e82cc2e1a59aaffc0b /ironicclient
parenta44a77e6d37e4730606b274fb5f60d7b36eb1832 (diff)
downloadpython-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.py8
-rw-r--r--ironicclient/common/utils.py4
-rw-r--r--ironicclient/tests/unit/common/test_http.py6
-rw-r--r--ironicclient/tests/unit/v1/test_node.py12
-rw-r--r--ironicclient/v1/node.py6
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