Use oslo.utils and oslo.serialization

Left timeutils and strutils in openstack/common since they are used in
openstack/common/apiclient and memorycache.

Change-Id: Idb5f09c159d907dfba84cd1f7501f650318af7d9
This commit is contained in:
Steve Martinelli
2014-10-14 17:49:17 -04:00
parent 89dc951f7d
commit 802301ca17
33 changed files with 56 additions and 249 deletions

View File

@@ -17,7 +17,8 @@
import datetime
from keystoneclient.openstack.common import timeutils
from oslo.utils import timeutils
from keystoneclient import service_catalog

View File

@@ -10,7 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from keystoneclient.openstack.common import jsonutils
from oslo.serialization import jsonutils
from keystoneclient import utils

View File

@@ -10,7 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from keystoneclient.openstack.common import timeutils
from oslo.utils import timeutils
# The set of attributes common between the RevokeEvent
# and the dictionaries created from the token Data.

View File

@@ -12,7 +12,8 @@
import datetime
from keystoneclient.openstack.common import timeutils
from oslo.utils import timeutils
from keystoneclient import utils
__all__ = ['DiscoveryList',

View File

@@ -13,8 +13,9 @@
import datetime
import uuid
from oslo.utils import timeutils
from keystoneclient.fixture import exception
from keystoneclient.openstack.common import timeutils
class _Service(dict):

View File

@@ -13,8 +13,9 @@
import datetime
import uuid
from oslo.utils import timeutils
from keystoneclient.fixture import exception
from keystoneclient.openstack.common import timeutils
class _Service(dict):

View File

@@ -21,6 +21,7 @@ OpenStack Client interface. Handles the REST calls and responses.
import logging
from oslo.serialization import jsonutils
import pkg_resources
import requests
from six.moves.urllib import parse as urlparse
@@ -54,7 +55,6 @@ from keystoneclient import access
from keystoneclient.auth import base
from keystoneclient import baseclient
from keystoneclient import exceptions
from keystoneclient.openstack.common import jsonutils
from keystoneclient import session as client_session
from keystoneclient import utils

View File

@@ -155,6 +155,8 @@ import time
import netaddr
from oslo.config import cfg
from oslo.serialization import jsonutils
from oslo.utils import timeutils
import requests
import six
from six.moves import urllib
@@ -163,9 +165,7 @@ from keystoneclient import access
from keystoneclient.common import cms
from keystoneclient import exceptions
from keystoneclient.middleware import memcache_crypt
from keystoneclient.openstack.common import jsonutils
from keystoneclient.openstack.common import memorycache
from keystoneclient.openstack.common import timeutils
# alternative middleware configuration in the main application's

View File

@@ -33,13 +33,12 @@ This WSGI component:
import logging
from oslo.serialization import jsonutils
import requests
import six
from six.moves import urllib
import webob
from keystoneclient.openstack.common import jsonutils
PROTOCOL_NAME = 'S3 Token Authentication'

View File

@@ -1,202 +0,0 @@
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# Copyright 2011 Justin Santa Barbara
# 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.
'''
JSON related utilities.
This module provides a few things:
1) A handy function for getting an object down to something that can be
JSON serialized. See to_primitive().
2) Wrappers around loads() and dumps(). The dumps() wrapper will
automatically use to_primitive() for you if needed.
3) This sets up anyjson to use the loads() and dumps() wrappers if anyjson
is available.
'''
import codecs
import datetime
import functools
import inspect
import itertools
import sys
is_simplejson = False
if sys.version_info < (2, 7):
# On Python <= 2.6, json module is not C boosted, so try to use
# simplejson module if available
try:
import simplejson as json
# NOTE(mriedem): Make sure we have a new enough version of simplejson
# to support the namedobject_as_tuple argument. This can be removed
# in the Kilo release when python 2.6 support is dropped.
if 'namedtuple_as_object' in inspect.getargspec(json.dumps).args:
is_simplejson = True
else:
import json
except ImportError:
import json
else:
import json
import six
import six.moves.xmlrpc_client as xmlrpclib
from keystoneclient.openstack.common import gettextutils
from keystoneclient.openstack.common import importutils
from keystoneclient.openstack.common import strutils
from keystoneclient.openstack.common import timeutils
netaddr = importutils.try_import("netaddr")
_nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod,
inspect.isfunction, inspect.isgeneratorfunction,
inspect.isgenerator, inspect.istraceback, inspect.isframe,
inspect.iscode, inspect.isbuiltin, inspect.isroutine,
inspect.isabstract]
_simple_types = (six.string_types + six.integer_types
+ (type(None), bool, float))
def to_primitive(value, convert_instances=False, convert_datetime=True,
level=0, max_depth=3):
"""Convert a complex object into primitives.
Handy for JSON serialization. We can optionally handle instances,
but since this is a recursive function, we could have cyclical
data structures.
To handle cyclical data structures we could track the actual objects
visited in a set, but not all objects are hashable. Instead we just
track the depth of the object inspections and don't go too deep.
Therefore, convert_instances=True is lossy ... be aware.
"""
# handle obvious types first - order of basic types determined by running
# full tests on nova project, resulting in the following counts:
# 572754 <type 'NoneType'>
# 460353 <type 'int'>
# 379632 <type 'unicode'>
# 274610 <type 'str'>
# 199918 <type 'dict'>
# 114200 <type 'datetime.datetime'>
# 51817 <type 'bool'>
# 26164 <type 'list'>
# 6491 <type 'float'>
# 283 <type 'tuple'>
# 19 <type 'long'>
if isinstance(value, _simple_types):
return value
if isinstance(value, datetime.datetime):
if convert_datetime:
return timeutils.strtime(value)
else:
return value
# value of itertools.count doesn't get caught by nasty_type_tests
# and results in infinite loop when list(value) is called.
if type(value) == itertools.count:
return six.text_type(value)
# FIXME(vish): Workaround for LP bug 852095. Without this workaround,
# tests that raise an exception in a mocked method that
# has a @wrap_exception with a notifier will fail. If
# we up the dependency to 0.5.4 (when it is released) we
# can remove this workaround.
if getattr(value, '__module__', None) == 'mox':
return 'mock'
if level > max_depth:
return '?'
# The try block may not be necessary after the class check above,
# but just in case ...
try:
recursive = functools.partial(to_primitive,
convert_instances=convert_instances,
convert_datetime=convert_datetime,
level=level,
max_depth=max_depth)
if isinstance(value, dict):
return dict((k, recursive(v)) for k, v in six.iteritems(value))
elif isinstance(value, (list, tuple)):
return [recursive(lv) for lv in value]
# It's not clear why xmlrpclib created their own DateTime type, but
# for our purposes, make it a datetime type which is explicitly
# handled
if isinstance(value, xmlrpclib.DateTime):
value = datetime.datetime(*tuple(value.timetuple())[:6])
if convert_datetime and isinstance(value, datetime.datetime):
return timeutils.strtime(value)
elif isinstance(value, gettextutils.Message):
return value.data
elif hasattr(value, 'iteritems'):
return recursive(dict(value.iteritems()), level=level + 1)
elif hasattr(value, '__iter__'):
return recursive(list(value))
elif convert_instances and hasattr(value, '__dict__'):
# Likely an instance of something. Watch for cycles.
# Ignore class member vars.
return recursive(value.__dict__, level=level + 1)
elif netaddr and isinstance(value, netaddr.IPAddress):
return six.text_type(value)
else:
if any(test(value) for test in _nasty_type_tests):
return six.text_type(value)
return value
except TypeError:
# Class objects are tricky since they may define something like
# __iter__ defined but it isn't callable as list().
return six.text_type(value)
def dumps(value, default=to_primitive, **kwargs):
if is_simplejson:
kwargs['namedtuple_as_object'] = False
return json.dumps(value, default=default, **kwargs)
def dump(obj, fp, *args, **kwargs):
if is_simplejson:
kwargs['namedtuple_as_object'] = False
return json.dump(obj, fp, *args, **kwargs)
def loads(s, encoding='utf-8', **kwargs):
return json.loads(strutils.safe_decode(s, encoding), **kwargs)
def load(fp, encoding='utf-8', **kwargs):
return json.load(codecs.getreader(encoding)(fp), **kwargs)
try:
import anyjson
except ImportError:
pass
else:
anyjson._modules.append((__name__, 'dumps', TypeError,
'loads', ValueError, 'load'))
anyjson.force_implementation(__name__)

View File

@@ -18,13 +18,13 @@ import os
import time
from oslo.config import cfg
from oslo.serialization import jsonutils
from oslo.utils import importutils
import requests
import six
from six.moves import urllib
from keystoneclient import exceptions
from keystoneclient.openstack.common import importutils
from keystoneclient.openstack.common import jsonutils
from keystoneclient import utils
osprofiler_web = importutils.try_import("osprofiler.web")

View File

@@ -30,6 +30,7 @@ import logging
import os
import sys
from oslo.utils import encodeutils
import six
import keystoneclient
@@ -37,7 +38,6 @@ from keystoneclient import access
from keystoneclient.contrib.bootstrap import shell as shell_bootstrap
from keystoneclient import exceptions as exc
from keystoneclient.generic import shell as shell_generic
from keystoneclient.openstack.common import strutils
from keystoneclient import session
from keystoneclient import utils
from keystoneclient.v2_0 import shell as shell_v2_0
@@ -463,7 +463,7 @@ def main():
OpenStackIdentityShell().main(sys.argv[1:])
except Exception as e:
print(strutils.safe_encode(six.text_type(e)), file=sys.stderr)
print(encodeutils.safe_encode(six.text_type(e)), file=sys.stderr)
sys.exit(1)

View File

@@ -14,6 +14,7 @@ import abc
import datetime
import uuid
from oslo.utils import timeutils
import six
from keystoneclient import access
@@ -21,7 +22,6 @@ from keystoneclient.auth import base
from keystoneclient.auth.identity import v2
from keystoneclient.auth.identity import v3
from keystoneclient import fixture
from keystoneclient.openstack.common import timeutils
from keystoneclient import session
from keystoneclient.tests import utils

View File

@@ -15,12 +15,12 @@
import os
import fixtures
from oslo.serialization import jsonutils
from oslo.utils import timeutils
import six
import testresources
from keystoneclient.common import cms
from keystoneclient.openstack.common import jsonutils
from keystoneclient.openstack.common import timeutils
from keystoneclient import utils

View File

@@ -13,8 +13,9 @@
# License for the specific language governing permissions and limitations
# under the License.
from oslo.serialization import jsonutils
from keystoneclient.generic import client
from keystoneclient.openstack.common import jsonutils
from keystoneclient.tests import utils
BASE_HOST = 'http://keystone.example.com'

View File

@@ -25,6 +25,8 @@ import uuid
import fixtures
import iso8601
import mock
from oslo.serialization import jsonutils
from oslo.utils import timeutils
from requests_mock.contrib import fixture as mock_fixture
from six.moves.urllib import parse as urlparse
import testresources
@@ -37,9 +39,7 @@ from keystoneclient.common import cms
from keystoneclient import exceptions
from keystoneclient import fixture
from keystoneclient.middleware import auth_token
from keystoneclient.openstack.common import jsonutils
from keystoneclient.openstack.common import memorycache
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests import client_fixtures
from keystoneclient.tests import utils
@@ -1759,7 +1759,7 @@ class TokenExpirationTest(BaseAuthTokenMiddlewareTest):
auth_token.confirm_token_not_expired,
data)
@mock.patch('keystoneclient.openstack.common.timeutils.utcnow')
@mock.patch('oslo.utils.timeutils.utcnow')
def test_v2_token_with_timezone_offset_not_expired(self, mock_utcnow):
current_time = timeutils.parse_isotime('2000-01-01T00:01:10.000123Z')
current_time = timeutils.normalize_time(current_time)
@@ -1770,7 +1770,7 @@ class TokenExpirationTest(BaseAuthTokenMiddlewareTest):
actual_expires = auth_token.confirm_token_not_expired(data)
self.assertEqual(actual_expires, expected_expires)
@mock.patch('keystoneclient.openstack.common.timeutils.utcnow')
@mock.patch('oslo.utils.timeutils.utcnow')
def test_v2_token_with_timezone_offset_expired(self, mock_utcnow):
current_time = timeutils.parse_isotime('2000-01-01T00:01:10.000123Z')
current_time = timeutils.normalize_time(current_time)
@@ -1794,7 +1794,7 @@ class TokenExpirationTest(BaseAuthTokenMiddlewareTest):
auth_token.confirm_token_not_expired,
data)
@mock.patch('keystoneclient.openstack.common.timeutils.utcnow')
@mock.patch('oslo.utils.timeutils.utcnow')
def test_v3_token_with_timezone_offset_not_expired(self, mock_utcnow):
current_time = timeutils.parse_isotime('2000-01-01T00:01:10.000123Z')
current_time = timeutils.normalize_time(current_time)
@@ -1806,7 +1806,7 @@ class TokenExpirationTest(BaseAuthTokenMiddlewareTest):
actual_expires = auth_token.confirm_token_not_expired(data)
self.assertEqual(actual_expires, expected_expires)
@mock.patch('keystoneclient.openstack.common.timeutils.utcnow')
@mock.patch('oslo.utils.timeutils.utcnow')
def test_v3_token_with_timezone_offset_expired(self, mock_utcnow):
current_time = timeutils.parse_isotime('2000-01-01T00:01:10.000123Z')
current_time = timeutils.normalize_time(current_time)

View File

@@ -13,6 +13,7 @@
import re
import uuid
from oslo.serialization import jsonutils
import six
from testtools import matchers
@@ -22,7 +23,6 @@ from keystoneclient import client
from keystoneclient import discover
from keystoneclient import exceptions
from keystoneclient import fixture
from keystoneclient.openstack.common import jsonutils
from keystoneclient import session
from keystoneclient.tests import utils
from keystoneclient.v2_0 import client as v2_client

View File

@@ -13,10 +13,10 @@
import datetime
import mock
from oslo.utils import timeutils
from keystoneclient import access
from keystoneclient import httpclient
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests import utils
from keystoneclient.tests.v2_0 import client_fixtures

View File

@@ -13,13 +13,13 @@
# under the License.
import mock
from oslo.serialization import jsonutils
import requests
import six
import testtools
import webob
from keystoneclient.middleware import s3_token
from keystoneclient.openstack.common import jsonutils
from keystoneclient.tests import utils

View File

@@ -17,6 +17,7 @@ import uuid
import mock
from oslo.config import cfg
from oslo.config import fixture as config
from oslo.serialization import jsonutils
import requests
import six
from testtools import matchers
@@ -24,7 +25,6 @@ from testtools import matchers
from keystoneclient import adapter
from keystoneclient.auth import base
from keystoneclient import exceptions
from keystoneclient.openstack.common import jsonutils
from keystoneclient import session as client_session
from keystoneclient.tests import utils

View File

@@ -18,14 +18,13 @@ import uuid
import fixtures
import mock
from mox3 import mox
from oslo.serialization import jsonutils
import requests
from requests_mock.contrib import fixture
import six
from six.moves.urllib import parse as urlparse
import testtools
from keystoneclient.openstack.common import jsonutils
class TestCase(testtools.TestCase):

View File

@@ -13,11 +13,11 @@
import datetime
import uuid
from oslo.utils import timeutils
import testresources
from keystoneclient import access
from keystoneclient import fixture
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests import client_fixtures as token_data
from keystoneclient.tests.v2_0 import client_fixtures
from keystoneclient.tests.v2_0 import utils

View File

@@ -13,9 +13,10 @@
import copy
import datetime
from oslo.serialization import jsonutils
from oslo.utils import timeutils
from keystoneclient import exceptions
from keystoneclient.openstack.common import jsonutils
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests.v2_0 import utils
from keystoneclient.v2_0 import client

View File

@@ -13,9 +13,10 @@
import datetime
import uuid
from oslo.utils import timeutils
from keystoneclient import access
from keystoneclient import fixture
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests.v3 import client_fixtures
from keystoneclient.tests.v3 import utils

View File

@@ -10,8 +10,9 @@
# License for the specific language governing permissions and limitations
# under the License.
from oslo.serialization import jsonutils
from keystoneclient import exceptions
from keystoneclient.openstack.common import jsonutils
from keystoneclient.tests.v3 import utils
from keystoneclient.v3 import client

View File

@@ -14,11 +14,11 @@
import uuid
import mock
from oslo.utils import timeutils
import six
from six.moves.urllib import parse as urlparse
from testtools import matchers
from keystoneclient.openstack.common import timeutils
from keystoneclient import session
from keystoneclient.tests.v3 import client_fixtures
from keystoneclient.tests.v3 import utils

View File

@@ -13,8 +13,9 @@
import uuid
from oslo.utils import timeutils
from keystoneclient import exceptions
from keystoneclient.openstack.common import timeutils
from keystoneclient.tests.v3 import utils
from keystoneclient.v3.contrib import trusts

View File

@@ -17,11 +17,11 @@ import inspect
import logging
import sys
from oslo.utils import encodeutils
import prettytable
import six
from keystoneclient import exceptions
from keystoneclient.openstack.common import strutils
logger = logging.getLogger(__name__)
@@ -61,7 +61,7 @@ def print_list(objs, fields, formatters={}, order_by=None):
if order_by is None:
order_by = fields[0]
encoded = strutils.safe_encode(pt.get_string(sortby=order_by))
encoded = encodeutils.safe_encode(pt.get_string(sortby=order_by))
if six.PY3:
encoded = encoded.decode()
print(encoded)
@@ -88,7 +88,7 @@ def print_dict(d, wrap=0):
value = ''
value = _word_wrap(value, max_length=wrap)
pt.add_row([prop, value])
encoded = strutils.safe_encode(pt.get_string(sortby='Property'))
encoded = encodeutils.safe_encode(pt.get_string(sortby='Property'))
if six.PY3:
encoded = encoded.decode()
print(encoded)

View File

@@ -26,9 +26,9 @@ import argparse
import getpass
import sys
from oslo.utils import strutils
import six
from keystoneclient.openstack.common import strutils
from keystoneclient import utils
from keystoneclient.v2_0 import client

View File

@@ -15,10 +15,11 @@
import logging
from oslo.serialization import jsonutils
from keystoneclient.auth.identity import v3 as v3_auth
from keystoneclient import exceptions
from keystoneclient import httpclient
from keystoneclient.openstack.common import jsonutils
from keystoneclient.v3.contrib import endpoint_filter
from keystoneclient.v3.contrib import endpoint_policy
from keystoneclient.v3.contrib import federation

View File

@@ -10,9 +10,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from oslo.utils import timeutils
from keystoneclient import base
from keystoneclient import exceptions
from keystoneclient.openstack.common import timeutils
class Trust(base.Resource):

View File

@@ -3,10 +3,7 @@
# The list of modules to copy from oslo-incubator
module=apiclient
module=install_venv_common
module=jsonutils
module=memorycache
module=strutils
module=timeutils
# The base module to hold the copy of openstack.common
base=keystoneclient

View File

@@ -9,6 +9,8 @@ Babel>=1.3
iso8601>=0.1.9
netaddr>=0.7.12
oslo.config>=1.4.0 # Apache-2.0
oslo.serialization>=1.0.0 # Apache-2.0
oslo.utils>=1.0.0 # Apache-2.0
PrettyTable>=0.7,<0.8
requests>=1.2.1,!=2.4.0
six>=1.7.0