From c2df9215e19752714e83fcad82c8ae3708f85d7a Mon Sep 17 00:00:00 2001
From: songwenping <songwenping@inspur.com>
Date: Tue, 6 Oct 2020 14:26:27 +0800
Subject: [PATCH] Remove usage of six

With python3.x, classes can use 'metaclass=' instead of
'six.add_metaclass', 'six.iteritems' and 'six.iterkeys' can
be replaced by 'items' and 'keys', 'six.moves.urllib.parse'
can be replaced by 'urllib.parse', 'six.StringIO' and
'six.moves.cStringIO' can be replaced by 'io.StringIO',
'six.text_type' and 'six.string_type' are just 'str'.

Change-Id: I84848c0bf8ab3c36dd821141191e2725e4e3b58b
---
 doc/source/contributor/developing.rst         |  1 -
 lower-constraints.txt                         |  1 -
 openstackclient/api/object_store_v1.py        |  2 +-
 openstackclient/common/sdk_utils.py           |  4 +---
 openstackclient/compute/v2/server.py          |  5 ++---
 openstackclient/identity/v3/access_rule.py    |  3 +--
 openstackclient/network/common.py             | 22 +++++++++----------
 openstackclient/shell.py                      |  8 -------
 .../tests/unit/compute/v2/test_server.py      | 15 ++++++-------
 .../tests/unit/compute/v2/test_service.py     |  5 ++---
 openstackclient/tests/unit/fakes.py           |  3 +--
 openstackclient/tests/unit/object/v1/fakes.py |  3 +--
 .../tests/unit/object/v1/test_object_all.py   |  6 ++---
 openstackclient/tests/unit/utils.py           |  2 +-
 requirements.txt                              |  1 -
 15 files changed, 30 insertions(+), 51 deletions(-)

diff --git a/doc/source/contributor/developing.rst b/doc/source/contributor/developing.rst
index 35c7c7b91f..a319849396 100644
--- a/doc/source/contributor/developing.rst
+++ b/doc/source/contributor/developing.rst
@@ -203,7 +203,6 @@ Example
 
     from osc_lib.api import auth
     from osc_lib import utils
-    import six
 
     from openstackclient import shell
     from openstackclient.tests import utils
diff --git a/lower-constraints.txt b/lower-constraints.txt
index 403ba4e05c..2fa6586e08 100644
--- a/lower-constraints.txt
+++ b/lower-constraints.txt
@@ -119,7 +119,6 @@ rfc3986==0.3.1
 Routes==2.3.1
 rsd-lib==0.1.0
 simplejson==3.5.1
-six==1.10.0
 smmap==0.9.0
 statsd==3.2.1
 stestr==1.0.0
diff --git a/openstackclient/api/object_store_v1.py b/openstackclient/api/object_store_v1.py
index 8092abd06a..67c7923023 100644
--- a/openstackclient/api/object_store_v1.py
+++ b/openstackclient/api/object_store_v1.py
@@ -17,9 +17,9 @@ import io
 import logging
 import os
 import sys
+import urllib
 
 from osc_lib import utils
-from six.moves import urllib
 
 from openstackclient.api import api
 
diff --git a/openstackclient/common/sdk_utils.py b/openstackclient/common/sdk_utils.py
index 9f0856175d..af9c74f944 100644
--- a/openstackclient/common/sdk_utils.py
+++ b/openstackclient/common/sdk_utils.py
@@ -10,8 +10,6 @@
 #   License for the specific language governing permissions and limitations
 #   under the License.
 
-import six
-
 
 def get_osc_show_columns_for_sdk_resource(
     sdk_resource,
@@ -44,7 +42,7 @@ def get_osc_show_columns_for_sdk_resource(
     for col_name in invisible_columns:
         if col_name in display_columns:
             display_columns.remove(col_name)
-    for sdk_attr, osc_attr in six.iteritems(osc_column_map):
+    for sdk_attr, osc_attr in osc_column_map.items():
         if sdk_attr in display_columns:
             attr_map[osc_attr] = sdk_attr
             display_columns.remove(sdk_attr)
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 1d1fc74165..756903f7a1 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -30,7 +30,6 @@ from osc_lib.command import command
 from osc_lib import exceptions
 from osc_lib import utils
 from oslo_utils import timeutils
-import six
 
 from openstackclient.i18n import _
 from openstackclient.identity import common as identity_common
@@ -97,7 +96,7 @@ def _get_ip_address(addresses, address_type, ip_address_family):
     for network in addresses:
         for addy in addresses[network]:
             # Case where it is list of strings
-            if isinstance(addy, six.string_types):
+            if isinstance(addy, str):
                 if new_address_type == 'fixed':
                     return addresses[network][0]
                 else:
@@ -876,7 +875,7 @@ class CreateServer(command.ShowOne):
         boot_args = [parsed_args.server_name, image, flavor]
 
         # Handle block device by device name order, like: vdb -> vdc -> vdd
-        for dev_name in sorted(six.iterkeys(parsed_args.block_device_mapping)):
+        for dev_name in sorted(parsed_args.block_device_mapping):
             dev_map = parsed_args.block_device_mapping[dev_name]
             dev_map = dev_map.split(':')
             if dev_map[0]:
diff --git a/openstackclient/identity/v3/access_rule.py b/openstackclient/identity/v3/access_rule.py
index 65e78be1d0..ffda04f9e5 100644
--- a/openstackclient/identity/v3/access_rule.py
+++ b/openstackclient/identity/v3/access_rule.py
@@ -20,7 +20,6 @@ import logging
 from osc_lib.command import command
 from osc_lib import exceptions
 from osc_lib import utils
-import six
 
 from openstackclient.i18n import _
 from openstackclient.identity import common
@@ -115,4 +114,4 @@ class ShowAccessRule(command.ShowOne):
 
         access_rule._info.pop('links', None)
 
-        return zip(*sorted(six.iteritems(access_rule._info)))
+        return zip(*sorted(access_rule._info.items()))
diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py
index e68628b3f1..47ffbe77a6 100644
--- a/openstackclient/network/common.py
+++ b/openstackclient/network/common.py
@@ -18,7 +18,6 @@ import logging
 import openstack.exceptions
 from osc_lib.command import command
 from osc_lib import exceptions
-import six
 
 from openstackclient.i18n import _
 
@@ -54,8 +53,7 @@ def check_missing_extension_if_error(client_manager, attrs):
         raise
 
 
-@six.add_metaclass(abc.ABCMeta)
-class NetDetectionMixin(object):
+class NetDetectionMixin(metaclass=abc.ABCMeta):
     """Convenience methods for nova-network vs. neutron decisions.
 
     A live environment detects which network type it is running and creates its
@@ -166,8 +164,8 @@ class NetDetectionMixin(object):
         pass
 
 
-@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeCommand(NetDetectionMixin, command.Command):
+class NetworkAndComputeCommand(NetDetectionMixin, command.Command,
+                               metaclass=abc.ABCMeta):
     """Network and Compute Command
 
     Command class for commands that support implementation via
@@ -178,8 +176,8 @@ class NetworkAndComputeCommand(NetDetectionMixin, command.Command):
     pass
 
 
-@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeDelete(NetworkAndComputeCommand):
+class NetworkAndComputeDelete(NetworkAndComputeCommand,
+                              metaclass=abc.ABCMeta):
     """Network and Compute Delete
 
     Delete class for commands that support implementation via
@@ -222,8 +220,8 @@ class NetworkAndComputeDelete(NetworkAndComputeCommand):
             raise exceptions.CommandError(msg)
 
 
-@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeLister(NetDetectionMixin, command.Lister):
+class NetworkAndComputeLister(NetDetectionMixin, command.Lister,
+                              metaclass=abc.ABCMeta):
     """Network and Compute Lister
 
     Lister class for commands that support implementation via
@@ -234,8 +232,8 @@ class NetworkAndComputeLister(NetDetectionMixin, command.Lister):
     pass
 
 
-@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne):
+class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne,
+                               metaclass=abc.ABCMeta):
     """Network and Compute ShowOne
 
     ShowOne class for commands that support implementation via
@@ -255,5 +253,5 @@ class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne):
         except openstack.exceptions.HttpException as exc:
             msg = _("Error while executing command: %s") % exc.message
             if exc.details:
-                msg += ", " + six.text_type(exc.details)
+                msg += ", " + str(exc.details)
             raise exceptions.CommandError(msg)
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index 755af24d2e..bc88e1f1e2 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -16,13 +16,11 @@
 
 """Command-line interface to the OpenStack APIs"""
 
-import locale
 import sys
 
 from osc_lib.api import auth
 from osc_lib.command import commandmanager
 from osc_lib import shell
-import six
 
 import openstackclient
 from openstackclient.common import clientmanager
@@ -143,12 +141,6 @@ class OpenStackShell(shell.OpenStackShell):
 def main(argv=None):
     if argv is None:
         argv = sys.argv[1:]
-        if six.PY2:
-            # Emulate Py3, decode argv into Unicode based on locale so that
-            # commands always see arguments as text instead of binary data
-            encoding = locale.getpreferredencoding()
-            if encoding:
-                argv = map(lambda arg: arg.decode(encoding), argv)
 
     return OpenStackShell().run(argv)
 
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 02bb406c11..2445e1438b 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -24,7 +24,6 @@ from openstack import exceptions as sdk_exceptions
 from osc_lib import exceptions
 from osc_lib import utils as common_utils
 from oslo_utils import timeutils
-import six
 
 from openstackclient.compute.v2 import server
 from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -1907,7 +1906,7 @@ class TestServerCreate(TestServer):
                                self.cmd.take_action, parsed_args)
         # Assert it is the error we expect.
         self.assertIn('--volume is not allowed with --boot-from-volume',
-                      six.text_type(ex))
+                      str(ex))
 
     def test_server_create_image_property(self):
         arglist = [
@@ -3288,7 +3287,7 @@ class TestServerMigrate(TestServer):
         # Make sure it's the error we expect.
         self.assertIn('--os-compute-api-version 2.56 or greater is required '
                       'to use --host without --live-migration.',
-                      six.text_type(ex))
+                      str(ex))
 
         self.servers_mock.get.assert_called_with(self.server.id)
         self.assertNotCalled(self.servers_mock.live_migrate)
@@ -3323,7 +3322,7 @@ class TestServerMigrate(TestServer):
         # A warning should have been logged for using --live.
         mock_warning.assert_called_once()
         self.assertIn('The --live option has been deprecated.',
-                      six.text_type(mock_warning.call_args[0][0]))
+                      str(mock_warning.call_args[0][0]))
 
     def test_server_live_migrate_host_pre_2_30(self):
         # Tests that the --host option is not supported for --live-migration
@@ -3346,7 +3345,7 @@ class TestServerMigrate(TestServer):
 
         # Make sure it's the error we expect.
         self.assertIn('--os-compute-api-version 2.30 or greater is required '
-                      'when using --host', six.text_type(ex))
+                      'when using --host', str(ex))
 
         self.servers_mock.get.assert_called_with(self.server.id)
         self.assertNotCalled(self.servers_mock.live_migrate)
@@ -3436,7 +3435,7 @@ class TestServerMigrate(TestServer):
         # A warning should have been logged for using --live.
         mock_warning.assert_called_once()
         self.assertIn('The --live option has been deprecated.',
-                      six.text_type(mock_warning.call_args[0][0]))
+                      str(mock_warning.call_args[0][0]))
 
     def test_server_live_migrate_live_and_host_mutex(self):
         # Tests specifying both the --live and --host options which are in a
@@ -4352,7 +4351,7 @@ class TestServerResize(TestServer):
         # A warning should have been logged for using --confirm.
         mock_warning.assert_called_once()
         self.assertIn('The --confirm option has been deprecated.',
-                      six.text_type(mock_warning.call_args[0][0]))
+                      str(mock_warning.call_args[0][0]))
 
     def test_server_resize_revert(self):
         arglist = [
@@ -4377,7 +4376,7 @@ class TestServerResize(TestServer):
         # A warning should have been logged for using --revert.
         mock_warning.assert_called_once()
         self.assertIn('The --revert option has been deprecated.',
-                      six.text_type(mock_warning.call_args[0][0]))
+                      str(mock_warning.call_args[0][0]))
 
     @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
     def test_server_resize_with_wait_ok(self, mock_wait_for_status):
diff --git a/openstackclient/tests/unit/compute/v2/test_service.py b/openstackclient/tests/unit/compute/v2/test_service.py
index 7a03683364..87e54747f1 100644
--- a/openstackclient/tests/unit/compute/v2/test_service.py
+++ b/openstackclient/tests/unit/compute/v2/test_service.py
@@ -18,7 +18,6 @@ from unittest.mock import call
 
 from novaclient import api_versions
 from osc_lib import exceptions
-import six
 
 from openstackclient.compute.v2 import service
 from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -502,7 +501,7 @@ class TestServiceSet(TestService):
                                self.cmd._find_service_by_host_and_binary,
                                self.service_mock, 'fake-host', 'nova-compute')
         self.assertIn('Compute service for host "fake-host" and binary '
-                      '"nova-compute" not found.', six.text_type(ex))
+                      '"nova-compute" not found.', str(ex))
 
     def test_service_set_find_service_by_host_and_binary_many_results(self):
         # Tests that more than one compute service is found by host and binary.
@@ -512,4 +511,4 @@ class TestServiceSet(TestService):
                                self.service_mock, 'fake-host', 'nova-compute')
         self.assertIn('Multiple compute services found for host "fake-host" '
                       'and binary "nova-compute". Unable to proceed.',
-                      six.text_type(ex))
+                      str(ex))
diff --git a/openstackclient/tests/unit/fakes.py b/openstackclient/tests/unit/fakes.py
index e5476f06bb..00e0c12925 100644
--- a/openstackclient/tests/unit/fakes.py
+++ b/openstackclient/tests/unit/fakes.py
@@ -19,7 +19,6 @@ from unittest import mock
 
 from keystoneauth1 import fixture
 import requests
-import six
 
 
 AUTH_TOKEN = "foobar"
@@ -253,7 +252,7 @@ class FakeResponse(requests.Response):
 
         self.headers.update(headers)
         self._content = json.dumps(data)
-        if not isinstance(self._content, six.binary_type):
+        if not isinstance(self._content, bytes):
             self._content = self._content.encode()
 
 
diff --git a/openstackclient/tests/unit/object/v1/fakes.py b/openstackclient/tests/unit/object/v1/fakes.py
index 0ed791a5bc..1808d5b7d9 100644
--- a/openstackclient/tests/unit/object/v1/fakes.py
+++ b/openstackclient/tests/unit/object/v1/fakes.py
@@ -14,7 +14,6 @@
 #
 
 from keystoneauth1 import session
-import six
 
 from openstackclient.api import object_store_v1 as object_store
 from openstackclient.tests.unit import utils
@@ -68,7 +67,7 @@ OBJECT = {
     'last_modified': object_modified_1,
 }
 
-object_1_content = six.b('object 1 content')
+object_1_content = b'object 1 content'
 
 OBJECT_2 = {
     'name': object_name_2,
diff --git a/openstackclient/tests/unit/object/v1/test_object_all.py b/openstackclient/tests/unit/object/v1/test_object_all.py
index dd587142fa..7e88409f71 100644
--- a/openstackclient/tests/unit/object/v1/test_object_all.py
+++ b/openstackclient/tests/unit/object/v1/test_object_all.py
@@ -12,11 +12,11 @@
 #
 
 import copy
+import io
 from unittest import mock
 
 from osc_lib import exceptions
 from requests_mock.contrib import fixture
-import six
 
 from openstackclient.object.v1 import object as object_cmds
 from openstackclient.tests.unit.object.v1 import fakes as object_fakes
@@ -241,9 +241,9 @@ class TestObjectSave(TestObjectAll):
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
-        class FakeStdout(six.BytesIO):
+        class FakeStdout(io.BytesIO):
             def __init__(self):
-                six.BytesIO.__init__(self)
+                io.BytesIO.__init__(self)
                 self.context_manager_calls = []
 
             def __enter__(self):
diff --git a/openstackclient/tests/unit/utils.py b/openstackclient/tests/unit/utils.py
index 4f1bc46a98..4130f18e2b 100644
--- a/openstackclient/tests/unit/utils.py
+++ b/openstackclient/tests/unit/utils.py
@@ -14,11 +14,11 @@
 #   under the License.
 #
 
+from io import StringIO
 import os
 
 from cliff import columns as cliff_columns
 import fixtures
-from six.moves import StringIO
 import testtools
 
 from openstackclient.tests.unit import fakes
diff --git a/requirements.txt b/requirements.txt
index 2b7976e59a..64261f97d0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,6 @@
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
 pbr!=2.1.0,>=2.0.0 # Apache-2.0
-six>=1.10.0 # MIT
 
 cliff!=2.9.0,>=2.8.0 # Apache-2.0
 openstacksdk>=0.48.0 # Apache-2.0