From c4c44bcb2df01b77089139b267b1219008f9421e Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 20 Feb 2020 09:42:03 +0000 Subject: [PATCH] Remove six Mostly a find-replace job. Let's do this now so we don't have to carry it for the next decade. Change-Id: I7bef9fb7c6895f746cee1aca6522786f38b9857c Signed-off-by: Stephen Finucane --- lower-constraints.txt | 1 - novaclient/base.py | 25 +- novaclient/crypto.py | 4 +- novaclient/shell.py | 8 +- novaclient/tests/functional/test_auth.py | 3 +- .../functional/v2/legacy/test_hypervisors.py | 4 +- .../functional/v2/test_device_tagging.py | 5 +- .../functional/v2/test_instance_action.py | 3 +- novaclient/tests/unit/fixture_data/base.py | 3 +- .../tests/unit/fixture_data/hypervisors.py | 3 +- novaclient/tests/unit/test_base.py | 12 - novaclient/tests/unit/test_shell.py | 26 +- novaclient/tests/unit/test_utils.py | 44 ++- novaclient/tests/unit/utils.py | 5 +- novaclient/tests/unit/v2/fakes.py | 267 +++++++++--------- .../tests/unit/v2/test_availability_zone.py | 27 +- novaclient/tests/unit/v2/test_hypervisors.py | 4 +- novaclient/tests/unit/v2/test_migrations.py | 8 +- novaclient/tests/unit/v2/test_servers.py | 50 ++-- novaclient/tests/unit/v2/test_shell.py | 52 ++-- novaclient/tests/unit/v2/test_usage.py | 6 +- novaclient/tests/unit/v2/test_volumes.py | 3 +- novaclient/utils.py | 22 +- novaclient/v2/hypervisors.py | 6 +- novaclient/v2/instance_usage_audit_log.py | 6 +- novaclient/v2/servers.py | 27 +- novaclient/v2/services.py | 7 +- novaclient/v2/shell.py | 13 +- novaclient/v2/versions.py | 4 +- requirements.txt | 1 - 30 files changed, 278 insertions(+), 371 deletions(-) diff --git a/lower-constraints.txt b/lower-constraints.txt index b87fcaf0e..72fdac0e6 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -91,7 +91,6 @@ requestsexceptions==1.2.0 rfc3986==0.3.1 Routes==2.3.1 simplejson==3.5.1 -six==1.10.0 smmap==0.9.0 statsd==3.2.1 stevedore==1.20.0 diff --git a/novaclient/base.py b/novaclient/base.py index 821e19bd9..48c06f372 100644 --- a/novaclient/base.py +++ b/novaclient/base.py @@ -29,7 +29,6 @@ import threading from oslo_utils import reflection from oslo_utils import strutils import requests -import six from novaclient import exceptions from novaclient import utils @@ -388,12 +387,9 @@ class Manager(HookableMixin): return StrWithMeta(body, resp) def convert_into_with_meta(self, item, resp): - if isinstance(item, six.string_types): - if six.PY2 and isinstance(item, six.text_type): - return UnicodeWithMeta(item, resp) - else: - return StrWithMeta(item, resp) - elif isinstance(item, six.binary_type): + if isinstance(item, str): + return StrWithMeta(item, resp) + elif isinstance(item, bytes): return BytesWithMeta(item, resp) elif isinstance(item, list): return ListWithMeta(item, resp) @@ -405,8 +401,7 @@ class Manager(HookableMixin): return DictWithMeta(item, resp) -@six.add_metaclass(abc.ABCMeta) -class ManagerWithFind(Manager): +class ManagerWithFind(Manager, metaclass=abc.ABCMeta): """Like a `Manager`, but with additional `find()`/`findall()` methods.""" @abc.abstractmethod @@ -560,20 +555,10 @@ class StrWithMeta(str, RequestIdMixin): self.append_request_ids(resp) -class BytesWithMeta(six.binary_type, RequestIdMixin): +class BytesWithMeta(bytes, RequestIdMixin): def __new__(cls, value, resp): return super(BytesWithMeta, cls).__new__(cls, value) def __init__(self, values, resp): self.request_ids_setup() self.append_request_ids(resp) - - -if six.PY2: - class UnicodeWithMeta(six.text_type, RequestIdMixin): - def __new__(cls, value, resp): - return super(UnicodeWithMeta, cls).__new__(cls, value) - - def __init__(self, values, resp): - self.request_ids_setup() - self.append_request_ids(resp) diff --git a/novaclient/crypto.py b/novaclient/crypto.py index 699dbac0e..527bc82a6 100644 --- a/novaclient/crypto.py +++ b/novaclient/crypto.py @@ -16,8 +16,6 @@ import base64 import subprocess -import six - class DecryptionFailure(Exception): pass @@ -38,6 +36,6 @@ def decrypt_password(private_key, password): if proc.returncode: raise DecryptionFailure(err) - if not six.PY2 and isinstance(out, bytes): + if isinstance(out, bytes): return out.decode('utf-8') return out diff --git a/novaclient/shell.py b/novaclient/shell.py index c82cd506c..a5d1e9377 100644 --- a/novaclient/shell.py +++ b/novaclient/shell.py @@ -27,7 +27,6 @@ from keystoneauth1 import loading from oslo_utils import encodeutils from oslo_utils import importutils from oslo_utils import strutils -import six import novaclient from novaclient import api_versions @@ -123,7 +122,7 @@ class DeprecatedAction(argparse.Action): # option self.real_action_args = False self.real_action = None - elif real_action is None or isinstance(real_action, six.string_types): + elif real_action is None or isinstance(real_action, str): # Specified by string (or None); we have to have a parser # to look up the actual action, so defer to later self.real_action_args = (option_strings, dest, help, kwargs) @@ -810,10 +809,7 @@ def main(): OpenStackComputeShell().main(argv) except Exception as exc: logger.debug(exc, exc_info=1) - if six.PY2: - message = encodeutils.safe_encode(six.text_type(exc)) - else: - message = encodeutils.exception_to_unicode(exc) + message = encodeutils.exception_to_unicode(exc) print("ERROR (%(type)s): %(msg)s" % { 'type': exc.__class__.__name__, 'msg': message}, diff --git a/novaclient/tests/functional/test_auth.py b/novaclient/tests/functional/test_auth.py index 74fa7fb19..8987c7289 100644 --- a/novaclient/tests/functional/test_auth.py +++ b/novaclient/tests/functional/test_auth.py @@ -10,7 +10,8 @@ # License for the specific language governing permissions and limitations # under the License. -from six.moves.urllib import parse +from urllib import parse + import tempest.lib.cli.base from novaclient import client diff --git a/novaclient/tests/functional/v2/legacy/test_hypervisors.py b/novaclient/tests/functional/v2/legacy/test_hypervisors.py index ecc102dc0..621401f9b 100644 --- a/novaclient/tests/functional/v2/legacy/test_hypervisors.py +++ b/novaclient/tests/functional/v2/legacy/test_hypervisors.py @@ -10,8 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six - from novaclient.tests.functional import base from novaclient import utils @@ -41,4 +39,4 @@ class TestHypervisors(base.ClientTestBase): 'Expected hypervisor.service.id to be an integer.') def test_list(self): - self._test_list(six.text_type) + self._test_list(str) diff --git a/novaclient/tests/functional/v2/test_device_tagging.py b/novaclient/tests/functional/v2/test_device_tagging.py index 5bb900e74..5909137ea 100644 --- a/novaclient/tests/functional/v2/test_device_tagging.py +++ b/novaclient/tests/functional/v2/test_device_tagging.py @@ -12,7 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six from tempest.lib import exceptions from novaclient.tests.functional import base @@ -40,7 +39,7 @@ class TestBlockDeviceTaggingCLIError(base.ClientTestBase): self.assertIn("ERROR (CommandError): " "'tag' in block device mapping is not supported " "in API version %s." % self.COMPUTE_API_VERSION, - six.text_type(e)) + str(e)) else: server_id = self._get_value_from_the_table(output, 'id') self.client.servers.delete(server_id) @@ -67,7 +66,7 @@ class TestNICDeviceTaggingCLIError(base.ClientTestBase): 'net-uuid': self.network.id, 'image': self.image.id})) except exceptions.CommandFailed as e: - self.assertIn("Invalid nic argument", six.text_type(e)) + self.assertIn('Invalid nic argument', str(e)) else: server_id = self._get_value_from_the_table(output, 'id') self.client.servers.delete(server_id) diff --git a/novaclient/tests/functional/v2/test_instance_action.py b/novaclient/tests/functional/v2/test_instance_action.py index b1e884c5a..45849b95b 100644 --- a/novaclient/tests/functional/v2/test_instance_action.py +++ b/novaclient/tests/functional/v2/test_instance_action.py @@ -14,7 +14,6 @@ import time from oslo_utils import timeutils from oslo_utils import uuidutils -import six from tempest.lib import exceptions from novaclient.tests.functional import base @@ -28,7 +27,7 @@ class TestInstanceActionCLI(base.ClientTestBase): try: self.nova("%s %s" % (cmd, args)) except exceptions.CommandFailed as e: - self.assertIn("ERROR (NotFound):", six.text_type(e)) + self.assertIn("ERROR (NotFound):", str(e)) else: self.fail("%s is not failed on non existing instance." % cmd) diff --git a/novaclient/tests/unit/fixture_data/base.py b/novaclient/tests/unit/fixture_data/base.py index 6580787a9..e08d82db6 100644 --- a/novaclient/tests/unit/fixture_data/base.py +++ b/novaclient/tests/unit/fixture_data/base.py @@ -10,8 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. +from urllib import parse + import fixtures -from six.moves.urllib import parse from novaclient.tests.unit.v2 import fakes diff --git a/novaclient/tests/unit/fixture_data/hypervisors.py b/novaclient/tests/unit/fixture_data/hypervisors.py index 48d7efc86..eeb5d51e4 100644 --- a/novaclient/tests/unit/fixture_data/hypervisors.py +++ b/novaclient/tests/unit/fixture_data/hypervisors.py @@ -10,8 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. +from urllib import parse + from oslo_utils import encodeutils -from six.moves.urllib import parse from novaclient import api_versions from novaclient.tests.unit.fixture_data import base diff --git a/novaclient/tests/unit/test_base.py b/novaclient/tests/unit/test_base.py index b1067cf2b..634cc93b4 100644 --- a/novaclient/tests/unit/test_base.py +++ b/novaclient/tests/unit/test_base.py @@ -12,7 +12,6 @@ # under the License. import requests -import six from novaclient import api_versions from novaclient import base @@ -148,14 +147,3 @@ class BytesWithMetaTest(utils.TestCase): # Check request_ids attribute is added to obj self.assertTrue(hasattr(obj, 'request_ids')) self.assertEqual(fakes.FAKE_REQUEST_ID_LIST, obj.request_ids) - - -if six.PY2: - class UnicodeWithMetaTest(utils.TestCase): - def test_unicode_with_meta(self): - resp = create_response_obj_with_header() - obj = base.UnicodeWithMeta(u'test-unicode', resp) - self.assertEqual(u'test-unicode', obj) - # Check request_ids attribute is added to obj - self.assertTrue(hasattr(obj, 'request_ids')) - self.assertEqual(fakes.FAKE_REQUEST_ID_LIST, obj.request_ids) diff --git a/novaclient/tests/unit/test_shell.py b/novaclient/tests/unit/test_shell.py index 122f0727e..9ef6141f7 100644 --- a/novaclient/tests/unit/test_shell.py +++ b/novaclient/tests/unit/test_shell.py @@ -13,6 +13,7 @@ import argparse import distutils.version as dist_version +import io import re import sys @@ -22,7 +23,6 @@ from keystoneauth1 import fixture import mock import prettytable import requests_mock -import six from testtools import matchers from novaclient import api_versions @@ -212,7 +212,7 @@ class DeprecatedActionTest(utils.TestCase): action.assert_called_once_with( 'option_strings', 'dest', help='Deprecated', a=1, b=2, c=3) - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) def test_get_action_nolookup(self): action_class = mock.Mock() parser = mock.Mock(**{ @@ -230,7 +230,7 @@ class DeprecatedActionTest(utils.TestCase): self.assertFalse(action_class.called) self.assertEqual(sys.stderr.getvalue(), '') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) def test_get_action_lookup_noresult(self): parser = mock.Mock(**{ '_registry_get.return_value': None, @@ -248,7 +248,7 @@ class DeprecatedActionTest(utils.TestCase): 'WARNING: Programming error: Unknown real action ' '"store"\n') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) def test_get_action_lookup_withresult(self): action_class = mock.Mock() parser = mock.Mock(**{ @@ -267,7 +267,7 @@ class DeprecatedActionTest(utils.TestCase): 'option_strings', 'dest', help='Deprecated', const=1) self.assertEqual(sys.stderr.getvalue(), '') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) @mock.patch.object(novaclient.shell.DeprecatedAction, '_get_action') def test_call_unemitted_nouse(self, mock_get_action): obj = novaclient.shell.DeprecatedAction( @@ -282,7 +282,7 @@ class DeprecatedActionTest(utils.TestCase): self.assertEqual(sys.stderr.getvalue(), 'WARNING: Option "option_string" is deprecated\n') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) @mock.patch.object(novaclient.shell.DeprecatedAction, '_get_action') def test_call_unemitted_withuse(self, mock_get_action): obj = novaclient.shell.DeprecatedAction( @@ -298,7 +298,7 @@ class DeprecatedActionTest(utils.TestCase): 'WARNING: Option "option_string" is deprecated; ' 'use this instead\n') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) @mock.patch.object(novaclient.shell.DeprecatedAction, '_get_action') def test_call_emitted_nouse(self, mock_get_action): obj = novaclient.shell.DeprecatedAction( @@ -313,7 +313,7 @@ class DeprecatedActionTest(utils.TestCase): 'parser', 'namespace', 'values', 'option_string') self.assertEqual(sys.stderr.getvalue(), '') - @mock.patch.object(sys, 'stderr', six.StringIO()) + @mock.patch.object(sys, 'stderr', io.StringIO()) @mock.patch.object(novaclient.shell.DeprecatedAction, '_get_action') def test_call_emitted_withuse(self, mock_get_action): obj = novaclient.shell.DeprecatedAction( @@ -393,8 +393,8 @@ class ShellTest(utils.TestCase): orig = sys.stdout orig_stderr = sys.stderr try: - sys.stdout = six.StringIO() - sys.stderr = six.StringIO() + sys.stdout = io.StringIO() + sys.stderr = io.StringIO() _shell = novaclient.shell.OpenStackComputeShell() _shell.main(argstr.split()) except SystemExit: @@ -622,8 +622,8 @@ class ShellTest(utils.TestCase): 'unknown', 'compute', self.mock_client) @mock.patch('sys.argv', ['nova']) - @mock.patch('sys.stdout', six.StringIO()) - @mock.patch('sys.stderr', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) + @mock.patch('sys.stderr', io.StringIO()) def test_main_noargs(self): # Ensure that main works with no command-line arguments try: @@ -761,7 +761,7 @@ class ShellTest(utils.TestCase): def test_main_error_handling(self, mock_compute_shell): class MyException(Exception): pass - with mock.patch('sys.stderr', six.StringIO()): + with mock.patch('sys.stderr', io.StringIO()): mock_compute_shell.side_effect = MyException('message') self.assertRaises(SystemExit, novaclient.shell.main) err = sys.stderr.getvalue() diff --git a/novaclient/tests/unit/test_utils.py b/novaclient/tests/unit/test_utils.py index 5927e65a1..0fb65c75c 100644 --- a/novaclient/tests/unit/test_utils.py +++ b/novaclient/tests/unit/test_utils.py @@ -11,12 +11,11 @@ # License for the specific language governing permissions and limitations # under the License. +import io import sys +from urllib import parse import mock -from oslo_utils import encodeutils -import six -from six.moves.urllib import parse from novaclient import base from novaclient import exceptions @@ -177,7 +176,7 @@ class _FakeResult(object): class PrintResultTestCase(test_utils.TestCase): - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_dict(self): dict = {'key': 'value'} utils.print_dict(dict) @@ -188,7 +187,7 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+-------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_dict_wrap(self): dict = {'key1': 'not wrapped', 'key2': 'this will be wrapped'} @@ -202,7 +201,7 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+--------------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_list_sort_by_str(self): objs = [_FakeResult("k1", 1), _FakeResult("k3", 2), @@ -219,7 +218,7 @@ class PrintResultTestCase(test_utils.TestCase): '+------+-------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_list_sort_by_integer(self): objs = [_FakeResult("k1", 1), _FakeResult("k3", 2), @@ -236,14 +235,11 @@ class PrintResultTestCase(test_utils.TestCase): '+------+-------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_unicode_list(self): objs = [_FakeResult("k", u'\u2026')] utils.print_list(objs, ["Name", "Value"]) - if six.PY3: - s = u'\u2026' - else: - s = encodeutils.safe_encode(u'\u2026') + s = u'\u2026' self.assertEqual('+------+-------+\n' '| Name | Value |\n' '+------+-------+\n' @@ -252,7 +248,7 @@ class PrintResultTestCase(test_utils.TestCase): sys.stdout.getvalue()) # without sorting - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_list_sort_by_none(self): objs = [_FakeResult("k1", 1), _FakeResult("k3", 3), @@ -269,7 +265,7 @@ class PrintResultTestCase(test_utils.TestCase): '+------+-------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_dict_dictionary(self): dict = {'k': {'foo': 'bar'}} utils.print_dict(dict) @@ -280,7 +276,7 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+----------------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_dict_list_dictionary(self): dict = {'k': [{'foo': 'bar'}]} utils.print_dict(dict) @@ -291,7 +287,7 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+------------------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_dict_list(self): dict = {'k': ['foo', 'bar']} utils.print_dict(dict) @@ -302,7 +298,7 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+----------------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_large_dict_list(self): dict = {'k': ['foo1', 'bar1', 'foo2', 'bar2', 'foo3', 'bar3', 'foo4', 'bar4']} @@ -316,14 +312,11 @@ class PrintResultTestCase(test_utils.TestCase): '+----------+------------------------------------------+\n', sys.stdout.getvalue()) - @mock.patch('sys.stdout', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) def test_print_unicode_dict(self): dict = {'k': u'\u2026'} utils.print_dict(dict) - if six.PY3: - s = u'\u2026' - else: - s = encodeutils.safe_encode(u'\u2026') + s = u'\u2026' self.assertEqual('+----------+-------+\n' '| Property | Value |\n' '+----------+-------+\n' @@ -403,7 +396,7 @@ class DoActionOnManyTestCase(test_utils.TestCase): def test_do_action_on_many_last_fails(self): self._test_do_action_on_many([None, Exception()], fail=True) - @mock.patch('sys.stdout', new_callable=six.StringIO) + @mock.patch('sys.stdout', new_callable=io.StringIO) def _test_do_action_on_many_resource_string( self, resource, expected_string, mock_stdout): utils.do_action_on_many(mock.Mock(), [resource], 'success with %s', @@ -452,9 +445,8 @@ class PrepareQueryStringTestCase(test_utils.TestCase): def setUp(self): super(PrepareQueryStringTestCase, self).setUp() self.ustr = b'?\xd0\xbf=1&\xd1\x80=2' - if six.PY3: - # in py3 real unicode symbols will be urlencoded - self.ustr = self.ustr.decode('utf8') + # in py3 real unicode symbols will be urlencoded + self.ustr = self.ustr.decode('utf8') self.cases = ( ({}, ''), (None, ''), diff --git a/novaclient/tests/unit/utils.py b/novaclient/tests/unit/utils.py index 0050941bc..229d999ec 100644 --- a/novaclient/tests/unit/utils.py +++ b/novaclient/tests/unit/utils.py @@ -18,7 +18,6 @@ import mock from oslo_serialization import jsonutils import requests from requests_mock.contrib import fixture as requests_mock_fixture -import six import testscenarios import testtools @@ -99,9 +98,9 @@ class FixturedTestCase(testscenarios.TestWithScenarios, TestCase): if body: req_data = self.requests_mock.last_request.body - if isinstance(req_data, six.binary_type): + if isinstance(req_data, bytes): req_data = req_data.decode('utf-8') - if not isinstance(body, six.string_types): + if not isinstance(body, str): # json load if the input body to match against is not a string req_data = jsonutils.loads(req_data) self.assertEqual(body, req_data) diff --git a/novaclient/tests/unit/v2/fakes.py b/novaclient/tests/unit/v2/fakes.py index 62d5e727e..69ecc8936 100644 --- a/novaclient/tests/unit/v2/fakes.py +++ b/novaclient/tests/unit/v2/fakes.py @@ -17,11 +17,10 @@ import copy import datetime import re +from urllib import parse import mock from oslo_utils import strutils -import six -from six.moves.urllib import parse import novaclient from novaclient import api_versions @@ -1528,158 +1527,146 @@ class FakeSessionClient(base_client.SessionClient): # Tenant Usage # def get_os_simple_tenant_usage(self, **kw): - return (200, FAKE_RESPONSE_HEADERS, - {six.u('tenant_usages'): [{ - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, - six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-1111-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, - six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): - six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}]}) + return (200, FAKE_RESPONSE_HEADERS, {'tenant_usages': [{ + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, + 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-1111-457b-b350-bb5ecc685cdd', + 'vcpus': 1, + 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}]}) def get_os_simple_tenant_usage_next(self, **kw): - return (200, FAKE_RESPONSE_HEADERS, - {six.u('tenant_usages'): [{ - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, - six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-2222-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, - six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): - six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}]}) + return (200, FAKE_RESPONSE_HEADERS, {'tenant_usages': [{ + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, + 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-2222-457b-b350-bb5ecc685cdd', + 'vcpus': 1, + 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}]}) def get_os_simple_tenant_usage_next_next(self, **kw): - return (200, FAKE_RESPONSE_HEADERS, {six.u('tenant_usages'): []}) + return (200, FAKE_RESPONSE_HEADERS, {'tenant_usages': []}) def get_os_simple_tenant_usage_tenantfoo(self, **kw): - return (200, FAKE_RESPONSE_HEADERS, - {six.u('tenant_usage'): { - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): - six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-1111-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): - six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}}) + return (200, FAKE_RESPONSE_HEADERS, {'tenant_usage': { + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-1111-457b-b350-bb5ecc685cdd', + 'vcpus': 1, 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}}) def get_os_simple_tenant_usage_test(self, **kw): - return (200, {}, {six.u('tenant_usage'): { - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-1111-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}}) + return (200, {}, {'tenant_usage': { + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-1111-457b-b350-bb5ecc685cdd', + 'vcpus': 1, 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}}) def get_os_simple_tenant_usage_tenant_id(self, **kw): - return (200, {}, {six.u('tenant_usage'): { - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-1111-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}}) + return (200, {}, {'tenant_usage': { + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-1111-457b-b350-bb5ecc685cdd', + 'vcpus': 1, 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}}) def get_os_simple_tenant_usage_tenant_id_next(self, **kw): - return (200, {}, {six.u('tenant_usage'): { - six.u('total_memory_mb_usage'): 25451.762807466665, - six.u('total_vcpus_usage'): 49.71047423333333, - six.u('total_hours'): 49.71047423333333, - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('stop'): six.u('2012-01-22 19:48:41.750722'), - six.u('server_usages'): [{ - six.u('hours'): 49.71047423333333, - six.u('uptime'): 27035, six.u('local_gb'): 0, - six.u('ended_at'): None, - six.u('name'): six.u('f15image1'), - six.u('tenant_id'): six.u('7b0a1d73f8fb41718f3343c207597869'), - six.u('instance_id'): - six.u('f079e394-2222-457b-b350-bb5ecc685cdd'), - six.u('vcpus'): 1, six.u('memory_mb'): 512, - six.u('state'): six.u('active'), - six.u('flavor'): six.u('m1.tiny'), - six.u('started_at'): six.u('2012-01-20 18:06:06.479998')}], - six.u('start'): six.u('2011-12-25 19:48:41.750687'), - six.u('total_local_gb_usage'): 0.0}}) + return (200, {}, {'tenant_usage': { + 'total_memory_mb_usage': 25451.762807466665, + 'total_vcpus_usage': 49.71047423333333, + 'total_hours': 49.71047423333333, + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'stop': '2012-01-22 19:48:41.750722', + 'server_usages': [{ + 'hours': 49.71047423333333, + 'uptime': 27035, 'local_gb': 0, + 'ended_at': None, + 'name': 'f15image1', + 'tenant_id': '7b0a1d73f8fb41718f3343c207597869', + 'instance_id': 'f079e394-2222-457b-b350-bb5ecc685cdd', + 'vcpus': 1, 'memory_mb': 512, + 'state': 'active', + 'flavor': 'm1.tiny', + 'started_at': '2012-01-20 18:06:06.479998', + }], + 'start': '2011-12-25 19:48:41.750687', + 'total_local_gb_usage': 0.0}}) def get_os_simple_tenant_usage_tenant_id_next_next(self, **kw): - return (200, {}, {six.u('tenant_usage'): {}}) + return (200, {}, {'tenant_usage': {}}) # # Aggregates diff --git a/novaclient/tests/unit/v2/test_availability_zone.py b/novaclient/tests/unit/v2/test_availability_zone.py index ac2bf0f2b..c3ac6f07e 100644 --- a/novaclient/tests/unit/v2/test_availability_zone.py +++ b/novaclient/tests/unit/v2/test_availability_zone.py @@ -14,8 +14,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six - from novaclient.tests.unit.fixture_data import availability_zones as data from novaclient.tests.unit.fixture_data import client from novaclient.tests.unit import utils @@ -54,8 +52,8 @@ class AvailabilityZoneTest(utils.FixturedTestCase): self.assertEqual(2, len(zones)) - l0 = [six.u('zone-1'), six.u('available')] - l1 = [six.u('zone-2'), six.u('not available')] + l0 = ['zone-1', 'available'] + l1 = ['zone-2', 'not available'] z0 = self.shell._treeizeAvailabilityZone(zones[0]) z1 = self.shell._treeizeAvailabilityZone(zones[1]) @@ -75,18 +73,15 @@ class AvailabilityZoneTest(utils.FixturedTestCase): self.assertEqual(3, len(zones)) - l0 = [six.u('zone-1'), six.u('available')] - l1 = [six.u('|- fake_host-1'), six.u('')] - l2 = [six.u('| |- nova-compute'), - six.u('enabled :-) 2012-12-26 14:45:25')] - l3 = [six.u('internal'), six.u('available')] - l4 = [six.u('|- fake_host-1'), six.u('')] - l5 = [six.u('| |- nova-sched'), - six.u('enabled :-) 2012-12-26 14:45:25')] - l6 = [six.u('|- fake_host-2'), six.u('')] - l7 = [six.u('| |- nova-network'), - six.u('enabled XXX 2012-12-26 14:45:24')] - l8 = [six.u('zone-2'), six.u('not available')] + l0 = ['zone-1', 'available'] + l1 = ['|- fake_host-1', ''] + l2 = ['| |- nova-compute', 'enabled :-) 2012-12-26 14:45:25'] + l3 = ['internal', 'available'] + l4 = ['|- fake_host-1', ''] + l5 = ['| |- nova-sched', 'enabled :-) 2012-12-26 14:45:25'] + l6 = ['|- fake_host-2', ''] + l7 = ['| |- nova-network', 'enabled XXX 2012-12-26 14:45:24'] + l8 = ['zone-2', 'not available'] z0 = self.shell._treeizeAvailabilityZone(zones[0]) z1 = self.shell._treeizeAvailabilityZone(zones[1]) diff --git a/novaclient/tests/unit/v2/test_hypervisors.py b/novaclient/tests/unit/v2/test_hypervisors.py index 3eaeb576f..3907687fa 100644 --- a/novaclient/tests/unit/v2/test_hypervisors.py +++ b/novaclient/tests/unit/v2/test_hypervisors.py @@ -13,8 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six - from novaclient import api_versions from novaclient import exceptions from novaclient.tests.unit.fixture_data import client @@ -127,7 +125,7 @@ class HypervisorsTest(utils.FixturedTestCase): self.cs.hypervisors.search, 'hyper', detailed=True) self.assertIn('Parameter "detailed" requires API version 2.53 or ' - 'greater.', six.text_type(ex)) + 'greater.', str(ex)) def test_hypervisor_servers(self): expected = [ diff --git a/novaclient/tests/unit/v2/test_migrations.py b/novaclient/tests/unit/v2/test_migrations.py index 09d09405c..0b5ebb84e 100644 --- a/novaclient/tests/unit/v2/test_migrations.py +++ b/novaclient/tests/unit/v2/test_migrations.py @@ -10,8 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six - from novaclient import api_versions from novaclient.tests.unit import utils from novaclient.tests.unit.v2 import fakes @@ -158,8 +156,7 @@ class MigrationsV280Test(MigrationsV266Test): ex = self.assertRaises(TypeError, self.cs.migrations.list, user_id=user_id) - self.assertIn("unexpected keyword argument 'user_id'", - six.text_type(ex)) + self.assertIn("unexpected keyword argument 'user_id'", str(ex)) def test_list_migrations_with_project_id_pre_v280(self): self.cs.api_version = api_versions.APIVersion('2.79') @@ -167,5 +164,4 @@ class MigrationsV280Test(MigrationsV266Test): ex = self.assertRaises(TypeError, self.cs.migrations.list, project_id=project_id) - self.assertIn("unexpected keyword argument 'project_id'", - six.text_type(ex)) + self.assertIn("unexpected keyword argument 'project_id'", str(ex)) diff --git a/novaclient/tests/unit/v2/test_servers.py b/novaclient/tests/unit/v2/test_servers.py index c255cbd7b..6ad9df9ad 100644 --- a/novaclient/tests/unit/v2/test_servers.py +++ b/novaclient/tests/unit/v2/test_servers.py @@ -13,11 +13,11 @@ # under the License. import base64 +import io import os import tempfile import mock -import six from novaclient import api_versions from novaclient import exceptions @@ -83,7 +83,7 @@ class ServersTest(utils.FixturedTestCase): self.cs.servers.list, search_opts={'locked': False}) self.assertIn("'locked' argument is only allowed since " - "microversion 2.73.", six.text_type(e)) + "microversion 2.73.", str(e)) def test_list_servers_undetailed(self): sl = self.cs.servers.list(detailed=False) @@ -140,7 +140,7 @@ class ServersTest(utils.FixturedTestCase): if self.supports_files: kwargs['files'] = { '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream } s = self.cs.servers.create( name="My server", @@ -270,14 +270,14 @@ class ServersTest(utils.FixturedTestCase): if self.supports_files: kwargs['files'] = { '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream } s = self.cs.servers.create( name="My server", image=1, flavor=1, meta={'foo': 'bar'}, - userdata=six.StringIO('hello moto'), + userdata=io.StringIO('hello moto'), nics=self._get_server_create_default_nics(), **kwargs ) @@ -290,14 +290,14 @@ class ServersTest(utils.FixturedTestCase): if self.supports_files: kwargs['files'] = { '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream } s = self.cs.servers.create( name="My server", image=1, flavor=1, meta={'foo': 'bar'}, - userdata=six.u('こんにちは'), + userdata='こんにちは', key_name="fakekey", nics=self._get_server_create_default_nics(), **kwargs @@ -311,7 +311,7 @@ class ServersTest(utils.FixturedTestCase): if self.supports_files: kwargs['files'] = { '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream } s = self.cs.servers.create( name="My server", @@ -349,7 +349,7 @@ class ServersTest(utils.FixturedTestCase): if self.supports_files: kwargs['files'] = { '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream } with tempfile.TemporaryFile(mode='wb+') as bin_file: original_data = os.urandom(1024) @@ -1510,7 +1510,7 @@ class ServersV254Test(ServersV252Test): self.cs.servers.rebuild, '1234', fakes.FAKE_IMAGE_UUID_1, key_name='test_keypair') - self.assertIn('key_name', six.text_type(ex.message)) + self.assertIn('key_name', str(ex.message)) class ServersV256Test(ServersV254Test): @@ -1533,7 +1533,7 @@ class ServersV256Test(ServersV254Test): s = self.cs.servers.get(1234) ex = self.assertRaises(TypeError, s.migrate, host='target-host') - self.assertIn('host', six.text_type(ex)) + self.assertIn('host', str(ex)) class ServersV257Test(ServersV256Test): @@ -1549,9 +1549,9 @@ class ServersV257Test(ServersV256Test): name="My server", image=1, flavor=1, files={ '/etc/passwd': 'some data', # a file - '/tmp/foo.txt': six.StringIO('data'), # a stream + '/tmp/foo.txt': io.StringIO('data'), # a stream }, nics='auto') - self.assertIn('files', six.text_type(ex)) + self.assertIn('files', str(ex)) def test_rebuild_server_name_meta_files(self): files = {'/etc/passwd': 'some data'} @@ -1559,7 +1559,7 @@ class ServersV257Test(ServersV256Test): ex = self.assertRaises( exceptions.UnsupportedAttribute, s.rebuild, image=1, name='new', meta={'foo': 'bar'}, files=files) - self.assertIn('files', six.text_type(ex)) + self.assertIn('files', str(ex)) class ServersV263Test(ServersV257Test): @@ -1600,7 +1600,7 @@ class ServersV263Test(ServersV257Test): userdata="hello moto", key_name="fakekey", nics=self._get_server_create_default_nics(), trusted_image_certificates=['id1', 'id2']) - self.assertIn('trusted_image_certificates', six.text_type(ex)) + self.assertIn('trusted_image_certificates', str(ex)) def test_rebuild_server_with_trusted_image_certificates(self): s = self.cs.servers.get(1234) @@ -1626,7 +1626,7 @@ class ServersV263Test(ServersV257Test): self.cs.servers.rebuild, '1234', fakes.FAKE_IMAGE_UUID_1, trusted_image_certificates=['id1', 'id2']) - self.assertIn('trusted_image_certificates', six.text_type(ex)) + self.assertIn('trusted_image_certificates', str(ex)) class ServersV267Test(ServersV263Test): @@ -1671,7 +1671,7 @@ class ServersV267Test(ServersV263Test): name="bfv server", image='', flavor=1, nics='none', block_device_mapping_v2=bdm) self.assertIn("Block device volume_type is not supported before " - "microversion 2.67", six.text_type(ex)) + "microversion 2.67", str(ex)) class ServersV268Test(ServersV267Test): @@ -1692,7 +1692,7 @@ class ServersV268Test(ServersV267Test): ex = self.assertRaises(TypeError, self.cs.servers.evacuate, 'fake_target_host', force=True) - self.assertIn('force', six.text_type(ex)) + self.assertIn('force', str(ex)) def test_live_migrate_server(self): s = self.cs.servers.get(1234) @@ -1711,7 +1711,7 @@ class ServersV268Test(ServersV267Test): ex = self.assertRaises(TypeError, self.cs.servers.live_migrate, host='hostname', force=True) - self.assertIn('force', six.text_type(ex)) + self.assertIn('force', str(ex)) class ServersV273Test(ServersV268Test): @@ -1734,7 +1734,7 @@ class ServersV273Test(ServersV268Test): s = self.cs.servers.get(1234) e = self.assertRaises(TypeError, s.lock, reason='blah') - self.assertIn("unexpected keyword argument 'reason'", six.text_type(e)) + self.assertIn("unexpected keyword argument 'reason'", str(e)) def test_filter_servers_unlocked(self): # support locked=False @@ -1818,7 +1818,7 @@ class ServersV274Test(ServersV273Test): name="My server", image=1, flavor=1, nics='auto', host="new-host") self.assertIn("'host' argument is only allowed since microversion " - "2.74", six.text_type(ex)) + "2.74", str(ex)) def test_create_server_with_hypervisor_hostname_pre_274_fails(self): self.cs.api_version = api_versions.APIVersion('2.73') @@ -1827,7 +1827,7 @@ class ServersV274Test(ServersV273Test): name="My server", image=1, flavor=1, nics='auto', hypervisor_hostname="new-host") self.assertIn("'hypervisor_hostname' argument is only allowed since " - "microversion 2.74", six.text_type(ex)) + "microversion 2.74", str(ex)) def test_create_server_with_host_and_hypervisor_hostname_pre_274_fails( self): @@ -1838,7 +1838,7 @@ class ServersV274Test(ServersV273Test): nics='auto', host="new-host", hypervisor_hostname="new-host") self.assertIn("'host' argument is only allowed since microversion " - "2.74", six.text_type(ex)) + "2.74", str(ex)) class ServersV277Test(ServersV274Test): @@ -1868,13 +1868,13 @@ class ServersV277Test(ServersV274Test): s.unshelve, availability_zone='foo-az') self.assertIn("unexpected keyword argument 'availability_zone'", - six.text_type(ex)) + str(ex)) # Test going through the ServerManager directly. ex = self.assertRaises(TypeError, self.cs.servers.unshelve, s, availability_zone='foo-az') self.assertIn("unexpected keyword argument 'availability_zone'", - six.text_type(ex)) + str(ex)) class ServersV278Test(ServersV273Test): diff --git a/novaclient/tests/unit/v2/test_shell.py b/novaclient/tests/unit/v2/test_shell.py index dbd2b3bea..6c3b3cfa0 100644 --- a/novaclient/tests/unit/v2/test_shell.py +++ b/novaclient/tests/unit/v2/test_shell.py @@ -18,15 +18,15 @@ import argparse import base64 +import builtins import collections import datetime +import io import os import fixtures import mock from oslo_utils import timeutils -import six -from six.moves import builtins import testtools import novaclient @@ -88,8 +88,8 @@ class ShellTest(utils.TestCase): # TODO(stephenfin): We should migrate most of the existing assertRaises # calls to simply pass expected_error to this instead so we can easily # capture and compare output - @mock.patch('sys.stdout', new_callable=six.StringIO) - @mock.patch('sys.stderr', new_callable=six.StringIO) + @mock.patch('sys.stdout', new_callable=io.StringIO) + @mock.patch('sys.stderr', new_callable=io.StringIO) def run_command(self, cmd, mock_stderr, mock_stdout, api_version=None, expected_error=None): version_options = [] @@ -304,7 +304,7 @@ class ShellTest(utils.TestCase): 'boot --flavor 1 --image %s --config-drive /dev/hda some-server' % FAKE_UUID_1) self.assertIn("The value of the '--config-drive' option must be " - "a boolean value.", six.text_type(ex)) + "a boolean value.", str(ex)) def test_boot_invalid_user_data(self): invalid_file = os.path.join(os.path.dirname(__file__), @@ -676,7 +676,7 @@ class ShellTest(utils.TestCase): 'size=1,bootindex=0,shutdown=remove,tag=foo,volume_type=lvm ' 'bfv-server' % FAKE_UUID_1, api_version='2.66') self.assertIn("'volume_type' in block device mapping is not supported " - "in API version", six.text_type(ex)) + "in API version", str(ex)) def test_boot_from_volume_with_volume_type(self): """Tests creating a volume-backed server from a source image and @@ -895,7 +895,7 @@ class ShellTest(utils.TestCase): '--nic net-id=1,port-id=2 some-server' % FAKE_UUID_1) ex = self.assertRaises(exceptions.CommandError, self.run_command, cmd, api_version='2.1') - self.assertNotIn('tag=tag', six.text_type(ex)) + self.assertNotIn('tag=tag', str(ex)) def test_boot_invalid_nics_v2_32(self): # This is a negative test to make sure we fail with the correct message @@ -903,7 +903,7 @@ class ShellTest(utils.TestCase): '--nic net-id=1,port-id=2 some-server' % FAKE_UUID_1) ex = self.assertRaises(exceptions.CommandError, self.run_command, cmd, api_version='2.32') - self.assertIn('tag=tag', six.text_type(ex)) + self.assertIn('tag=tag', str(ex)) def test_boot_invalid_nics_v2_36_auto(self): """This is a negative test to make sure we fail with the correct @@ -912,7 +912,7 @@ class ShellTest(utils.TestCase): cmd = ('boot --image %s --flavor 1 --nic auto test' % FAKE_UUID_1) ex = self.assertRaises(exceptions.CommandError, self.run_command, cmd, api_version='2.36') - self.assertNotIn('auto,none', six.text_type(ex)) + self.assertNotIn('auto,none', str(ex)) def test_boot_invalid_nics_v2_37(self): """This is a negative test to make sure we fail with the correct @@ -922,7 +922,7 @@ class ShellTest(utils.TestCase): '--nic net-id=1 --nic auto some-server' % FAKE_UUID_1) ex = self.assertRaises(exceptions.CommandError, self.run_command, cmd, api_version='2.37') - self.assertIn('auto,none', six.text_type(ex)) + self.assertIn('auto,none', str(ex)) def test_boot_nics_auto_allocate_default(self): """Tests that if microversion>=2.37 is specified and no --nics are @@ -1407,7 +1407,7 @@ class ShellTest(utils.TestCase): exceptions.CommandError, self.run_command, 'boot --flavor 1 --image %s some-server' % FAKE_UUID_2) self.assertIn('Instance %s could not be found.' % FAKE_UUID_1, - six.text_type(ex)) + str(ex)) def test_boot_with_host_v274(self): self.run_command('boot --flavor 1 --image %s ' @@ -1831,7 +1831,7 @@ class ShellTest(utils.TestCase): ex = self.assertRaises(exceptions.CommandError, self.run_command, 'list --changes-before 0123456789', api_version='2.66') - self.assertIn('Invalid changes-before value', six.text_type(ex)) + self.assertIn('Invalid changes-before value', str(ex)) def test_list_with_changes_before_pre_v266_not_allowed(self): self.assertRaises(SystemExit, self.run_command, @@ -1947,7 +1947,7 @@ class ShellTest(utils.TestCase): 'rebuild sample-server %s --key-unset --key-name test_keypair' % FAKE_UUID_1, api_version='2.54') self.assertIn("Cannot specify '--key-unset' with '--key-name'.", - six.text_type(ex)) + str(ex)) def test_rebuild_with_incorrect_metadata(self): cmd = 'rebuild sample-server %s --name asdf --meta foo' % FAKE_UUID_1 @@ -2001,7 +2001,7 @@ class ShellTest(utils.TestCase): api_version='2.57') self.assertIn("Can't open '%(user_data)s': " "[Errno 2] No such file or directory: '%(user_data)s'" % - {'user_data': invalid_file}, six.text_type(ex)) + {'user_data': invalid_file}, str(ex)) def test_rebuild_unset_user_data(self): self.run_command('rebuild sample-server %s --user-data-unset' % @@ -2024,7 +2024,7 @@ class ShellTest(utils.TestCase): ex = self.assertRaises(exceptions.CommandError, self.run_command, cmd, api_version='2.57') self.assertIn("Cannot specify '--user-data-unset' with " - "'--user-data'.", six.text_type(ex)) + "'--user-data'.", str(ex)) def test_rebuild_with_single_trusted_image_certificates(self): self.run_command('rebuild sample-server %s ' @@ -2132,7 +2132,7 @@ class ShellTest(utils.TestCase): api_version='2.63') self.assertIn("Cannot specify '--trusted-image-certificates-unset' " "with '--trusted-image-certificate-id'", - six.text_type(ex)) + str(ex)) def test_rebuild_with_trusted_image_certificates_unset_env_conflict(self): """Tests the error condition that trusted image certs are both unset @@ -2146,7 +2146,7 @@ class ShellTest(utils.TestCase): FAKE_UUID_1, api_version='2.63') self.assertIn("Cannot specify '--trusted-image-certificates-unset' " "with '--trusted-image-certificate-id'", - six.text_type(ex)) + str(ex)) def test_rebuild_with_trusted_image_certificates_arg_and_envar(self): """Tests that if both the environment variable and argument are @@ -2237,7 +2237,7 @@ class ShellTest(utils.TestCase): self.run_command, 'lock sample-server --reason zombies', api_version='2.72') - self.assertIn('2', six.text_type(exp)) + self.assertIn('2', str(exp)) def test_lock_v273(self): self.run_command('lock sample-server', @@ -2509,7 +2509,7 @@ class ShellTest(utils.TestCase): self.run_command, 'server-topology 1234', api_version='2.77') - self.assertIn('2', six.text_type(exp)) + self.assertIn('2', str(exp)) def test_refresh_network(self): self.run_command('refresh-network 1234') @@ -2787,7 +2787,7 @@ class ShellTest(utils.TestCase): 'aggregate-update test') self.assertIn("Either '--name ' or '--availability-zone " "' must be specified.", - six.text_type(ex)) + str(ex)) def test_aggregate_set_metadata_add_by_id(self): out, err = self.run_command('aggregate-set-metadata 3 foo=bar') @@ -4009,7 +4009,7 @@ class ShellTest(utils.TestCase): exceptions.CommandError, self.run_command, 'instance-action-list sample-server --changes-since 0123456789', api_version='2.58') - self.assertIn('Invalid changes-since value', six.text_type(ex)) + self.assertIn('Invalid changes-since value', str(ex)) def test_instance_action_list_changes_before_pre_v266_not_allowed(self): cmd = 'instance-action-list sample-server --changes-before ' \ @@ -4031,7 +4031,7 @@ class ShellTest(utils.TestCase): exceptions.CommandError, self.run_command, 'instance-action-list sample-server --changes-before 0123456789', api_version='2.66') - self.assertIn('Invalid changes-before value', six.text_type(ex)) + self.assertIn('Invalid changes-before value', str(ex)) def test_instance_usage_audit_log(self): self.run_command('instance-usage-audit-log') @@ -4096,7 +4096,7 @@ class ShellTest(utils.TestCase): ex = self.assertRaises(exceptions.CommandError, self.run_command, 'migration-list --changes-since 0123456789', api_version='2.59') - self.assertIn('Invalid changes-since value', six.text_type(ex)) + self.assertIn('Invalid changes-since value', str(ex)) def test_migration_list_with_changes_before_v266(self): self.run_command('migration-list --changes-before 2016-02-29T06:23:22', @@ -4108,7 +4108,7 @@ class ShellTest(utils.TestCase): ex = self.assertRaises(exceptions.CommandError, self.run_command, 'migration-list --changes-before 0123456789', api_version='2.66') - self.assertIn('Invalid changes-before value', six.text_type(ex)) + self.assertIn('Invalid changes-before value', str(ex)) def test_migration_list_with_changes_before_pre_v266_not_allowed(self): cmd = 'migration-list --changes-before 2016-02-29T06:23:22' @@ -4284,7 +4284,7 @@ class ShellTest(utils.TestCase): api_version="2.2") def test_keypair_stdin(self): - with mock.patch('sys.stdin', six.StringIO('FAKE_PUBLIC_KEY')): + with mock.patch('sys.stdin', io.StringIO('FAKE_PUBLIC_KEY')): self.run_command('keypair-add --pub-key - test', api_version="2.2") self.assert_called( 'POST', '/os-keypairs', { @@ -4360,7 +4360,7 @@ class ShellTest(utils.TestCase): 'server-group-create sg1 anti-affinity ' '--rule max_server_per_host=foo', api_version='2.64') self.assertIn("Invalid 'max_server_per_host' value: foo", - six.text_type(result)) + str(result)) def test_create_server_group_with_rules_pre_264(self): self.assertRaises(SystemExit, self.run_command, diff --git a/novaclient/tests/unit/v2/test_usage.py b/novaclient/tests/unit/v2/test_usage.py index 900842334..c7473aa9d 100644 --- a/novaclient/tests/unit/v2/test_usage.py +++ b/novaclient/tests/unit/v2/test_usage.py @@ -13,8 +13,6 @@ import datetime -import six - from novaclient import api_versions from novaclient.tests.unit import utils from novaclient.tests.unit.v2 import fakes @@ -60,8 +58,8 @@ class UsageTest(utils.TestCase): self.assertIsInstance(u, usage.Usage) def test_usage_class_get(self): - start = six.u('2012-01-22T19:48:41.750722') - stop = six.u('2012-01-22T19:48:41.750722') + start = '2012-01-22T19:48:41.750722' + stop = '2012-01-22T19:48:41.750722' info = {'tenant_id': 'tenantfoo', 'start': start, 'stop': stop} diff --git a/novaclient/tests/unit/v2/test_volumes.py b/novaclient/tests/unit/v2/test_volumes.py index fbc55ddf7..d18f84664 100644 --- a/novaclient/tests/unit/v2/test_volumes.py +++ b/novaclient/tests/unit/v2/test_volumes.py @@ -14,7 +14,6 @@ # under the License. import mock -import six from novaclient import api_versions from novaclient.tests.unit import utils @@ -156,4 +155,4 @@ class VolumesV279Test(VolumesV249Test): TypeError, self.cs.volumes.create_server_volume, "1234", volume_id='15e59938-07d5-11e1-90e3-e3dffe0c5983', delete_on_termination=True) - self.assertIn('delete_on_termination', six.text_type(ex)) + self.assertIn('delete_on_termination', str(ex)) diff --git a/novaclient/utils.py b/novaclient/utils.py index 05a86d92a..fba708b55 100644 --- a/novaclient/utils.py +++ b/novaclient/utils.py @@ -16,13 +16,12 @@ import os import re import textwrap import time +from urllib import parse from oslo_serialization import jsonutils from oslo_utils import encodeutils from oslo_utils import uuidutils import prettytable -import six -from six.moves.urllib import parse from novaclient import exceptions from novaclient.i18n import _ @@ -149,7 +148,7 @@ def print_list(objs, fields, formatters={}, sortby_index=None): if data is None: data = '-' # '\r' would break the table, so remove it. - data = six.text_type(data).replace("\r", "") + data = str(data).replace("\r", "") row.append(data) pt.add_row(row) @@ -158,8 +157,7 @@ def print_list(objs, fields, formatters={}, sortby_index=None): else: result = encodeutils.safe_encode(pt.get_string()) - if six.PY3: - result = result.decode() + result = result.decode() print(result) @@ -196,7 +194,7 @@ def flatten_dict(data): data = data.copy() # Try and decode any nested JSON structures. for key, value in data.items(): - if isinstance(value, six.string_types): + if isinstance(value, str): try: data[key] = jsonutils.loads(value) except ValueError: @@ -213,10 +211,10 @@ def print_dict(d, dict_property="Property", dict_value="Value", wrap=0): if isinstance(v, (dict, list)): v = jsonutils.dumps(v, ensure_ascii=False) if wrap > 0: - v = textwrap.fill(six.text_type(v), wrap) + v = textwrap.fill(str(v), wrap) # if value has a newline, add in multiple rows # e.g. fault with stacktrace - if v and isinstance(v, six.string_types) and (r'\n' in v or '\r' in v): + if v and isinstance(v, str) and (r'\n' in v or '\r' in v): # '\r' would break the table, so remove it. if '\r' in v: v = v.replace('\r', '') @@ -232,8 +230,7 @@ def print_dict(d, dict_property="Property", dict_value="Value", wrap=0): result = encodeutils.safe_encode(pt.get_string()) - if six.PY3: - result = result.decode() + result = result.decode() print(result) @@ -252,8 +249,7 @@ def find_resource(manager, name_or_id, wrap_exception=True, **find_args): try: tmp_id = encodeutils.safe_encode(name_or_id) - if six.PY3: - tmp_id = tmp_id.decode() + tmp_id = tmp_id.decode() if uuidutils.is_uuid_like(tmp_id): return manager.get(tmp_id) @@ -383,7 +379,7 @@ def do_action_on_many(action, resources, success_msg, error_msg): print(success_msg % _get_resource_string(resource)) except Exception as e: failure_flag = True - print(encodeutils.safe_encode(six.text_type(e))) + print(encodeutils.safe_encode(str(e))) if failure_flag: raise exceptions.CommandError(error_msg) diff --git a/novaclient/v2/hypervisors.py b/novaclient/v2/hypervisors.py index e6f5038c8..c705dc659 100644 --- a/novaclient/v2/hypervisors.py +++ b/novaclient/v2/hypervisors.py @@ -17,9 +17,7 @@ Hypervisors interface """ -from oslo_utils import encodeutils -import six -from six.moves.urllib import parse +from urllib import parse from novaclient import api_versions from novaclient import base @@ -92,8 +90,6 @@ class HypervisorManager(base.ManagerWithFind): # Starting with microversion 2.53, the /servers and /search routes are # deprecated and we get the same results using GET /os-hypervisors # using query parameters for the hostname pattern and servers. - if six.PY2: - hypervisor_match = encodeutils.safe_encode(hypervisor_match) if self.api_version >= api_versions.APIVersion('2.53'): url = ('/os-hypervisors%s?hypervisor_hostname_pattern=%s' % ('/detail' if detailed else '', diff --git a/novaclient/v2/instance_usage_audit_log.py b/novaclient/v2/instance_usage_audit_log.py index 9ada06c1e..83db8c8e6 100644 --- a/novaclient/v2/instance_usage_audit_log.py +++ b/novaclient/v2/instance_usage_audit_log.py @@ -13,9 +13,7 @@ # 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 +from urllib import parse from novaclient import base @@ -34,8 +32,6 @@ class InstanceUsageAuditLogManager(base.Manager): before which to list usage audits. """ if before: - if six.PY2: - before = encodeutils.safe_encode(before) return self._get('/os-instance_usage_audit_log/%s' % parse.quote(before, safe=''), 'instance_usage_audit_log') diff --git a/novaclient/v2/servers.py b/novaclient/v2/servers.py index 1351189bf..ff8c166ec 100644 --- a/novaclient/v2/servers.py +++ b/novaclient/v2/servers.py @@ -21,10 +21,7 @@ Server interface. import base64 import collections - -from oslo_utils import encodeutils -import six -from six.moves.urllib import parse +from urllib import parse from novaclient import api_versions from novaclient import base @@ -690,17 +687,11 @@ class ServerManager(base.BootingManagerWithFind): # NOTE(melwitt): Text file data is converted to bytes prior to # base64 encoding. The utf-8 encoding will fail for binary files. - if six.PY3: - try: - userdata = userdata.encode("utf-8") - except AttributeError: - # In python 3, 'bytes' object has no attribute 'encode' - pass - else: - try: - userdata = encodeutils.safe_encode(userdata) - except UnicodeDecodeError: - pass + try: + userdata = userdata.encode("utf-8") + except AttributeError: + # In python 3, 'bytes' object has no attribute 'encode' + pass return base64.b64encode(userdata).decode('utf-8') @@ -761,7 +752,7 @@ class ServerManager(base.BootingManagerWithFind): else: data = file_or_string - if six.PY3 and isinstance(data, str): + if isinstance(data, str): data = data.encode('utf-8') cont = base64.b64encode(data).decode('utf-8') personality.append({ @@ -791,7 +782,7 @@ class ServerManager(base.BootingManagerWithFind): if nics is not None: # With microversion 2.37+ nics can be an enum of 'auto' or 'none' # or a list of dicts. - if isinstance(nics, six.string_types): + if isinstance(nics, str): all_net_data = nics else: # NOTE(tr3buchet): nics can be an empty list @@ -899,7 +890,7 @@ class ServerManager(base.BootingManagerWithFind): for opt, val in search_opts.items(): # support locked=False from 2.73 microversion if val or (opt == 'locked' and val is False): - if isinstance(val, six.text_type): + if isinstance(val, str): val = val.encode('utf-8') qparams[opt] = val diff --git a/novaclient/v2/services.py b/novaclient/v2/services.py index f3d1255dc..7adbf1376 100644 --- a/novaclient/v2/services.py +++ b/novaclient/v2/services.py @@ -14,9 +14,10 @@ # under the License. """ -service interface +Service interface. """ -from six.moves import urllib + +from urllib import parse from novaclient import api_versions from novaclient import base @@ -48,7 +49,7 @@ class ServiceManager(base.ManagerWithFind): if binary: filters.append(("binary", binary)) if filters: - url = "%s?%s" % (url, urllib.parse.urlencode(filters)) + url = "%s?%s" % (url, parse.urlencode(filters)) return self._list(url, "services") @api_versions.wraps("2.0", "2.10") diff --git a/novaclient/v2/shell.py b/novaclient/v2/shell.py index 0f8b5ce6f..d8de74e8f 100644 --- a/novaclient/v2/shell.py +++ b/novaclient/v2/shell.py @@ -31,7 +31,6 @@ import time from oslo_utils import netutils from oslo_utils import strutils from oslo_utils import timeutils -import six import novaclient from novaclient import api_versions @@ -478,7 +477,7 @@ def _boot(cs, args): # NOTE(vish): multiple copies of the same hint will # result in a list of values if key in hints: - if isinstance(hints[key], six.string_types): + if isinstance(hints[key], str): hints[key] = [hints[key]] hints[key] += [value] else: @@ -2447,7 +2446,7 @@ def _print_server(cs, args, server=None, wrap=0): try: networks = server.networks except Exception as e: - raise exceptions.CommandError(six.text_type(e)) + raise exceptions.CommandError(str(e)) info = server.to_dict() for network_label, address_list in networks.items(): @@ -2556,7 +2555,7 @@ def _find_server(cs, server, raise_if_notfound=True, **find_args): return utils.find_resource(cs.servers, server, wrap_exception=False) except exceptions.NoUniqueMatch as e: - raise exceptions.CommandError(six.text_type(e)) + raise exceptions.CommandError(str(e)) except exceptions.NotFound: # The server can be deleted return server @@ -2567,7 +2566,7 @@ def _find_image(cs, image): try: return cs.glance.find_image(image) except (exceptions.NotFound, exceptions.NoUniqueMatch) as e: - raise exceptions.CommandError(six.text_type(e)) + raise exceptions.CommandError(str(e)) def _find_images(cs, images): @@ -2575,7 +2574,7 @@ def _find_images(cs, images): try: return cs.glance.find_images(images) except (exceptions.NotFound, exceptions.NoUniqueMatch) as e: - raise exceptions.CommandError(six.text_type(e)) + raise exceptions.CommandError(str(e)) def _find_flavor(cs, flavor): @@ -2591,7 +2590,7 @@ def _find_network_id(cs, net_name): try: return cs.neutron.find_network(net_name).id except (exceptions.NotFound, exceptions.NoUniqueMatch) as e: - raise exceptions.CommandError(six.text_type(e)) + raise exceptions.CommandError(str(e)) def _print_volume(volume): diff --git a/novaclient/v2/versions.py b/novaclient/v2/versions.py index dd157d9f2..b9895f911 100644 --- a/novaclient/v2/versions.py +++ b/novaclient/v2/versions.py @@ -16,7 +16,7 @@ version interface """ -from six.moves import urllib +from urllib import parse from novaclient import base from novaclient import exceptions as exc @@ -79,7 +79,7 @@ class VersionManager(base.ManagerWithFind): """List all versions.""" endpoint = self.api.client.get_endpoint() - url = urllib.parse.urlparse(endpoint) + url = parse.urlparse(endpoint) # NOTE(andreykurilin): endpoint URL has at least 3 formats: # 1. the classic (legacy) endpoint: # http://{host}:{optional_port}/v{2 or 2.1}/{project-id} diff --git a/requirements.txt b/requirements.txt index 9371e3274..609ea42b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,4 @@ oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 oslo.utils>=3.33.0 # Apache-2.0 PrettyTable<0.8,>=0.7.2 # BSD simplejson>=3.5.1 # MIT -six>=1.10.0 # MIT Babel!=2.4.0,>=2.3.4 # BSD