From 392148c7ef6d05cb5fd05d8287af460a6651ee4d Mon Sep 17 00:00:00 2001 From: Andrey Kurilin Date: Wed, 27 Aug 2014 18:08:14 +0300 Subject: [PATCH] Use oslo.utils Modules `strutils`, `timeutils` and `network_utils` from common code are graduated in `oslo.utils`, so we can: 1. remove `novaclient.openstack.common.network_utils` and use `oslo.utils.netutils` instead. 2. use `oslo.utils.encodeutils` and `oslo.utils.strutils` instead of `novaclient.openstack.common.strutils`. 3. use `oslo.utils.timeutils` instead of `novaclient.openstack.common.timeutils`. Additional information: - modules `importutils`, `strutils` and `timeutils` from `novaclient.openstack.common` cannot be removed, because: - importutils is used by apiclient and jsonutils; - strutils is used by apiclient, cliutils and jsonutils; - timeutils is used by jsonutils - additional check for `safe_encode` in Py3 is required, since If91a866d864a22d28a352152beff4c7406a27b7b was merged. Change-Id: Ib8d79d9c85af4916e87a76a1a67a13488ddaa111 --- novaclient/client.py | 4 +- novaclient/openstack/common/network_utils.py | 108 ------------------- novaclient/shell.py | 9 +- novaclient/tests/v1_1/fakes.py | 2 +- novaclient/tests/v1_1/test_shell.py | 7 +- novaclient/tests/v3/fakes.py | 3 +- novaclient/utils.py | 20 +++- novaclient/v1_1/flavors.py | 2 +- novaclient/v1_1/servers.py | 4 +- novaclient/v1_1/shell.py | 7 +- novaclient/v3/images.py | 5 +- novaclient/v3/servers.py | 4 +- novaclient/v3/shell.py | 4 +- openstack-common.conf | 4 - requirements.txt | 1 + 15 files changed, 44 insertions(+), 140 deletions(-) delete mode 100644 novaclient/openstack/common/network_utils.py diff --git a/novaclient/client.py b/novaclient/client.py index 36baffa58..b0d9aea10 100644 --- a/novaclient/client.py +++ b/novaclient/client.py @@ -31,6 +31,7 @@ import re import time from keystoneclient import adapter +from oslo.utils import netutils import requests from requests import adapters @@ -43,7 +44,6 @@ from six.moves.urllib import parse from novaclient import exceptions from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import network_utils from novaclient import service_catalog from novaclient import utils @@ -558,7 +558,7 @@ class HTTPClient(object): extract_token=False) def authenticate(self): - magic_tuple = network_utils.urlsplit(self.auth_url) + magic_tuple = netutils.urlsplit(self.auth_url) scheme, netloc, path, query, frag = magic_tuple port = magic_tuple.port if port is None: diff --git a/novaclient/openstack/common/network_utils.py b/novaclient/openstack/common/network_utils.py deleted file mode 100644 index fa812b29f..000000000 --- a/novaclient/openstack/common/network_utils.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2012 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. - -""" -Network-related utilities and helper functions. -""" - -# TODO(jd) Use six.moves once -# https://bitbucket.org/gutworth/six/pull-request/28 -# is merged -try: - import urllib.parse - SplitResult = urllib.parse.SplitResult -except ImportError: - import urlparse - SplitResult = urlparse.SplitResult - -from six.moves.urllib import parse - - -def parse_host_port(address, default_port=None): - """Interpret a string as a host:port pair. - - An IPv6 address MUST be escaped if accompanied by a port, - because otherwise ambiguity ensues: 2001:db8:85a3::8a2e:370:7334 - means both [2001:db8:85a3::8a2e:370:7334] and - [2001:db8:85a3::8a2e:370]:7334. - - >>> parse_host_port('server01:80') - ('server01', 80) - >>> parse_host_port('server01') - ('server01', None) - >>> parse_host_port('server01', default_port=1234) - ('server01', 1234) - >>> parse_host_port('[::1]:80') - ('::1', 80) - >>> parse_host_port('[::1]') - ('::1', None) - >>> parse_host_port('[::1]', default_port=1234) - ('::1', 1234) - >>> parse_host_port('2001:db8:85a3::8a2e:370:7334', default_port=1234) - ('2001:db8:85a3::8a2e:370:7334', 1234) - - """ - if address[0] == '[': - # Escaped ipv6 - _host, _port = address[1:].split(']') - host = _host - if ':' in _port: - port = _port.split(':')[1] - else: - port = default_port - else: - if address.count(':') == 1: - host, port = address.split(':') - else: - # 0 means ipv4, >1 means ipv6. - # We prohibit unescaped ipv6 addresses with port. - host = address - port = default_port - - return (host, None if port is None else int(port)) - - -class ModifiedSplitResult(SplitResult): - """Split results class for urlsplit.""" - - # NOTE(dims): The functions below are needed for Python 2.6.x. - # We can remove these when we drop support for 2.6.x. - @property - def hostname(self): - netloc = self.netloc.split('@', 1)[-1] - host, port = parse_host_port(netloc) - return host - - @property - def port(self): - netloc = self.netloc.split('@', 1)[-1] - host, port = parse_host_port(netloc) - return port - - -def urlsplit(url, scheme='', allow_fragments=True): - """Parse a URL using urlparse.urlsplit(), splitting query and fragments. - This function papers over Python issue9374 when needed. - - The parameters are the same as urlparse.urlsplit. - """ - scheme, netloc, path, query, fragment = parse.urlsplit( - url, scheme, allow_fragments) - if allow_fragments and '#' in path: - path, fragment = path.split('#', 1) - if '?' in path: - path, query = path.split('?', 1) - return ModifiedSplitResult(scheme, netloc, - path, query, fragment) diff --git a/novaclient/shell.py b/novaclient/shell.py index 7e9be0bf2..6623b7fbf 100644 --- a/novaclient/shell.py +++ b/novaclient/shell.py @@ -29,6 +29,8 @@ import os import pkgutil import sys +from oslo.utils import encodeutils +from oslo.utils import strutils import pkg_resources import six @@ -47,7 +49,6 @@ from novaclient import exceptions as exc import novaclient.extension from novaclient.openstack.common import cliutils from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils from novaclient import utils from novaclient.v1_1 import shell as shell_v1_1 from novaclient.v3 import shell as shell_v3 @@ -795,13 +796,13 @@ class OpenStackHelpFormatter(argparse.HelpFormatter): def main(): try: - argv = [strutils.safe_decode(a) for a in sys.argv[1:]] + argv = [encodeutils.safe_decode(a) for a in sys.argv[1:]] OpenStackComputeShell().main(argv) except Exception as e: logger.debug(e, exc_info=1) - details = {'name': strutils.safe_encode(e.__class__.__name__), - 'msg': strutils.safe_encode(six.text_type(e))} + details = {'name': encodeutils.safe_encode(e.__class__.__name__), + 'msg': encodeutils.safe_encode(six.text_type(e))} print("ERROR (%(name)s): %(msg)s" % details, file=sys.stderr) sys.exit(1) diff --git a/novaclient/tests/v1_1/fakes.py b/novaclient/tests/v1_1/fakes.py index afd043bae..c431464b4 100644 --- a/novaclient/tests/v1_1/fakes.py +++ b/novaclient/tests/v1_1/fakes.py @@ -16,12 +16,12 @@ import datetime +from oslo.utils import strutils import six from six.moves.urllib import parse from novaclient import client as base_client from novaclient import exceptions -from novaclient.openstack.common import strutils from novaclient.tests import fakes from novaclient.tests import utils from novaclient.v1_1 import client diff --git a/novaclient/tests/v1_1/test_shell.py b/novaclient/tests/v1_1/test_shell.py index ab9d0595b..4bcd7f7aa 100644 --- a/novaclient/tests/v1_1/test_shell.py +++ b/novaclient/tests/v1_1/test_shell.py @@ -22,6 +22,7 @@ import os import fixtures import mock +from oslo.utils import timeutils import six from six.moves import builtins @@ -1232,9 +1233,9 @@ class ShellTest(utils.TestCase): 'end=2005-02-01T00:00:00&' + 'detailed=1') - @mock.patch('novaclient.openstack.common.timeutils.utcnow') - def test_usage_list_no_args(self, mock_utcnow): - mock_utcnow.return_value = datetime.datetime(2005, 2, 1, 0, 0) + def test_usage_list_no_args(self): + timeutils.set_time_override(datetime.datetime(2005, 2, 1, 0, 0)) + self.addCleanup(timeutils.clear_time_override) self.run_command('usage-list') self.assert_called('GET', '/os-simple-tenant-usage?' + diff --git a/novaclient/tests/v3/fakes.py b/novaclient/tests/v3/fakes.py index 854545d7e..23f1e7cbd 100644 --- a/novaclient/tests/v3/fakes.py +++ b/novaclient/tests/v3/fakes.py @@ -16,7 +16,8 @@ import datetime -from novaclient.openstack.common import strutils +from oslo.utils import strutils + from novaclient.tests import fakes from novaclient.tests.v1_1 import fakes as fakes_v1_1 from novaclient.v3 import client diff --git a/novaclient/utils.py b/novaclient/utils.py index 8600cab05..d6068ba0c 100644 --- a/novaclient/utils.py +++ b/novaclient/utils.py @@ -17,6 +17,7 @@ import sys import textwrap import uuid +from oslo.utils import encodeutils import pkg_resources import prettytable import six @@ -25,7 +26,6 @@ from novaclient import exceptions from novaclient.openstack.common import cliutils from novaclient.openstack.common.gettextutils import _ from novaclient.openstack.common import jsonutils -from novaclient.openstack.common import strutils arg = cliutils.arg @@ -127,9 +127,12 @@ def print_list(objs, fields, formatters={}, sortby_index=None): pt.add_row(row) if sortby is not None: - result = strutils.safe_encode(pt.get_string(sortby=sortby)) + result = encodeutils.safe_encode(pt.get_string(sortby=sortby)) else: - result = strutils.safe_encode(pt.get_string()) + result = encodeutils.safe_encode(pt.get_string()) + + if six.PY3: + result = result.decode() print(result) @@ -197,7 +200,10 @@ def print_dict(d, dict_property="Property", dict_value="Value", wrap=0): v = '-' pt.add_row([k, v]) - result = strutils.safe_encode(pt.get_string()) + result = encodeutils.safe_encode(pt.get_string()) + + if six.PY3: + result = result.decode() print(result) @@ -219,7 +225,11 @@ def find_resource(manager, name_or_id, **find_args): # now try to get entity as uuid try: - tmp_id = strutils.safe_encode(name_or_id) + tmp_id = encodeutils.safe_encode(name_or_id) + + if six.PY3: + tmp_id = tmp_id.decode() + uuid.UUID(tmp_id) return manager.get(tmp_id) except (TypeError, ValueError, exceptions.NotFound): diff --git a/novaclient/v1_1/flavors.py b/novaclient/v1_1/flavors.py index 30536fc68..e66e0b9e2 100644 --- a/novaclient/v1_1/flavors.py +++ b/novaclient/v1_1/flavors.py @@ -16,12 +16,12 @@ Flavor interface. """ +from oslo.utils import strutils from six.moves.urllib import parse from novaclient import base from novaclient import exceptions from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils from novaclient import utils diff --git a/novaclient/v1_1/servers.py b/novaclient/v1_1/servers.py index 2a28431af..d1ced5218 100644 --- a/novaclient/v1_1/servers.py +++ b/novaclient/v1_1/servers.py @@ -21,13 +21,13 @@ Server interface. import base64 +from oslo.utils import encodeutils import six from six.moves.urllib import parse from novaclient import base from novaclient import crypto from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils from novaclient.v1_1 import security_groups @@ -454,7 +454,7 @@ class ServerManager(base.BootingManagerWithFind): if six.PY3: userdata = userdata.encode("utf-8") else: - userdata = strutils.safe_encode(userdata) + userdata = encodeutils.safe_encode(userdata) userdata_b64 = base64.b64encode(userdata).decode('utf-8') body["server"]["user_data"] = userdata_b64 diff --git a/novaclient/v1_1/shell.py b/novaclient/v1_1/shell.py index 4a11340bf..0dcf29615 100644 --- a/novaclient/v1_1/shell.py +++ b/novaclient/v1_1/shell.py @@ -28,12 +28,13 @@ import os import sys import time +from oslo.utils import encodeutils +from oslo.utils import strutils +from oslo.utils import timeutils import six from novaclient import exceptions from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils -from novaclient.openstack.common import timeutils from novaclient.openstack.common import uuidutils from novaclient import utils from novaclient.v1_1 import availability_zones @@ -2301,7 +2302,7 @@ def _print_secgroups(secgroups): def _get_secgroup(cs, secgroup): # Check secgroup is an ID (nova-network) or UUID (neutron) - if (utils.is_integer_like(strutils.safe_encode(secgroup)) + if (utils.is_integer_like(encodeutils.safe_encode(secgroup)) or uuidutils.is_uuid_like(secgroup)): try: return cs.security_groups.get(secgroup) diff --git a/novaclient/v3/images.py b/novaclient/v3/images.py index b78d9af55..7bc3d584c 100644 --- a/novaclient/v3/images.py +++ b/novaclient/v3/images.py @@ -17,10 +17,11 @@ Image interface. """ +from oslo.utils import encodeutils +from oslo.utils import strutils from six.moves.urllib import parse from novaclient import base -from novaclient.openstack.common import strutils class Image(base.Resource): @@ -51,7 +52,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 headers.items(): value = safe_decode(value, incoming='utf-8') if key.startswith('x-image-meta-property-'): diff --git a/novaclient/v3/servers.py b/novaclient/v3/servers.py index 2d58650bc..226cf92a1 100644 --- a/novaclient/v3/servers.py +++ b/novaclient/v3/servers.py @@ -21,13 +21,13 @@ Server interface. import base64 +from oslo.utils import encodeutils import six from six.moves.urllib import parse from novaclient import base from novaclient import crypto from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils REBOOT_SOFT, REBOOT_HARD = 'SOFT', 'HARD' @@ -402,7 +402,7 @@ class ServerManager(base.BootingManagerWithFind): if six.PY3: userdata = userdata.encode("utf-8") else: - userdata = strutils.safe_encode(userdata) + userdata = encodeutils.safe_encode(userdata) data = base64.b64encode(userdata).decode('utf-8') body["server"]["os-user-data:user_data"] = data diff --git a/novaclient/v3/shell.py b/novaclient/v3/shell.py index 18243412d..832b45d51 100644 --- a/novaclient/v3/shell.py +++ b/novaclient/v3/shell.py @@ -27,12 +27,12 @@ import os import sys import time +from oslo.utils import strutils +from oslo.utils import timeutils import six from novaclient import exceptions from novaclient.openstack.common.gettextutils import _ -from novaclient.openstack.common import strutils -from novaclient.openstack.common import timeutils from novaclient.openstack.common import uuidutils from novaclient import utils from novaclient.v3 import availability_zones diff --git a/openstack-common.conf b/openstack-common.conf index f21e5b551..3842ed9ba 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -5,11 +5,7 @@ module=apiclient module=cliutils module=gettextutils module=install_venv_common -module=importutils module=jsonutils -module=network_utils -module=strutils -module=timeutils module=uuidutils # The base module to hold the copy of openstack.common diff --git a/requirements.txt b/requirements.txt index 784d52aa5..1c7e8be4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ pbr>=0.6,!=0.7,<1.0 argparse iso8601>=0.1.9 +oslo.utils>=0.2.0 # Apache-2.0 PrettyTable>=0.7,<0.8 requests>=1.2.1 simplejson>=2.0.9