Merge "Remove openstack.common.strutils"
This commit is contained in:
		@@ -36,11 +36,12 @@ if not hasattr(parse, 'parse_qsl'):
 | 
			
		||||
    import cgi
 | 
			
		||||
    parse.parse_qsl = cgi.parse_qsl
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import https
 | 
			
		||||
from glanceclient.common.utils import safe_header
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common import importutils
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
 | 
			
		||||
osprofiler_web = importutils.try_import("osprofiler.web")
 | 
			
		||||
 | 
			
		||||
@@ -117,7 +118,7 @@ class HTTPClient(object):
 | 
			
		||||
 | 
			
		||||
        curl.append(url)
 | 
			
		||||
 | 
			
		||||
        msg = ' '.join([strutils.safe_encode(item, errors='ignore')
 | 
			
		||||
        msg = ' '.join([encodeutils.safe_decode(item, errors='ignore')
 | 
			
		||||
                        for item in curl])
 | 
			
		||||
        LOG.debug(msg)
 | 
			
		||||
 | 
			
		||||
@@ -129,9 +130,9 @@ class HTTPClient(object):
 | 
			
		||||
        dump.extend(['%s: %s' % safe_header(k, v) for k, v in headers])
 | 
			
		||||
        dump.append('')
 | 
			
		||||
        if body:
 | 
			
		||||
            body = strutils.safe_decode(body)
 | 
			
		||||
            body = encodeutils.safe_decode(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]))
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
@@ -145,7 +146,7 @@ class HTTPClient(object):
 | 
			
		||||
        :returns: Dictionary with encoded headers'
 | 
			
		||||
                  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))
 | 
			
		||||
 | 
			
		||||
    def _request(self, method, url, **kwargs):
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
#    under the License.
 | 
			
		||||
 | 
			
		||||
import socket
 | 
			
		||||
import ssl
 | 
			
		||||
import struct
 | 
			
		||||
 | 
			
		||||
import OpenSSL
 | 
			
		||||
@@ -25,8 +26,8 @@ except ImportError:
 | 
			
		||||
    from urllib3 import connectionpool
 | 
			
		||||
    from urllib3 import poolmanager
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
import six
 | 
			
		||||
import ssl
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +51,6 @@ except ImportError:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def to_bytes(s):
 | 
			
		||||
@@ -81,7 +81,7 @@ class HTTPSAdapter(adapters.HTTPAdapter):
 | 
			
		||||
        # NOTE(flaper87): Make sure the url is encoded, otherwise
 | 
			
		||||
        # python's standard httplib will fail with a TypeError.
 | 
			
		||||
        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):
 | 
			
		||||
        super(HTTPSAdapter, self).cert_verify(conn, url, verify, cert)
 | 
			
		||||
 
 | 
			
		||||
@@ -31,11 +31,12 @@ if os.name == 'nt':
 | 
			
		||||
else:
 | 
			
		||||
    msvcrt = None
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
from oslo.utils import strutils
 | 
			
		||||
import prettytable
 | 
			
		||||
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common import importutils
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
 | 
			
		||||
_memoized_property_lock = threading.Lock()
 | 
			
		||||
 | 
			
		||||
@@ -150,7 +151,7 @@ def print_list(objs, fields, formatters=None, field_settings=None):
 | 
			
		||||
                row.append(data)
 | 
			
		||||
        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):
 | 
			
		||||
@@ -161,7 +162,7 @@ def print_dict(d, max_column_width=80):
 | 
			
		||||
        if isinstance(v, (dict, list)):
 | 
			
		||||
            v = json.dumps(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):
 | 
			
		||||
@@ -175,7 +176,9 @@ def find_resource(manager, name_or_id):
 | 
			
		||||
 | 
			
		||||
    # now try to get entity as uuid
 | 
			
		||||
    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)
 | 
			
		||||
    except (ValueError, exc.NotFound):
 | 
			
		||||
        pass
 | 
			
		||||
@@ -233,7 +236,7 @@ def import_versioned_module(version, submodule=None):
 | 
			
		||||
 | 
			
		||||
def exit(msg=''):
 | 
			
		||||
    if msg:
 | 
			
		||||
        print(strutils.safe_encode(msg), file=sys.stderr)
 | 
			
		||||
        print(encodeutils.safe_decode(msg), file=sys.stderr)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -291,7 +294,7 @@ def exception_to_str(exc):
 | 
			
		||||
        except UnicodeError:
 | 
			
		||||
            error = ("Caught '%(exception)s' exception." %
 | 
			
		||||
                     {"exception": exc.__class__.__name__})
 | 
			
		||||
    return strutils.safe_encode(error, errors='ignore')
 | 
			
		||||
    return encodeutils.safe_decode(error, errors='ignore')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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 traceback
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
import six.moves.urllib.parse as urlparse
 | 
			
		||||
 | 
			
		||||
import glanceclient
 | 
			
		||||
@@ -36,7 +37,6 @@ from glanceclient.common import utils
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common.gettextutils import _
 | 
			
		||||
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 v3 as v3_auth
 | 
			
		||||
@@ -695,7 +695,7 @@ class HelpFormatter(argparse.HelpFormatter):
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    try:
 | 
			
		||||
        OpenStackImagesShell().main(map(strutils.safe_decode, sys.argv[1:]))
 | 
			
		||||
        OpenStackImagesShell().main(map(encodeutils.safe_decode, sys.argv[1:]))
 | 
			
		||||
    except KeyboardInterrupt:
 | 
			
		||||
        print('... terminating glance client', file=sys.stderr)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,12 +15,13 @@
 | 
			
		||||
 | 
			
		||||
import copy
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
from oslo.utils import strutils
 | 
			
		||||
import six
 | 
			
		||||
import six.moves.urllib.parse as urlparse
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
from glanceclient.openstack.common.apiclient import base
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
 | 
			
		||||
UPDATE_PARAMS = ('name', 'disk_format', 'container_format', 'min_disk',
 | 
			
		||||
                 'min_ram', 'owner', 'size', 'is_public', 'protected',
 | 
			
		||||
@@ -70,7 +71,7 @@ class ImageManager(base.ManagerWithFind):
 | 
			
		||||
 | 
			
		||||
    def _image_meta_from_headers(self, headers):
 | 
			
		||||
        meta = {'properties': {}}
 | 
			
		||||
        safe_decode = strutils.safe_decode
 | 
			
		||||
        safe_decode = encodeutils.safe_decode
 | 
			
		||||
        for key, value in six.iteritems(headers):
 | 
			
		||||
            value = safe_decode(value, incoming='utf-8')
 | 
			
		||||
            if key.startswith('x-image-meta-property-'):
 | 
			
		||||
@@ -191,7 +192,7 @@ class ImageManager(base.ManagerWithFind):
 | 
			
		||||
                    #
 | 
			
		||||
                    # Making sure all params are str before
 | 
			
		||||
                    # trying to encode them
 | 
			
		||||
                    qp[param] = strutils.safe_encode(value)
 | 
			
		||||
                    qp[param] = encodeutils.safe_decode(value)
 | 
			
		||||
 | 
			
		||||
            url = '/v1/images/detail?%s' % urlparse.urlencode(qp)
 | 
			
		||||
            images, resp = self._list(url, "images")
 | 
			
		||||
 
 | 
			
		||||
@@ -20,10 +20,12 @@ import functools
 | 
			
		||||
import six
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
from oslo.utils import strutils
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import progressbar
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
import glanceclient.v1.images
 | 
			
		||||
 | 
			
		||||
CONTAINER_FORMATS = 'Acceptable formats: ami, ari, aki, bare, and ovf.'
 | 
			
		||||
@@ -327,7 +329,7 @@ def do_image_delete(gc, args):
 | 
			
		||||
        try:
 | 
			
		||||
            if args.verbose:
 | 
			
		||||
                print('Requesting image delete for %s ...' %
 | 
			
		||||
                      strutils.safe_encode(args_image), end=' ')
 | 
			
		||||
                      encodeutils.safe_decode(args_image), end=' ')
 | 
			
		||||
 | 
			
		||||
            gc.images.delete(image)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,14 @@
 | 
			
		||||
#    under the License.
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
import six
 | 
			
		||||
from six.moves.urllib import parse
 | 
			
		||||
import warlock
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
from glanceclient.v2 import schemas
 | 
			
		||||
 | 
			
		||||
DEFAULT_PAGE_SIZE = 20
 | 
			
		||||
@@ -98,11 +99,11 @@ class Controller(object):
 | 
			
		||||
 | 
			
		||||
        for tag in tags:
 | 
			
		||||
            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):
 | 
			
		||||
            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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,12 +13,12 @@
 | 
			
		||||
#    License for the specific language governing permissions and limitations
 | 
			
		||||
#    under the License.
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
import six
 | 
			
		||||
from six.moves.urllib import parse
 | 
			
		||||
import warlock
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
from glanceclient.v2 import schemas
 | 
			
		||||
 | 
			
		||||
DEFAULT_PAGE_SIZE = 20
 | 
			
		||||
@@ -161,9 +161,9 @@ class NamespaceController(object):
 | 
			
		||||
 | 
			
		||||
        for param, value in six.iteritems(filters):
 | 
			
		||||
            if isinstance(value, list):
 | 
			
		||||
                filters[param] = strutils.safe_encode(','.join(value))
 | 
			
		||||
                filters[param] = encodeutils.safe_encode(','.join(value))
 | 
			
		||||
            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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,11 @@
 | 
			
		||||
#    License for the specific language governing permissions and limitations
 | 
			
		||||
#    under the License.
 | 
			
		||||
 | 
			
		||||
from oslo.utils import encodeutils
 | 
			
		||||
import six
 | 
			
		||||
 | 
			
		||||
import warlock
 | 
			
		||||
 | 
			
		||||
from glanceclient.common import utils
 | 
			
		||||
from glanceclient.openstack.common import strutils
 | 
			
		||||
from glanceclient.v2 import schemas
 | 
			
		||||
 | 
			
		||||
DEFAULT_PAGE_SIZE = 20
 | 
			
		||||
@@ -84,7 +83,7 @@ class Controller(object):
 | 
			
		||||
 | 
			
		||||
        for param, value in filters.items():
 | 
			
		||||
            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)
 | 
			
		||||
        for task in paginate(url):
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
module=apiclient
 | 
			
		||||
module=gettextutils
 | 
			
		||||
module=importutils
 | 
			
		||||
module=strutils
 | 
			
		||||
module=uuidutils
 | 
			
		||||
 | 
			
		||||
# The base module to hold the copy of openstack.common
 | 
			
		||||
base=glanceclient
 | 
			
		||||
 
 | 
			
		||||
@@ -97,11 +97,11 @@ class TestClient(testtools.TestCase):
 | 
			
		||||
        # when creating the http client, the session headers don't contain
 | 
			
		||||
        # the X-Auth-Token key.
 | 
			
		||||
        identity_headers = {
 | 
			
		||||
            'X-User-Id': 'user',
 | 
			
		||||
            'X-Tenant-Id': 'tenant',
 | 
			
		||||
            'X-Roles': 'roles',
 | 
			
		||||
            'X-Identity-Status': 'Confirmed',
 | 
			
		||||
            'X-Service-Catalog': 'service_catalog',
 | 
			
		||||
            b'X-User-Id': b'user',
 | 
			
		||||
            b'X-Tenant-Id': b'tenant',
 | 
			
		||||
            b'X-Roles': b'roles',
 | 
			
		||||
            b'X-Identity-Status': b'Confirmed',
 | 
			
		||||
            b'X-Service-Catalog': b'service_catalog',
 | 
			
		||||
        }
 | 
			
		||||
        kwargs = {'identity_headers': identity_headers}
 | 
			
		||||
        http_client = http.HTTPClient(self.endpoint, **kwargs)
 | 
			
		||||
@@ -165,10 +165,7 @@ class TestClient(testtools.TestCase):
 | 
			
		||||
        value = u'ni\xf1o'
 | 
			
		||||
        headers = {"test": value}
 | 
			
		||||
        encoded = self.client.encode_headers(headers)
 | 
			
		||||
        if six.PY2:
 | 
			
		||||
            self.assertEqual("ni\xc3\xb1o", encoded["test"])
 | 
			
		||||
        else:
 | 
			
		||||
            self.assertEqual(value, encoded["test"])
 | 
			
		||||
        self.assertEqual(b"ni\xc3\xb1o", encoded[b"test"])
 | 
			
		||||
 | 
			
		||||
    def test_raw_request(self):
 | 
			
		||||
        " Verify the path being used for HTTP requests reflects accurately. "
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@
 | 
			
		||||
 | 
			
		||||
import errno
 | 
			
		||||
 | 
			
		||||
import six
 | 
			
		||||
import testtools
 | 
			
		||||
 | 
			
		||||
from glanceclient import exc
 | 
			
		||||
@@ -529,10 +528,7 @@ class TestController(testtools.TestCase):
 | 
			
		||||
            #   /v2/images?owner=ni%C3%B1o&limit=20
 | 
			
		||||
            # We just want to make sure filters are correctly encoded.
 | 
			
		||||
            pass
 | 
			
		||||
        if six.PY2:
 | 
			
		||||
            self.assertEqual("ni\xc3\xb1o", filters["owner"])
 | 
			
		||||
        else:
 | 
			
		||||
            self.assertEqual("ni\xf1o", filters["owner"])
 | 
			
		||||
        self.assertEqual(b"ni\xc3\xb1o", filters["owner"])
 | 
			
		||||
 | 
			
		||||
    def test_list_images_for_tag_single_image(self):
 | 
			
		||||
        img_id = '3a4560a1-e585-443e-9b39-553b46ec92d1'
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@
 | 
			
		||||
#    License for the specific language governing permissions and limitations
 | 
			
		||||
#    under the License.
 | 
			
		||||
 | 
			
		||||
import six
 | 
			
		||||
import testtools
 | 
			
		||||
 | 
			
		||||
from glanceclient.v2 import tasks
 | 
			
		||||
@@ -260,10 +259,7 @@ class TestController(testtools.TestCase):
 | 
			
		||||
            # We just want to make sure filters are correctly encoded.
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
        if six.PY2:
 | 
			
		||||
            self.assertEqual("ni\xc3\xb1o", filters["owner"])
 | 
			
		||||
        else:
 | 
			
		||||
            self.assertEqual("ni\xf1o", filters["owner"])
 | 
			
		||||
        self.assertEqual(b"ni\xc3\xb1o", filters["owner"])
 | 
			
		||||
 | 
			
		||||
    def test_get_task(self):
 | 
			
		||||
        task = self.controller.get('3a4560a1-e585-443e-9b39-553b46ec92d1')
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user