Remove openstack.common.strutils
This module now lives in oslo.utils, so import it from there instead. Co-Authored-By: Ian Cordasco <ian.cordasco@rackspace.com> Change-Id: Ib35dc840992433542490670781badd9529ec8947
This commit is contained in:
@@ -36,11 +36,12 @@ if not hasattr(parse, 'parse_qsl'):
|
|||||||
import cgi
|
import cgi
|
||||||
parse.parse_qsl = cgi.parse_qsl
|
parse.parse_qsl = cgi.parse_qsl
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
|
|
||||||
from glanceclient.common import https
|
from glanceclient.common import https
|
||||||
from glanceclient.common.utils import safe_header
|
from glanceclient.common.utils import safe_header
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common import importutils
|
from glanceclient.openstack.common import importutils
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
|
|
||||||
osprofiler_web = importutils.try_import("osprofiler.web")
|
osprofiler_web = importutils.try_import("osprofiler.web")
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ class HTTPClient(object):
|
|||||||
|
|
||||||
curl.append(url)
|
curl.append(url)
|
||||||
|
|
||||||
msg = ' '.join([strutils.safe_encode(item, errors='ignore')
|
msg = ' '.join([encodeutils.safe_decode(item, errors='ignore')
|
||||||
for item in curl])
|
for item in curl])
|
||||||
LOG.debug(msg)
|
LOG.debug(msg)
|
||||||
|
|
||||||
@@ -129,9 +130,9 @@ class HTTPClient(object):
|
|||||||
dump.extend(['%s: %s' % safe_header(k, v) for k, v in headers])
|
dump.extend(['%s: %s' % safe_header(k, v) for k, v in headers])
|
||||||
dump.append('')
|
dump.append('')
|
||||||
if body:
|
if body:
|
||||||
body = strutils.safe_decode(body)
|
body = encodeutils.safe_decode(body)
|
||||||
dump.extend([body, ''])
|
dump.extend([body, ''])
|
||||||
LOG.debug('\n'.join([strutils.safe_encode(x, errors='ignore')
|
LOG.debug('\n'.join([encodeutils.safe_decode(x, errors='ignore')
|
||||||
for x in dump]))
|
for x in dump]))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -145,7 +146,7 @@ class HTTPClient(object):
|
|||||||
:returns: Dictionary with encoded headers'
|
:returns: Dictionary with encoded headers'
|
||||||
names and values
|
names and values
|
||||||
"""
|
"""
|
||||||
return dict((strutils.safe_encode(h), strutils.safe_encode(v))
|
return dict((encodeutils.safe_encode(h), encodeutils.safe_encode(v))
|
||||||
for h, v in six.iteritems(headers))
|
for h, v in six.iteritems(headers))
|
||||||
|
|
||||||
def _request(self, method, url, **kwargs):
|
def _request(self, method, url, **kwargs):
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
|
import ssl
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
import OpenSSL
|
import OpenSSL
|
||||||
@@ -25,8 +26,8 @@ except ImportError:
|
|||||||
from urllib3 import connectionpool
|
from urllib3 import connectionpool
|
||||||
from urllib3 import poolmanager
|
from urllib3 import poolmanager
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
import six
|
import six
|
||||||
import ssl
|
|
||||||
|
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
|
|
||||||
@@ -50,7 +51,6 @@ except ImportError:
|
|||||||
|
|
||||||
|
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
|
|
||||||
|
|
||||||
def to_bytes(s):
|
def to_bytes(s):
|
||||||
@@ -81,7 +81,7 @@ class HTTPSAdapter(adapters.HTTPAdapter):
|
|||||||
# NOTE(flaper87): Make sure the url is encoded, otherwise
|
# NOTE(flaper87): Make sure the url is encoded, otherwise
|
||||||
# python's standard httplib will fail with a TypeError.
|
# python's standard httplib will fail with a TypeError.
|
||||||
url = super(HTTPSAdapter, self).request_url(request, proxies)
|
url = super(HTTPSAdapter, self).request_url(request, proxies)
|
||||||
return strutils.safe_encode(url)
|
return encodeutils.safe_encode(url)
|
||||||
|
|
||||||
def cert_verify(self, conn, url, verify, cert):
|
def cert_verify(self, conn, url, verify, cert):
|
||||||
super(HTTPSAdapter, self).cert_verify(conn, url, verify, cert)
|
super(HTTPSAdapter, self).cert_verify(conn, url, verify, cert)
|
||||||
|
@@ -31,11 +31,12 @@ if os.name == 'nt':
|
|||||||
else:
|
else:
|
||||||
msvcrt = None
|
msvcrt = None
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
|
from oslo.utils import strutils
|
||||||
import prettytable
|
import prettytable
|
||||||
|
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common import importutils
|
from glanceclient.openstack.common import importutils
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
|
|
||||||
_memoized_property_lock = threading.Lock()
|
_memoized_property_lock = threading.Lock()
|
||||||
|
|
||||||
@@ -150,7 +151,7 @@ def print_list(objs, fields, formatters=None, field_settings=None):
|
|||||||
row.append(data)
|
row.append(data)
|
||||||
pt.add_row(row)
|
pt.add_row(row)
|
||||||
|
|
||||||
print(strutils.safe_encode(pt.get_string()))
|
print(encodeutils.safe_decode(pt.get_string()))
|
||||||
|
|
||||||
|
|
||||||
def print_dict(d, max_column_width=80):
|
def print_dict(d, max_column_width=80):
|
||||||
@@ -161,7 +162,7 @@ def print_dict(d, max_column_width=80):
|
|||||||
if isinstance(v, (dict, list)):
|
if isinstance(v, (dict, list)):
|
||||||
v = json.dumps(v)
|
v = json.dumps(v)
|
||||||
pt.add_row([k, v])
|
pt.add_row([k, v])
|
||||||
print(strutils.safe_encode(pt.get_string(sortby='Property')))
|
print(encodeutils.safe_decode(pt.get_string(sortby='Property')))
|
||||||
|
|
||||||
|
|
||||||
def find_resource(manager, name_or_id):
|
def find_resource(manager, name_or_id):
|
||||||
@@ -175,7 +176,9 @@ def find_resource(manager, name_or_id):
|
|||||||
|
|
||||||
# now try to get entity as uuid
|
# now try to get entity as uuid
|
||||||
try:
|
try:
|
||||||
uuid.UUID(strutils.safe_encode(name_or_id))
|
# This must be unicode for Python 3 compatibility.
|
||||||
|
# If you pass a bytestring to uuid.UUID, you will get a TypeError
|
||||||
|
uuid.UUID(encodeutils.safe_decode(name_or_id))
|
||||||
return manager.get(name_or_id)
|
return manager.get(name_or_id)
|
||||||
except (ValueError, exc.NotFound):
|
except (ValueError, exc.NotFound):
|
||||||
pass
|
pass
|
||||||
@@ -233,7 +236,7 @@ def import_versioned_module(version, submodule=None):
|
|||||||
|
|
||||||
def exit(msg=''):
|
def exit(msg=''):
|
||||||
if msg:
|
if msg:
|
||||||
print(strutils.safe_encode(msg), file=sys.stderr)
|
print(encodeutils.safe_decode(msg), file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
@@ -291,7 +294,7 @@ def exception_to_str(exc):
|
|||||||
except UnicodeError:
|
except UnicodeError:
|
||||||
error = ("Caught '%(exception)s' exception." %
|
error = ("Caught '%(exception)s' exception." %
|
||||||
{"exception": exc.__class__.__name__})
|
{"exception": exc.__class__.__name__})
|
||||||
return strutils.safe_encode(error, errors='ignore')
|
return encodeutils.safe_decode(error, errors='ignore')
|
||||||
|
|
||||||
|
|
||||||
def get_file_size(file_obj):
|
def get_file_size(file_obj):
|
||||||
|
@@ -1,245 +0,0 @@
|
|||||||
# Copyright 2011 OpenStack Foundation.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
"""
|
|
||||||
System-level utilities and helper functions.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import math
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import unicodedata
|
|
||||||
|
|
||||||
import six
|
|
||||||
|
|
||||||
from glanceclient.openstack.common.gettextutils import _
|
|
||||||
|
|
||||||
|
|
||||||
UNIT_PREFIX_EXPONENT = {
|
|
||||||
'k': 1,
|
|
||||||
'K': 1,
|
|
||||||
'Ki': 1,
|
|
||||||
'M': 2,
|
|
||||||
'Mi': 2,
|
|
||||||
'G': 3,
|
|
||||||
'Gi': 3,
|
|
||||||
'T': 4,
|
|
||||||
'Ti': 4,
|
|
||||||
}
|
|
||||||
UNIT_SYSTEM_INFO = {
|
|
||||||
'IEC': (1024, re.compile(r'(^[-+]?\d*\.?\d+)([KMGT]i?)?(b|bit|B)$')),
|
|
||||||
'SI': (1000, re.compile(r'(^[-+]?\d*\.?\d+)([kMGT])?(b|bit|B)$')),
|
|
||||||
}
|
|
||||||
|
|
||||||
TRUE_STRINGS = ('1', 't', 'true', 'on', 'y', 'yes')
|
|
||||||
FALSE_STRINGS = ('0', 'f', 'false', 'off', 'n', 'no')
|
|
||||||
|
|
||||||
SLUGIFY_STRIP_RE = re.compile(r"[^\w\s-]")
|
|
||||||
SLUGIFY_HYPHENATE_RE = re.compile(r"[-\s]+")
|
|
||||||
|
|
||||||
|
|
||||||
def int_from_bool_as_string(subject):
|
|
||||||
"""Interpret a string as a boolean and return either 1 or 0.
|
|
||||||
|
|
||||||
Any string value in:
|
|
||||||
|
|
||||||
('True', 'true', 'On', 'on', '1')
|
|
||||||
|
|
||||||
is interpreted as a boolean True.
|
|
||||||
|
|
||||||
Useful for JSON-decoded stuff and config file parsing
|
|
||||||
"""
|
|
||||||
return bool_from_string(subject) and 1 or 0
|
|
||||||
|
|
||||||
|
|
||||||
def bool_from_string(subject, strict=False, default=False):
|
|
||||||
"""Interpret a string as a boolean.
|
|
||||||
|
|
||||||
A case-insensitive match is performed such that strings matching 't',
|
|
||||||
'true', 'on', 'y', 'yes', or '1' are considered True and, when
|
|
||||||
`strict=False`, anything else returns the value specified by 'default'.
|
|
||||||
|
|
||||||
Useful for JSON-decoded stuff and config file parsing.
|
|
||||||
|
|
||||||
If `strict=True`, unrecognized values, including None, will raise a
|
|
||||||
ValueError which is useful when parsing values passed in from an API call.
|
|
||||||
Strings yielding False are 'f', 'false', 'off', 'n', 'no', or '0'.
|
|
||||||
"""
|
|
||||||
if not isinstance(subject, six.string_types):
|
|
||||||
subject = str(subject)
|
|
||||||
|
|
||||||
lowered = subject.strip().lower()
|
|
||||||
|
|
||||||
if lowered in TRUE_STRINGS:
|
|
||||||
return True
|
|
||||||
elif lowered in FALSE_STRINGS:
|
|
||||||
return False
|
|
||||||
elif strict:
|
|
||||||
acceptable = ', '.join(
|
|
||||||
"'%s'" % s for s in sorted(TRUE_STRINGS + FALSE_STRINGS))
|
|
||||||
msg = _("Unrecognized value '%(val)s', acceptable values are:"
|
|
||||||
" %(acceptable)s") % {'val': subject,
|
|
||||||
'acceptable': acceptable}
|
|
||||||
raise ValueError(msg)
|
|
||||||
else:
|
|
||||||
return default
|
|
||||||
|
|
||||||
|
|
||||||
def safe_decode(text, incoming=None, errors='strict'):
|
|
||||||
"""Decodes incoming text/bytes string using `incoming` if they're not
|
|
||||||
already unicode.
|
|
||||||
|
|
||||||
:param incoming: Text's current encoding
|
|
||||||
:param errors: Errors handling policy. See here for valid
|
|
||||||
values http://docs.python.org/2/library/codecs.html
|
|
||||||
:returns: text or a unicode `incoming` encoded
|
|
||||||
representation of it.
|
|
||||||
:raises TypeError: If text is not an instance of str
|
|
||||||
"""
|
|
||||||
if not isinstance(text, (six.string_types, six.binary_type)):
|
|
||||||
raise TypeError("%s can't be decoded" % type(text))
|
|
||||||
|
|
||||||
if isinstance(text, six.text_type):
|
|
||||||
return text
|
|
||||||
|
|
||||||
if not incoming:
|
|
||||||
incoming = (sys.stdin.encoding or
|
|
||||||
sys.getdefaultencoding())
|
|
||||||
|
|
||||||
try:
|
|
||||||
return text.decode(incoming, errors)
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
# Note(flaper87) If we get here, it means that
|
|
||||||
# sys.stdin.encoding / sys.getdefaultencoding
|
|
||||||
# didn't return a suitable encoding to decode
|
|
||||||
# text. This happens mostly when global LANG
|
|
||||||
# var is not set correctly and there's no
|
|
||||||
# default encoding. In this case, most likely
|
|
||||||
# python will use ASCII or ANSI encoders as
|
|
||||||
# default encodings but they won't be capable
|
|
||||||
# of decoding non-ASCII characters.
|
|
||||||
#
|
|
||||||
# Also, UTF-8 is being used since it's an ASCII
|
|
||||||
# extension.
|
|
||||||
return text.decode('utf-8', errors)
|
|
||||||
|
|
||||||
|
|
||||||
def safe_encode(text, incoming=None,
|
|
||||||
encoding='utf-8', errors='strict'):
|
|
||||||
"""Encodes incoming text/bytes string using `encoding`.
|
|
||||||
|
|
||||||
If incoming is not specified, text is expected to be encoded with
|
|
||||||
current python's default encoding. (`sys.getdefaultencoding`)
|
|
||||||
|
|
||||||
:param incoming: Text's current encoding
|
|
||||||
:param encoding: Expected encoding for text (Default UTF-8)
|
|
||||||
:param errors: Errors handling policy. See here for valid
|
|
||||||
values http://docs.python.org/2/library/codecs.html
|
|
||||||
:returns: text or a bytestring `encoding` encoded
|
|
||||||
representation of it.
|
|
||||||
:raises TypeError: If text is not an instance of str
|
|
||||||
"""
|
|
||||||
if not isinstance(text, (six.string_types, six.binary_type)):
|
|
||||||
raise TypeError("%s can't be encoded" % type(text))
|
|
||||||
|
|
||||||
if not incoming:
|
|
||||||
incoming = (sys.stdin.encoding or
|
|
||||||
sys.getdefaultencoding())
|
|
||||||
|
|
||||||
if isinstance(text, six.text_type):
|
|
||||||
if six.PY3:
|
|
||||||
return text.encode(encoding, errors).decode(incoming)
|
|
||||||
else:
|
|
||||||
return text.encode(encoding, errors)
|
|
||||||
elif text and encoding != incoming:
|
|
||||||
# Decode text before encoding it with `encoding`
|
|
||||||
text = safe_decode(text, incoming, errors)
|
|
||||||
if six.PY3:
|
|
||||||
return text.encode(encoding, errors).decode(incoming)
|
|
||||||
else:
|
|
||||||
return text.encode(encoding, errors)
|
|
||||||
|
|
||||||
return text
|
|
||||||
|
|
||||||
|
|
||||||
def string_to_bytes(text, unit_system='IEC', return_int=False):
|
|
||||||
"""Converts a string into an float representation of bytes.
|
|
||||||
|
|
||||||
The units supported for IEC ::
|
|
||||||
|
|
||||||
Kb(it), Kib(it), Mb(it), Mib(it), Gb(it), Gib(it), Tb(it), Tib(it)
|
|
||||||
KB, KiB, MB, MiB, GB, GiB, TB, TiB
|
|
||||||
|
|
||||||
The units supported for SI ::
|
|
||||||
|
|
||||||
kb(it), Mb(it), Gb(it), Tb(it)
|
|
||||||
kB, MB, GB, TB
|
|
||||||
|
|
||||||
Note that the SI unit system does not support capital letter 'K'
|
|
||||||
|
|
||||||
:param text: String input for bytes size conversion.
|
|
||||||
:param unit_system: Unit system for byte size conversion.
|
|
||||||
:param return_int: If True, returns integer representation of text
|
|
||||||
in bytes. (default: decimal)
|
|
||||||
:returns: Numerical representation of text in bytes.
|
|
||||||
:raises ValueError: If text has an invalid value.
|
|
||||||
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
base, reg_ex = UNIT_SYSTEM_INFO[unit_system]
|
|
||||||
except KeyError:
|
|
||||||
msg = _('Invalid unit system: "%s"') % unit_system
|
|
||||||
raise ValueError(msg)
|
|
||||||
match = reg_ex.match(text)
|
|
||||||
if match:
|
|
||||||
magnitude = float(match.group(1))
|
|
||||||
unit_prefix = match.group(2)
|
|
||||||
if match.group(3) in ['b', 'bit']:
|
|
||||||
magnitude /= 8
|
|
||||||
else:
|
|
||||||
msg = _('Invalid string format: %s') % text
|
|
||||||
raise ValueError(msg)
|
|
||||||
if not unit_prefix:
|
|
||||||
res = magnitude
|
|
||||||
else:
|
|
||||||
res = magnitude * pow(base, UNIT_PREFIX_EXPONENT[unit_prefix])
|
|
||||||
if return_int:
|
|
||||||
return int(math.ceil(res))
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
def to_slug(value, incoming=None, errors="strict"):
|
|
||||||
"""Normalize string.
|
|
||||||
|
|
||||||
Convert to lowercase, remove non-word characters, and convert spaces
|
|
||||||
to hyphens.
|
|
||||||
|
|
||||||
Inspired by Django's `slugify` filter.
|
|
||||||
|
|
||||||
:param value: Text to slugify
|
|
||||||
:param incoming: Text's current encoding
|
|
||||||
:param errors: Errors handling policy. See here for valid
|
|
||||||
values http://docs.python.org/2/library/codecs.html
|
|
||||||
:returns: slugified unicode representation of `value`
|
|
||||||
:raises TypeError: If text is not an instance of str
|
|
||||||
"""
|
|
||||||
value = safe_decode(value, incoming, errors)
|
|
||||||
# NOTE(aababilov): no need to use safe_(encode|decode) here:
|
|
||||||
# encodings are always "ascii", error handling is always "ignore"
|
|
||||||
# and types are always known (first: unicode; second: str)
|
|
||||||
value = unicodedata.normalize("NFKD", value).encode(
|
|
||||||
"ascii", "ignore").decode("ascii")
|
|
||||||
value = SLUGIFY_STRIP_RE.sub("", value).strip().lower()
|
|
||||||
return SLUGIFY_HYPHENATE_RE.sub("-", value)
|
|
@@ -29,6 +29,7 @@ from os.path import expanduser
|
|||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
import six.moves.urllib.parse as urlparse
|
import six.moves.urllib.parse as urlparse
|
||||||
|
|
||||||
import glanceclient
|
import glanceclient
|
||||||
@@ -36,7 +37,6 @@ from glanceclient.common import utils
|
|||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common.gettextutils import _
|
from glanceclient.openstack.common.gettextutils import _
|
||||||
from glanceclient.openstack.common import importutils
|
from glanceclient.openstack.common import importutils
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
|
|
||||||
from keystoneclient.auth.identity import v2 as v2_auth
|
from keystoneclient.auth.identity import v2 as v2_auth
|
||||||
from keystoneclient.auth.identity import v3 as v3_auth
|
from keystoneclient.auth.identity import v3 as v3_auth
|
||||||
@@ -695,7 +695,7 @@ class HelpFormatter(argparse.HelpFormatter):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
OpenStackImagesShell().main(map(strutils.safe_decode, sys.argv[1:]))
|
OpenStackImagesShell().main(map(encodeutils.safe_decode, sys.argv[1:]))
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print('... terminating glance client', file=sys.stderr)
|
print('... terminating glance client', file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@@ -15,12 +15,13 @@
|
|||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
|
from oslo.utils import strutils
|
||||||
import six
|
import six
|
||||||
import six.moves.urllib.parse as urlparse
|
import six.moves.urllib.parse as urlparse
|
||||||
|
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
from glanceclient.openstack.common.apiclient import base
|
from glanceclient.openstack.common.apiclient import base
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
|
|
||||||
UPDATE_PARAMS = ('name', 'disk_format', 'container_format', 'min_disk',
|
UPDATE_PARAMS = ('name', 'disk_format', 'container_format', 'min_disk',
|
||||||
'min_ram', 'owner', 'size', 'is_public', 'protected',
|
'min_ram', 'owner', 'size', 'is_public', 'protected',
|
||||||
@@ -70,7 +71,7 @@ class ImageManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
def _image_meta_from_headers(self, headers):
|
def _image_meta_from_headers(self, headers):
|
||||||
meta = {'properties': {}}
|
meta = {'properties': {}}
|
||||||
safe_decode = strutils.safe_decode
|
safe_decode = encodeutils.safe_decode
|
||||||
for key, value in six.iteritems(headers):
|
for key, value in six.iteritems(headers):
|
||||||
value = safe_decode(value, incoming='utf-8')
|
value = safe_decode(value, incoming='utf-8')
|
||||||
if key.startswith('x-image-meta-property-'):
|
if key.startswith('x-image-meta-property-'):
|
||||||
@@ -191,7 +192,7 @@ class ImageManager(base.ManagerWithFind):
|
|||||||
#
|
#
|
||||||
# Making sure all params are str before
|
# Making sure all params are str before
|
||||||
# trying to encode them
|
# trying to encode them
|
||||||
qp[param] = strutils.safe_encode(value)
|
qp[param] = encodeutils.safe_decode(value)
|
||||||
|
|
||||||
url = '/v1/images/detail?%s' % urlparse.urlencode(qp)
|
url = '/v1/images/detail?%s' % urlparse.urlencode(qp)
|
||||||
images, resp = self._list(url, "images")
|
images, resp = self._list(url, "images")
|
||||||
|
@@ -20,10 +20,12 @@ import functools
|
|||||||
import six
|
import six
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
|
from oslo.utils import strutils
|
||||||
|
|
||||||
from glanceclient.common import progressbar
|
from glanceclient.common import progressbar
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
import glanceclient.v1.images
|
import glanceclient.v1.images
|
||||||
|
|
||||||
CONTAINER_FORMATS = 'Acceptable formats: ami, ari, aki, bare, and ovf.'
|
CONTAINER_FORMATS = 'Acceptable formats: ami, ari, aki, bare, and ovf.'
|
||||||
@@ -327,7 +329,7 @@ def do_image_delete(gc, args):
|
|||||||
try:
|
try:
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print('Requesting image delete for %s ...' %
|
print('Requesting image delete for %s ...' %
|
||||||
strutils.safe_encode(args_image), end=' ')
|
encodeutils.safe_decode(args_image), end=' ')
|
||||||
|
|
||||||
gc.images.delete(image)
|
gc.images.delete(image)
|
||||||
|
|
||||||
|
@@ -14,13 +14,14 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
import six
|
import six
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
import warlock
|
import warlock
|
||||||
|
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
from glanceclient.v2 import schemas
|
from glanceclient.v2 import schemas
|
||||||
|
|
||||||
DEFAULT_PAGE_SIZE = 20
|
DEFAULT_PAGE_SIZE = 20
|
||||||
@@ -83,11 +84,11 @@ class Controller(object):
|
|||||||
|
|
||||||
for tag in tags:
|
for tag in tags:
|
||||||
if isinstance(tag, six.string_types):
|
if isinstance(tag, six.string_types):
|
||||||
tags_url_params.append({'tag': strutils.safe_encode(tag)})
|
tags_url_params.append({'tag': encodeutils.safe_encode(tag)})
|
||||||
|
|
||||||
for param, value in six.iteritems(filters):
|
for param, value in six.iteritems(filters):
|
||||||
if isinstance(value, six.string_types):
|
if isinstance(value, six.string_types):
|
||||||
filters[param] = strutils.safe_encode(value)
|
filters[param] = encodeutils.safe_encode(value)
|
||||||
|
|
||||||
url = '/v2/images?%s' % parse.urlencode(filters)
|
url = '/v2/images?%s' % parse.urlencode(filters)
|
||||||
|
|
||||||
|
@@ -13,12 +13,12 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
import six
|
import six
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
import warlock
|
import warlock
|
||||||
|
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
from glanceclient.v2 import schemas
|
from glanceclient.v2 import schemas
|
||||||
|
|
||||||
DEFAULT_PAGE_SIZE = 20
|
DEFAULT_PAGE_SIZE = 20
|
||||||
@@ -161,9 +161,9 @@ class NamespaceController(object):
|
|||||||
|
|
||||||
for param, value in six.iteritems(filters):
|
for param, value in six.iteritems(filters):
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
filters[param] = strutils.safe_encode(','.join(value))
|
filters[param] = encodeutils.safe_encode(','.join(value))
|
||||||
elif isinstance(value, six.string_types):
|
elif isinstance(value, six.string_types):
|
||||||
filters[param] = strutils.safe_encode(value)
|
filters[param] = encodeutils.safe_encode(value)
|
||||||
|
|
||||||
url = '/v2/metadefs/namespaces?%s' % parse.urlencode(filters)
|
url = '/v2/metadefs/namespaces?%s' % parse.urlencode(filters)
|
||||||
|
|
||||||
|
@@ -14,12 +14,11 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo.utils import encodeutils
|
||||||
import six
|
import six
|
||||||
|
|
||||||
import warlock
|
import warlock
|
||||||
|
|
||||||
from glanceclient.common import utils
|
from glanceclient.common import utils
|
||||||
from glanceclient.openstack.common import strutils
|
|
||||||
from glanceclient.v2 import schemas
|
from glanceclient.v2 import schemas
|
||||||
|
|
||||||
DEFAULT_PAGE_SIZE = 20
|
DEFAULT_PAGE_SIZE = 20
|
||||||
@@ -84,7 +83,7 @@ class Controller(object):
|
|||||||
|
|
||||||
for param, value in filters.items():
|
for param, value in filters.items():
|
||||||
if isinstance(value, six.string_types):
|
if isinstance(value, six.string_types):
|
||||||
filters[param] = strutils.safe_encode(value)
|
filters[param] = encodeutils.safe_encode(value)
|
||||||
|
|
||||||
url = '/v2/tasks?%s' % six.moves.urllib.parse.urlencode(filters)
|
url = '/v2/tasks?%s' % six.moves.urllib.parse.urlencode(filters)
|
||||||
for task in paginate(url):
|
for task in paginate(url):
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
module=apiclient
|
module=apiclient
|
||||||
module=gettextutils
|
module=gettextutils
|
||||||
module=importutils
|
module=importutils
|
||||||
module=strutils
|
module=uuidutils
|
||||||
|
|
||||||
# The base module to hold the copy of openstack.common
|
# The base module to hold the copy of openstack.common
|
||||||
base=glanceclient
|
base=glanceclient
|
||||||
|
@@ -97,11 +97,11 @@ class TestClient(testtools.TestCase):
|
|||||||
# when creating the http client, the session headers don't contain
|
# when creating the http client, the session headers don't contain
|
||||||
# the X-Auth-Token key.
|
# the X-Auth-Token key.
|
||||||
identity_headers = {
|
identity_headers = {
|
||||||
'X-User-Id': 'user',
|
b'X-User-Id': b'user',
|
||||||
'X-Tenant-Id': 'tenant',
|
b'X-Tenant-Id': b'tenant',
|
||||||
'X-Roles': 'roles',
|
b'X-Roles': b'roles',
|
||||||
'X-Identity-Status': 'Confirmed',
|
b'X-Identity-Status': b'Confirmed',
|
||||||
'X-Service-Catalog': 'service_catalog',
|
b'X-Service-Catalog': b'service_catalog',
|
||||||
}
|
}
|
||||||
kwargs = {'identity_headers': identity_headers}
|
kwargs = {'identity_headers': identity_headers}
|
||||||
http_client = http.HTTPClient(self.endpoint, **kwargs)
|
http_client = http.HTTPClient(self.endpoint, **kwargs)
|
||||||
@@ -165,10 +165,7 @@ class TestClient(testtools.TestCase):
|
|||||||
value = u'ni\xf1o'
|
value = u'ni\xf1o'
|
||||||
headers = {"test": value}
|
headers = {"test": value}
|
||||||
encoded = self.client.encode_headers(headers)
|
encoded = self.client.encode_headers(headers)
|
||||||
if six.PY2:
|
self.assertEqual(b"ni\xc3\xb1o", encoded[b"test"])
|
||||||
self.assertEqual("ni\xc3\xb1o", encoded["test"])
|
|
||||||
else:
|
|
||||||
self.assertEqual(value, encoded["test"])
|
|
||||||
|
|
||||||
def test_raw_request(self):
|
def test_raw_request(self):
|
||||||
" Verify the path being used for HTTP requests reflects accurately. "
|
" Verify the path being used for HTTP requests reflects accurately. "
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
import errno
|
import errno
|
||||||
|
|
||||||
import six
|
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from glanceclient import exc
|
from glanceclient import exc
|
||||||
@@ -488,10 +487,7 @@ class TestController(testtools.TestCase):
|
|||||||
# /v2/images?owner=ni%C3%B1o&limit=20
|
# /v2/images?owner=ni%C3%B1o&limit=20
|
||||||
# We just want to make sure filters are correctly encoded.
|
# We just want to make sure filters are correctly encoded.
|
||||||
pass
|
pass
|
||||||
if six.PY2:
|
self.assertEqual(b"ni\xc3\xb1o", filters["owner"])
|
||||||
self.assertEqual("ni\xc3\xb1o", filters["owner"])
|
|
||||||
else:
|
|
||||||
self.assertEqual("ni\xf1o", filters["owner"])
|
|
||||||
|
|
||||||
def test_list_images_for_tag_single_image(self):
|
def test_list_images_for_tag_single_image(self):
|
||||||
img_id = '3a4560a1-e585-443e-9b39-553b46ec92d1'
|
img_id = '3a4560a1-e585-443e-9b39-553b46ec92d1'
|
||||||
|
@@ -14,7 +14,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import six
|
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from glanceclient.v2 import tasks
|
from glanceclient.v2 import tasks
|
||||||
@@ -260,10 +259,7 @@ class TestController(testtools.TestCase):
|
|||||||
# We just want to make sure filters are correctly encoded.
|
# We just want to make sure filters are correctly encoded.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if six.PY2:
|
self.assertEqual(b"ni\xc3\xb1o", filters["owner"])
|
||||||
self.assertEqual("ni\xc3\xb1o", filters["owner"])
|
|
||||||
else:
|
|
||||||
self.assertEqual("ni\xf1o", filters["owner"])
|
|
||||||
|
|
||||||
def test_get_task(self):
|
def test_get_task(self):
|
||||||
task = self.controller.get('3a4560a1-e585-443e-9b39-553b46ec92d1')
|
task = self.controller.get('3a4560a1-e585-443e-9b39-553b46ec92d1')
|
||||||
|
Reference in New Issue
Block a user