diff --git a/nova/tests/functional/libvirt/test_numa_servers.py b/nova/tests/functional/libvirt/test_numa_servers.py
index 28f8463aeaed..40142ee49c7b 100644
--- a/nova/tests/functional/libvirt/test_numa_servers.py
+++ b/nova/tests/functional/libvirt/test_numa_servers.py
@@ -14,7 +14,6 @@
 #    under the License.
 
 import mock
-import six
 import testtools
 
 from oslo_config import cfg
@@ -1110,7 +1109,7 @@ class NUMAServersWithNetworksTest(NUMAServersTestBase):
         # is a cast, but since we are using CastAsCall this will bubble to the
         # API.
         self.assertEqual(500, ex.response.status_code)
-        self.assertIn('NoValidHost', six.text_type(ex))
+        self.assertIn('NoValidHost', str(ex))
 
     def test_cold_migrate_with_physnet(self):
 
@@ -1260,5 +1259,4 @@ class NUMAServersRebuildTests(NUMAServersTestBase):
             client.OpenStackApiException, self._rebuild_server,
             server, self.image_ref_1)
         self.assertEqual(400, ex.response.status_code)
-        self.assertIn("An instance's NUMA topology cannot be changed",
-                      six.text_type(ex))
+        self.assertIn("An instance's NUMA topology cannot be changed", str(ex))
diff --git a/nova/tests/functional/test_boot_from_volume.py b/nova/tests/functional/test_boot_from_volume.py
index 6de676dbd890..8815e6c7c115 100644
--- a/nova/tests/functional/test_boot_from_volume.py
+++ b/nova/tests/functional/test_boot_from_volume.py
@@ -11,7 +11,6 @@
 #    under the License.
 
 import mock
-import six
 
 from nova import context
 from nova import objects
@@ -160,7 +159,7 @@ class BootFromVolumeTest(integrated_helpers._IntegratedTestBase):
                                {'server': server})
         self.assertEqual(400, ex.response.status_code)
         self.assertIn('You specified more local devices than the limit allows',
-                      six.text_type(ex))
+                      str(ex))
 
 
 class BootFromVolumeLargeRequestTest(test.TestCase,
diff --git a/nova/tests/functional/test_conf_max_attach_disk_devices.py b/nova/tests/functional/test_conf_max_attach_disk_devices.py
index 517a65b055e0..4277686446ee 100644
--- a/nova/tests/functional/test_conf_max_attach_disk_devices.py
+++ b/nova/tests/functional/test_conf_max_attach_disk_devices.py
@@ -12,8 +12,6 @@
 
 import time
 
-import six
-
 from nova.tests import fixtures as nova_fixtures
 from nova.tests.functional.api import client
 from nova.tests.functional import integrated_helpers
@@ -103,7 +101,7 @@ class ConfigurableMaxDiskDevicesTest(integrated_helpers._IntegratedTestBase):
         self.assertEqual(403, ex.response.status_code)
         expected = ('The maximum allowed number of disk devices (2) to attach '
                     'to a single instance has been exceeded.')
-        self.assertIn(expected, six.text_type(ex))
+        self.assertIn(expected, str(ex))
         # Verify only one volume is attached (this is a generator)
         attached_vols = list(self.cinder.volume_ids_for_instance(server_id))
         self.assertIn(vol_id, attached_vols)
diff --git a/nova/tests/functional/test_cross_az_attach.py b/nova/tests/functional/test_cross_az_attach.py
index 3cf640201582..3fdcaf6f265c 100644
--- a/nova/tests/functional/test_cross_az_attach.py
+++ b/nova/tests/functional/test_cross_az_attach.py
@@ -10,8 +10,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
-
 from nova import test
 from nova.tests import fixtures as nova_fixtures
 from nova.tests.functional.api import client as api_client
@@ -132,7 +130,7 @@ class CrossAZAttachTestCase(test.TestCase,
         self.assertEqual(400, ex.response.status_code)
         self.assertIn('Server and volumes are not in the same availability '
                       'zone. Server is in: london. Volumes are in: %s' %
-                      self.az, six.text_type(ex))
+                      self.az, str(ex))
 
     def test_cross_az_attach_false_no_volumes(self):
         """A simple test to make sure cross_az_attach=False API validation is
diff --git a/nova/tests/functional/test_server_group.py b/nova/tests/functional/test_server_group.py
index f7f293c817b6..8a29d31dba25 100644
--- a/nova/tests/functional/test_server_group.py
+++ b/nova/tests/functional/test_server_group.py
@@ -15,7 +15,6 @@
 
 import mock
 from oslo_config import cfg
-import six
 
 from nova.compute import instance_actions
 from nova import context
@@ -1020,7 +1019,7 @@ class TestAntiAffinityLiveMigration(test.TestCase,
                                self.admin_api.post_server_action,
                                server['id'], body)
         self.assertEqual(400, ex.response.status_code)
-        self.assertIn('No valid host', six.text_type(ex))
+        self.assertIn('No valid host', str(ex))
 
         # Now start up a 3rd compute service and retry the live migration which
         # should work this time.
diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py
index 8568a8876b9d..13421760a824 100644
--- a/nova/tests/functional/test_servers.py
+++ b/nova/tests/functional/test_servers.py
@@ -29,7 +29,6 @@ from oslo_serialization import jsonutils
 from oslo_utils import fixture as osloutils_fixture
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
-import six
 
 from nova.compute import api as compute_api
 from nova.compute import instance_actions
@@ -778,7 +777,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase):
             expected = ('The maximum allowed number of disk devices (26) to '
                         'attach to a single instance has been exceeded.')
             self.assertEqual(403, ex.response.status_code)
-            self.assertIn(expected, six.text_type(ex))
+            self.assertIn(expected, str(ex))
 
 
 class ServersTestV21(ServersTest):
@@ -1206,7 +1205,7 @@ class ServerTestV269(integrated_helpers._IntegratedTestBase):
                                 self.api.get_servers,
                                 search_opts={'limit': 5})
         self.assertEqual(500, exp.response.status_code)
-        self.assertIn('NovaException', six.text_type(exp))
+        self.assertIn('NovaException', str(exp))
 
     def test_get_servers_detail_marker_in_down_cells(self):
         marker = self.down_cell_insts[2]
@@ -1215,7 +1214,7 @@ class ServerTestV269(integrated_helpers._IntegratedTestBase):
                                 self.api.get_servers,
                                 search_opts={'marker': marker})
         self.assertEqual(500, exp.response.status_code)
-        self.assertIn('oslo_db.exception.DBError', six.text_type(exp))
+        self.assertIn('oslo_db.exception.DBError', str(exp))
 
     def test_get_servers_detail_marker_sorting(self):
         marker = self.up_cell_insts[1]
@@ -1378,7 +1377,7 @@ class ServerRebuildTestCase(integrated_helpers._IntegratedTestBase):
         ex = self.assertRaises(
             client.OpenStackApiException, self.api.api_post,
             '/servers/%s/action' % server['id'], rebuild_req_body)
-        self.assertIn('NoValidHost', six.text_type(ex))
+        self.assertIn('NoValidHost', str(ex))
 
     # A rebuild to the same host should never attempt a rebuild claim.
     @mock.patch('nova.compute.resource_tracker.ResourceTracker.rebuild_claim',
@@ -1518,7 +1517,7 @@ class ServerRebuildTestCase(integrated_helpers._IntegratedTestBase):
         # Assert that we failed because of the image change and not something
         # else.
         self.assertIn('Unable to rebuild with a different image for a '
-                      'volume-backed server', six.text_type(resp))
+                      'volume-backed server', str(resp))
 
 
 class ServersTestV280(integrated_helpers._IntegratedTestBase):
@@ -2279,7 +2278,7 @@ class ServerMovingTests(integrated_helpers.ProviderUsageBaseTestCase):
         ex = self.assertRaises(client.OpenStackApiException,
                                self.api.post_server_action,
                                server['id'], post)
-        self.assertIn("'force' was unexpected", six.text_type(ex))
+        self.assertIn("'force' was unexpected", str(ex))
 
     # NOTE(gibi): there is a similar test in SchedulerOnlyChecksTargetTest but
     # we want this test here as well because ServerMovingTest is a parent class
@@ -2706,7 +2705,7 @@ class ServerMovingTests(integrated_helpers.ProviderUsageBaseTestCase):
         ex = self.assertRaises(client.OpenStackApiException,
                                self.api.post_server_action,
                                server['id'], post)
-        self.assertIn("'force' was unexpected", six.text_type(ex))
+        self.assertIn("'force' was unexpected", str(ex))
 
     def test_live_migrate(self):
         source_hostname = self.compute1.host
@@ -3369,7 +3368,7 @@ class PollUnconfirmedResizesTest(integrated_helpers.ProviderUsageBaseTestCase):
                                self.api.post_server_action,
                                server['id'], {'confirmResize': None})
         self.assertEqual(409, ex.response.status_code)
-        self.assertIn('Service is unavailable at this time', six.text_type(ex))
+        self.assertIn('Service is unavailable at this time', str(ex))
         # Bring the source compute back up and try to confirm the resize which
         # should work since the migration status is still "finished".
         self.restart_compute_service(self.computes['host1'])
@@ -4575,8 +4574,7 @@ class ServerTestV256MultiCellTestCase(ServerTestV256Common):
         # the target host in cell1, it will result in a ComputeHostNotFound
         # error.
         self.assertEqual(400, ex.response.status_code)
-        self.assertIn('Compute host host2 could not be found',
-                      six.text_type(ex))
+        self.assertIn('Compute host host2 could not be found', str(ex))
 
 
 class ServerTestV256SingleCellMultiHostTestCase(ServerTestV256Common):
@@ -5911,7 +5909,7 @@ class UnsupportedPortResourceRequestBasedSchedulingTest(
         self.assertEqual(400, ex.response.status_code)
         self.assertIn('Attaching interfaces with QoS policy is '
                       'not supported for instance',
-                      six.text_type(ex))
+                      str(ex))
 
     @mock.patch('nova.tests.fixtures.NeutronFixture.create_port')
     def test_interface_attach_with_network_create_port_has_resource_request(
@@ -5939,7 +5937,7 @@ class UnsupportedPortResourceRequestBasedSchedulingTest(
         self.assertEqual(400, ex.response.status_code)
         self.assertIn('Using networks with QoS policy is not supported for '
                       'instance',
-                      six.text_type(ex))
+                      str(ex))
 
     @mock.patch('nova.tests.fixtures.NeutronFixture.create_port')
     def test_create_server_with_network_create_port_has_resource_request(
@@ -5974,7 +5972,7 @@ class UnsupportedPortResourceRequestBasedSchedulingTest(
             "Creating servers with ports having resource requests, like a "
             "port with a QoS minimum bandwidth policy, is not supported "
             "until microversion 2.72.",
-            six.text_type(ex))
+            str(ex))
 
     def test_unshelve_not_offloaded_server_with_port_resource_request(
             self):
diff --git a/nova/tests/functional/wsgi/test_servers.py b/nova/tests/functional/wsgi/test_servers.py
index 8dd7ef03ddef..de0d982bb005 100644
--- a/nova/tests/functional/wsgi/test_servers.py
+++ b/nova/tests/functional/wsgi/test_servers.py
@@ -10,8 +10,6 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-import six
-
 from nova.policies import base as base_policies
 from nova.policies import servers as servers_policies
 from nova import test
@@ -357,7 +355,7 @@ class EnforceVolumeBackedForZeroDiskFlavorTestCase(
         ex = self.assertRaises(api_client.OpenStackApiException,
                                self.api.post_server, {'server': server_req})
         self.assertIn('Only volume-backed servers are allowed for flavors '
-                      'with zero disk.', six.text_type(ex))
+                      'with zero disk.', str(ex))
         self.assertEqual(403, ex.response.status_code)
 
     def test_create_volume_backed_server_with_zero_disk_allowed(self):
@@ -415,7 +413,7 @@ class ResizeCheckInstanceHostTestCase(
         ex = self.assertRaises(api_client.OpenStackApiException,
                                self.api.post_server_action, server['id'], req)
         self.assertEqual(409, ex.response.status_code)
-        self.assertIn('Service is unavailable at this time', six.text_type(ex))
+        self.assertIn('Service is unavailable at this time', str(ex))
         # Now bring the source compute service up but disable it. The operation
         # should be allowed in this case since the service is up.
         self.api.put_service(source_service['id'],
@@ -437,8 +435,7 @@ class ResizeCheckInstanceHostTestCase(
         self.assertEqual(409, ex.response.status_code)
         # This error comes from check_instance_state which is processed before
         # check_instance_host.
-        self.assertIn('while it is in vm_state shelved_offloaded',
-                      six.text_type(ex))
+        self.assertIn('while it is in vm_state shelved_offloaded', str(ex))
 
     def test_cold_migrate_source_compute_validation(self):
         self.test_resize_source_compute_validation(resize=False)
diff --git a/nova/tests/functional/wsgi/test_services.py b/nova/tests/functional/wsgi/test_services.py
index f73a79b38961..e5132471306e 100644
--- a/nova/tests/functional/wsgi/test_services.py
+++ b/nova/tests/functional/wsgi/test_services.py
@@ -12,7 +12,6 @@
 
 import os_resource_classes as orc
 import os_traits
-import six
 
 from nova import context as nova_context
 from nova import exception
@@ -83,7 +82,7 @@ class TestServicesAPI(integrated_helpers.ProviderUsageBaseTestCase):
                                self.admin_api.api_delete,
                                '/os-services/%s' % service['id'])
         self.assertIn('Unable to delete compute service that is hosting '
-                      'instances.', six.text_type(ex))
+                      'instances.', str(ex))
         self.assertEqual(409, ex.response.status_code)
 
         # Now delete the instance and wait for it to be gone.
@@ -198,7 +197,7 @@ class TestServicesAPI(integrated_helpers.ProviderUsageBaseTestCase):
                                '/os-services/%s' % service['id'])
         self.assertEqual(409, ex.response.status_code)
         self.assertIn('Unable to delete compute service that has in-progress '
-                      'migrations', six.text_type(ex))
+                      'migrations', str(ex))
         self.assertIn('There are 1 in-progress migrations involving the host',
                       self.stdlog.logger.output)
         # The provider is still around because we did not delete the service.
@@ -243,7 +242,7 @@ class TestServicesAPI(integrated_helpers.ProviderUsageBaseTestCase):
                                '/os-services/%s' % service['id'])
         self.assertEqual(409, ex.response.status_code)
         self.assertIn('Unable to delete compute service that has in-progress '
-                      'migrations', six.text_type(ex))
+                      'migrations', str(ex))
         self.assertIn('There are 1 in-progress migrations involving the host',
                       self.stdlog.logger.output)
         # The provider is still around because we did not delete the service.
diff --git a/nova/tests/unit/api/openstack/compute/test_admin_password.py b/nova/tests/unit/api/openstack/compute/test_admin_password.py
index 48049c73619e..90a4a2983bfb 100644
--- a/nova/tests/unit/api/openstack/compute/test_admin_password.py
+++ b/nova/tests/unit/api/openstack/compute/test_admin_password.py
@@ -14,7 +14,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 import mock
-import six
 import webob
 
 from nova.api.openstack.compute import admin_password as admin_password_v21
@@ -126,8 +125,7 @@ class AdminPasswordTestV21(test.NoDBTestCase):
         ex = self.assertRaises(self.validation_error,
                                self._get_action(),
                                self.fake_req, fakes.FAKE_UUID, body=body)
-        self.assertIn('adminPass. Value: None. None is not of type',
-                      six.text_type(ex))
+        self.assertIn('adminPass. Value: None. None is not of type', str(ex))
 
     def test_change_password_adminpass_none(self):
         body = {'changePassword': None}
diff --git a/nova/tests/unit/api/openstack/compute/test_attach_interfaces.py b/nova/tests/unit/api/openstack/compute/test_attach_interfaces.py
index da917d41188e..26ebab0bea3b 100644
--- a/nova/tests/unit/api/openstack/compute/test_attach_interfaces.py
+++ b/nova/tests/unit/api/openstack/compute/test_attach_interfaces.py
@@ -14,7 +14,6 @@
 #    under the License.
 
 import mock
-import six
 from webob import exc
 
 from nova.api.openstack import common
@@ -325,7 +324,7 @@ class InterfaceAttachTestsV21(test.NoDBTestCase):
             ex = self.assertRaises(
                 exc.HTTPForbidden, self.attachments.create,
                 self.req, FAKE_UUID1, body=body)
-        self.assertIn('Maximum number of ports exceeded', six.text_type(ex))
+        self.assertIn('Maximum number of ports exceeded', str(ex))
 
     def test_detach_interface_with_invalid_state(self):
         def fake_detach_interface_invalid_state(*args, **kwargs):
diff --git a/nova/tests/unit/api/openstack/compute/test_baremetal_nodes.py b/nova/tests/unit/api/openstack/compute/test_baremetal_nodes.py
index 8a3b66162ddc..55a8b0321608 100644
--- a/nova/tests/unit/api/openstack/compute/test_baremetal_nodes.py
+++ b/nova/tests/unit/api/openstack/compute/test_baremetal_nodes.py
@@ -16,7 +16,6 @@
 
 from ironicclient import exc as ironic_exc
 import mock
-import six
 from webob import exc
 
 from nova.api.openstack.compute import baremetal_nodes \
@@ -181,7 +180,7 @@ class BareMetalNodesTestV21(test.NoDBTestCase):
     def test_show_ironic_node_not_found(self, mock_get):
         error = self.assertRaises(exc.HTTPNotFound, self.controller.show,
                                   self.request, 'fake-uuid')
-        self.assertIn('fake-uuid', six.text_type(error))
+        self.assertIn('fake-uuid', str(error))
 
     def test_show_ironic_not_implemented(self):
         with mock.patch.object(self.mod, 'ironic_client', None):
diff --git a/nova/tests/unit/api/openstack/compute/test_create_backup.py b/nova/tests/unit/api/openstack/compute/test_create_backup.py
index afb4c4811f69..f7280a5a3700 100644
--- a/nova/tests/unit/api/openstack/compute/test_create_backup.py
+++ b/nova/tests/unit/api/openstack/compute/test_create_backup.py
@@ -15,7 +15,6 @@
 
 import mock
 from oslo_utils import timeutils
-import six
 import webob
 
 from nova.api.openstack import common
@@ -393,7 +392,7 @@ class CreateBackupTestsV21(admin_only_action_common.CommonMixin,
         mock_check_image.assert_called_once_with(self.context, {})
         mock_is_volume_backed.assert_called_once_with(self.context, instance)
         self.assertIn('Backup is not supported for volume-backed instances',
-                      six.text_type(ex))
+                      str(ex))
 
 
 class CreateBackupTestsV239(test.NoDBTestCase):
diff --git a/nova/tests/unit/api/openstack/compute/test_evacuate.py b/nova/tests/unit/api/openstack/compute/test_evacuate.py
index bf74e55db795..a9a55965a70e 100644
--- a/nova/tests/unit/api/openstack/compute/test_evacuate.py
+++ b/nova/tests/unit/api/openstack/compute/test_evacuate.py
@@ -15,7 +15,6 @@
 import fixtures
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 import testtools
 import webob
 
@@ -390,7 +389,7 @@ class EvacuateTestV268(EvacuateTestV229):
         ex = self._check_evacuate_failure(self.validation_error,
                                           {'host': 'my-host',
                                            'force': 'true'})
-        self.assertIn('force', six.text_type(ex))
+        self.assertIn('force', str(ex))
 
     def test_forced_evacuate_with_no_host_provided(self):
         # not applicable for v2.68, which removed the 'force' parameter
diff --git a/nova/tests/unit/api/openstack/compute/test_flavor_manage.py b/nova/tests/unit/api/openstack/compute/test_flavor_manage.py
index 5950a9b230e8..e6e1c8e26ab1 100644
--- a/nova/tests/unit/api/openstack/compute/test_flavor_manage.py
+++ b/nova/tests/unit/api/openstack/compute/test_flavor_manage.py
@@ -17,7 +17,6 @@ import copy
 
 import mock
 from oslo_serialization import jsonutils
-import six
 import webob
 
 from nova.api.openstack.compute import flavor_access as flavor_access_v21
@@ -74,7 +73,7 @@ class FlavorManageTestV21(test.NoDBTestCase):
                 "vcpus": 2,
                 "disk": 1,
                 "OS-FLV-EXT-DATA:ephemeral": 1,
-                "id": six.text_type('1234'),
+                "id": '1234',
                 "swap": 512,
                 "rxtx_factor": 1,
                 "os-flavor-access:is_public": True,
@@ -117,7 +116,7 @@ class FlavorManageTestV21(test.NoDBTestCase):
                 "vcpus": 2,
                 "disk": 1,
                 "OS-FLV-EXT-DATA:ephemeral": 1,
-                "id": six.text_type('1234'),
+                "id": '1234',
                 "swap": 512,
                 "rxtx_factor": 1,
                 "os-flavor-access:is_public": True,
@@ -343,7 +342,7 @@ class FlavorManageTestV21(test.NoDBTestCase):
         ex = self.assertRaises(
             self.validation_error, self.controller._create,
             self._get_http_request(), body=self.request_body)
-        self.assertIn('description', six.text_type(ex))
+        self.assertIn('description', str(ex))
 
     def test_flavor_update_description(self):
         """With microversion <2.55 this should return a failure."""
diff --git a/nova/tests/unit/api/openstack/compute/test_hypervisors.py b/nova/tests/unit/api/openstack/compute/test_hypervisors.py
index 4a153b7a365a..95fc822326c9 100644
--- a/nova/tests/unit/api/openstack/compute/test_hypervisors.py
+++ b/nova/tests/unit/api/openstack/compute/test_hypervisors.py
@@ -19,7 +19,6 @@ import mock
 import netaddr
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 from webob import exc
 
 from nova.api.openstack.compute import hypervisors \
@@ -1024,7 +1023,7 @@ class HypervisorsTestV253(HypervisorsTestV252):
         ex = self.assertRaises(exc.HTTPBadRequest, self.controller.index, req)
         self.assertIn('Paging over hypervisors with the '
                       'hypervisor_hostname_pattern query parameter is not '
-                      'supported.', six.text_type(ex))
+                      'supported.', str(ex))
 
     def test_servers_with_non_integer_hypervisor_id(self):
         """This is a poorly named test, it's really checking the 404 case where
@@ -1134,7 +1133,7 @@ class HypervisorsTestV253(HypervisorsTestV252):
         req = self._get_request(True)
         ex = self.assertRaises(exc.HTTPBadRequest,
                                self.controller.show, req, '1')
-        self.assertIn('Invalid uuid 1', six.text_type(ex))
+        self.assertIn('Invalid uuid 1', str(ex))
 
     def test_show_with_servers_invalid_parameter(self):
         """Tests passing an invalid value for the with_servers query parameter
@@ -1146,7 +1145,7 @@ class HypervisorsTestV253(HypervisorsTestV252):
             url='/os-hypervisors/%s?with_servers=invalid' % hyper_id)
         ex = self.assertRaises(
             exception.ValidationError, self.controller.show, req, hyper_id)
-        self.assertIn('with_servers', six.text_type(ex))
+        self.assertIn('with_servers', str(ex))
 
     def test_show_with_servers_host_mapping_not_found(self):
         """Tests that a 404 is returned if instance_get_all_by_host raises
@@ -1195,7 +1194,7 @@ class HypervisorsTestV253(HypervisorsTestV252):
         req = self._get_request(True)
         ex = self.assertRaises(exc.HTTPBadRequest,
                                self.controller.uptime, req, '1')
-        self.assertIn('Invalid uuid 1', six.text_type(ex))
+        self.assertIn('Invalid uuid 1', str(ex))
 
     def test_detail_pagination(self):
         """Tests details paging with uuid markers."""
diff --git a/nova/tests/unit/api/openstack/compute/test_instance_actions.py b/nova/tests/unit/api/openstack/compute/test_instance_actions.py
index 503ab1f6c1c9..fc6fd0d2113a 100644
--- a/nova/tests/unit/api/openstack/compute/test_instance_actions.py
+++ b/nova/tests/unit/api/openstack/compute/test_instance_actions.py
@@ -20,7 +20,6 @@ import iso8601
 import mock
 from oslo_policy import policy as oslo_policy
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 from webob import exc
 
 from nova.api.openstack.compute import instance_actions as instance_actions_v21
@@ -273,7 +272,7 @@ class InstanceActionsTestV258(InstanceActionsTestV251):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
         self.assertIn('Invalid input for query parameters changes-since',
-                      six.text_type(ex))
+                      str(ex))
 
     def test_get_action_with_invalid_params(self):
         """Tests get paging with a invalid change_since."""
@@ -281,16 +280,14 @@ class InstanceActionsTestV258(InstanceActionsTestV251):
                                  'wrong_params=xxx')
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     def test_get_action_with_multi_params(self):
         """Tests get paging with multi markers."""
         req = self._get_http_req('os-instance-actions?marker=A&marker=B')
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Invalid input for query parameters marker',
-                      six.text_type(ex))
+        self.assertIn('Invalid input for query parameters marker', str(ex))
 
 
 class InstanceActionsTestV262(InstanceActionsTestV258):
@@ -367,7 +364,7 @@ class InstanceActionsTestV266(InstanceActionsTestV258):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
         self.assertIn('Invalid input for query parameters changes-before',
-                      six.text_type(ex))
+                      str(ex))
 
     @mock.patch('nova.compute.api.InstanceActionAPI.actions_get')
     @mock.patch('nova.api.openstack.common.get_instance')
@@ -401,7 +398,7 @@ class InstanceActionsTestV266(InstanceActionsTestV258):
         ex = self.assertRaises(exc.HTTPBadRequest, self.controller.index,
                                req, FAKE_UUID)
         self.assertIn('The value of changes-since must be less than '
-                      'or equal to changes-before', six.text_type(ex))
+                      'or equal to changes-before', str(ex))
 
     def test_get_action_with_changes_before_old_microversion(self):
         """Tests that the changes-before query parameter is an error before
@@ -414,7 +411,7 @@ class InstanceActionsTestV266(InstanceActionsTestV258):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
         detail = 'Additional properties are not allowed'
-        self.assertIn(detail, six.text_type(ex))
+        self.assertIn(detail, str(ex))
 
 
 class InstanceActionsTestV284(InstanceActionsTestV266):
diff --git a/nova/tests/unit/api/openstack/compute/test_lock_server.py b/nova/tests/unit/api/openstack/compute/test_lock_server.py
index c5bed64cc5a4..a605e2bcdb4f 100644
--- a/nova/tests/unit/api/openstack/compute/test_lock_server.py
+++ b/nova/tests/unit/api/openstack/compute/test_lock_server.py
@@ -14,7 +14,6 @@
 #    under the License.
 
 import mock
-import six
 
 from nova.api.openstack import api_version_request
 from nova.api.openstack import common
@@ -103,7 +102,7 @@ class LockServerTestsV273(LockServerTestsV21):
 
         exp = self.assertRaises(exception.ValidationError,
             self.controller._lock, self.req, instance.uuid, body=body)
-        self.assertIn('is too long', six.text_type(exp))
+        self.assertIn('is too long', str(exp))
 
     def test_lock_with_reason_in_invalid_format(self):
         instance = fake_instance.fake_instance_obj(
@@ -113,7 +112,7 @@ class LockServerTestsV273(LockServerTestsV21):
 
         exp = self.assertRaises(exception.ValidationError,
             self.controller._lock, self.req, instance.uuid, body=body)
-        self.assertIn("256 is not of type 'string'", six.text_type(exp))
+        self.assertIn("256 is not of type 'string'", str(exp))
 
     def test_lock_with_invalid_paramater(self):
         # This will fail from 2.73 since we have a schema check that allows
@@ -124,4 +123,4 @@ class LockServerTestsV273(LockServerTestsV21):
 
         exp = self.assertRaises(exception.ValidationError,
             self.controller._lock, self.req, instance.uuid, body=body)
-        self.assertIn("('blah' was unexpected)", six.text_type(exp))
+        self.assertIn("('blah' was unexpected)", str(exp))
diff --git a/nova/tests/unit/api/openstack/compute/test_migrate_server.py b/nova/tests/unit/api/openstack/compute/test_migrate_server.py
index 632b7c7cff8e..5928fe3e56cc 100644
--- a/nova/tests/unit/api/openstack/compute/test_migrate_server.py
+++ b/nova/tests/unit/api/openstack/compute/test_migrate_server.py
@@ -17,7 +17,6 @@ import fixtures
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import uuidutils
-import six
 import webob
 
 from nova.api.openstack import api_version_request
@@ -226,7 +225,7 @@ class MigrateServerTestsV21(admin_only_action_common.CommonTests):
                                    self.controller._migrate_live,
                                    self.req, instance.uuid, body=body)
             if check_response:
-                self.assertIn(six.text_type(fake_exc), ex.explanation)
+                self.assertIn(str(fake_exc), ex.explanation)
             mock_live_migrate.assert_called_once_with(
                 self.context, instance, False, self.disk_over_commit,
                 'hostname', self.force, self.async_)
@@ -601,7 +600,7 @@ class MigrateServerTestsV268(MigrateServerTestsV256):
                                self.req, fakes.FAKE_UUID, body=body)
         self.assertIn("Operation 'live-migration' not supported for "
                       "SEV-enabled instance (%s)" % instance.uuid,
-                      six.text_type(ex))
+                      str(ex))
 
     def test_live_migrate_with_forced_host(self):
         body = {'os-migrateLive': {'host': 'hostname',
@@ -610,4 +609,4 @@ class MigrateServerTestsV268(MigrateServerTestsV256):
         ex = self.assertRaises(self.validation_error,
                                self.controller._migrate_live,
                                self.req, fakes.FAKE_UUID, body=body)
-        self.assertIn('force', six.text_type(ex))
+        self.assertIn('force', str(ex))
diff --git a/nova/tests/unit/api/openstack/compute/test_migrations.py b/nova/tests/unit/api/openstack/compute/test_migrations.py
index edd1197a75ad..a06d395bea4d 100644
--- a/nova/tests/unit/api/openstack/compute/test_migrations.py
+++ b/nova/tests/unit/api/openstack/compute/test_migrations.py
@@ -17,7 +17,6 @@ import datetime
 import iso8601
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 from webob import exc
 
 from nova.api.openstack.compute import migrations as migrations_v21
@@ -314,7 +313,7 @@ class MigrationsTestCaseV259(MigrationsTestCaseV223):
                               self.controller.index, req)
         self.assertEqual(
             "Marker %s could not be found." % uuids.invalid_marker,
-            six.text_type(e))
+            str(e))
 
     def test_index_with_invalid_limit(self):
         """Tests detail paging with an invalid limit."""
@@ -344,8 +343,7 @@ class MigrationsTestCaseV259(MigrationsTestCaseV223):
             version=self.wsgi_api_version, use_admin_context=True)
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     @mock.patch('nova.compute.api.API.get_migrations',
                 return_value=objects.MigrationList())
@@ -413,7 +411,7 @@ class MigrationTestCaseV266(MigrationsTestCaseV259):
                                       use_admin_context=True)
         ex = self.assertRaises(exc.HTTPBadRequest, self.controller.index, req)
         self.assertIn('The value of changes-since must be less than '
-                      'or equal to changes-before', six.text_type(ex))
+                      'or equal to changes-before', str(ex))
 
     def test_index_with_changes_before_old_microversion_failed(self):
         """Tests that the changes-before query parameter is an error before
@@ -427,8 +425,7 @@ class MigrationTestCaseV266(MigrationsTestCaseV259):
             version='2.65', use_admin_context=True)
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     @mock.patch('nova.compute.api.API.get_migrations',
                 return_value=objects.MigrationList())
@@ -490,8 +487,7 @@ class MigrationsTestCaseV280(MigrationTestCaseV266):
             version='2.79', use_admin_context=True)
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     def test_index_filter_by_project_id_pre_v280(self):
         """Tests that the migrations by project_id query parameter
@@ -502,5 +498,4 @@ class MigrationsTestCaseV280(MigrationTestCaseV266):
             version='2.79', use_admin_context=True)
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.index, req)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
diff --git a/nova/tests/unit/api/openstack/compute/test_server_external_events.py b/nova/tests/unit/api/openstack/compute/test_server_external_events.py
index ce042b544231..2ca97fc6d864 100644
--- a/nova/tests/unit/api/openstack/compute/test_server_external_events.py
+++ b/nova/tests/unit/api/openstack/compute/test_server_external_events.py
@@ -15,7 +15,6 @@
 import fixtures as fx
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.api.openstack.compute import server_external_events \
                                                  as server_external_events_v21
@@ -260,8 +259,7 @@ class ServerExternalEventsTestV276(ServerExternalEventsTestV21):
                 self.api.create,
                 req,
                 body=body)
-        self.assertIn('Invalid input for field/attribute name.',
-                      six.text_type(exp))
+        self.assertIn('Invalid input for field/attribute name.', str(exp))
 
 
 @mock.patch('nova.objects.InstanceMappingList.get_by_instance_uuids',
diff --git a/nova/tests/unit/api/openstack/compute/test_server_groups.py b/nova/tests/unit/api/openstack/compute/test_server_groups.py
index a5fa29985824..e7626ee73315 100644
--- a/nova/tests/unit/api/openstack/compute/test_server_groups.py
+++ b/nova/tests/unit/api/openstack/compute/test_server_groups.py
@@ -17,7 +17,6 @@ import copy
 import mock
 from oslo_utils.fixture import uuidsentinel
 from oslo_utils import uuidutils
-import six
 import webob
 
 from nova.api.openstack import api_version_request as avr
@@ -139,7 +138,7 @@ class ServerGroupTestV21(test.NoDBTestCase):
             req, body={'server_group': sgroup})
         self.assertIn(
             "Invalid input for field/attribute server_group",
-            six.text_type(result)
+            str(result)
         )
         # 'rules' isn't an acceptable request key before 2.64
         sgroup = server_group_template(rules=rules)
@@ -148,7 +147,7 @@ class ServerGroupTestV21(test.NoDBTestCase):
             req, body={'server_group': sgroup})
         self.assertIn(
             "Invalid input for field/attribute server_group",
-            six.text_type(result)
+            str(result)
         )
 
     def test_create_server_group(self):
@@ -772,8 +771,7 @@ class ServerGroupTestV264(ServerGroupTestV213):
                                        rules={'max_server_per_host': 3})
         result = self.assertRaises(webob.exc.HTTPBadRequest,
             self.controller.create, req, body={'server_group': sgroup})
-        self.assertIn("Only anti-affinity policy supports rules",
-                      six.text_type(result))
+        self.assertIn("Only anti-affinity policy supports rules", str(result))
 
     def test_create_anti_affinity_server_group_with_invalid_rules(self):
         req = fakes.HTTPRequest.blank('', version=self.wsgi_api_version)
@@ -789,7 +787,7 @@ class ServerGroupTestV264(ServerGroupTestV213):
                 self.validation_error, self.controller.create,
                 req, body={'server_group': sgroup})
             self.assertIn(
-                "Invalid input for field/attribute", six.text_type(result)
+                "Invalid input for field/attribute", str(result)
             )
 
     @mock.patch('nova.objects.service.get_minimum_version_all_cells',
@@ -804,7 +802,7 @@ class ServerGroupTestV264(ServerGroupTestV213):
             self.controller.create, req, body={'server_group': sgroup})
         self.assertIn("Creating an anti-affinity group with rule "
                       "max_server_per_host > 1 is not yet supported.",
-                      six.text_type(result))
+                      str(result))
 
     def test_create_server_group(self):
         policies = ['affinity', 'anti-affinity']
diff --git a/nova/tests/unit/api/openstack/compute/test_server_start_stop.py b/nova/tests/unit/api/openstack/compute/test_server_start_stop.py
index f3d8ba72bcfa..eb7be448f591 100644
--- a/nova/tests/unit/api/openstack/compute/test_server_start_stop.py
+++ b/nova/tests/unit/api/openstack/compute/test_server_start_stop.py
@@ -15,7 +15,6 @@
 import mock
 from oslo_policy import policy as oslo_policy
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 import webob
 
 from nova.api.openstack.compute import servers \
@@ -72,7 +71,7 @@ class ServerStartStopTestV21(test.TestCase):
         body = dict(start="")
         ex = self.assertRaises(webob.exc.HTTPConflict,
             self.controller._start_server, self.req, uuids.instance, body)
-        self.assertIn('is locked', six.text_type(ex))
+        self.assertIn('is locked', str(ex))
 
     @mock.patch.object(compute_api.API, 'stop')
     def test_stop(self, stop_mock):
@@ -95,7 +94,7 @@ class ServerStartStopTestV21(test.TestCase):
         body = dict(stop="")
         ex = self.assertRaises(webob.exc.HTTPConflict,
             self.controller._stop_server, self.req, uuids.instance, body)
-        self.assertIn('is locked', six.text_type(ex))
+        self.assertIn('is locked', str(ex))
 
     @mock.patch.object(compute_api.API, 'stop',
                        side_effect=exception.InstanceIsLocked(
diff --git a/nova/tests/unit/api/openstack/compute/test_servers.py b/nova/tests/unit/api/openstack/compute/test_servers.py
index 6486110d3dee..b384c73f36a1 100644
--- a/nova/tests/unit/api/openstack/compute/test_servers.py
+++ b/nova/tests/unit/api/openstack/compute/test_servers.py
@@ -32,7 +32,6 @@ from oslo_utils import fixture as utils_fixture
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
-import six
 import testtools
 import webob
 
@@ -311,7 +310,7 @@ class ServersControllerTest(ControllerTest):
                                self.controller._get_requested_networks,
                                requested_networks)
         self.assertIn('Bad networks format: network uuid is not in proper '
-                      'format', six.text_type(ex))
+                      'format', str(ex))
 
     def test_requested_networks_enabled_with_port(self):
         port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
@@ -2620,7 +2619,7 @@ class ServersControllerTestV273(ControllerTest):
         req = self.req(self.path_with_query % 'locked=price')
         exp = self.assertRaises(webob.exc.HTTPBadRequest,
                                 self.controller.index, req)
-        self.assertIn("Unrecognized value 'price'", six.text_type(exp))
+        self.assertIn("Unrecognized value 'price'", str(exp))
 
     def test_get_servers_with_locked_filter_empty_value(self):
         def fake_get_all(context, search_opts=None,
@@ -2637,7 +2636,7 @@ class ServersControllerTestV273(ControllerTest):
         req = self.req(self.path_with_query % 'locked=')
         exp = self.assertRaises(webob.exc.HTTPBadRequest,
                                 self.controller.index, req)
-        self.assertIn("Unrecognized value ''", six.text_type(exp))
+        self.assertIn("Unrecognized value ''", str(exp))
 
     def test_get_servers_with_locked_sort_key(self):
         def fake_get_all(context, search_opts=None,
@@ -3331,7 +3330,7 @@ class ServersControllerRebuildTestV254(ServersControllerRebuildInstanceTest):
         excpt = self.assertRaises(exception.ValidationError,
                                   self.controller._action_rebuild,
                                   self.req, FAKE_UUID, body=body)
-        self.assertIn('key_name', six.text_type(excpt))
+        self.assertIn('key_name', str(excpt))
 
     def test_rebuild_with_not_existed_keypair_name(self):
         body = {
@@ -3445,7 +3444,7 @@ class ServersControllerRebuildTestV257(ServersControllerRebuildTestV254):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=body)
-        self.assertIn('personality', six.text_type(ex))
+        self.assertIn('personality', str(ex))
 
     def test_rebuild_user_data_old_version(self):
         """Tests that trying to rebuild with user_data before 2.57 fails."""
@@ -3460,7 +3459,7 @@ class ServersControllerRebuildTestV257(ServersControllerRebuildTestV254):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=body)
-        self.assertIn('user_data', six.text_type(ex))
+        self.assertIn('user_data', str(ex))
 
     def test_rebuild_user_data_malformed(self):
         """Tests that trying to rebuild with malformed user_data fails."""
@@ -3473,7 +3472,7 @@ class ServersControllerRebuildTestV257(ServersControllerRebuildTestV254):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=body)
-        self.assertIn('user_data', six.text_type(ex))
+        self.assertIn('user_data', str(ex))
 
     def test_rebuild_user_data_too_large(self):
         """Tests that passing user_data to rebuild that is too large fails."""
@@ -3486,7 +3485,7 @@ class ServersControllerRebuildTestV257(ServersControllerRebuildTestV254):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=body)
-        self.assertIn('user_data', six.text_type(ex))
+        self.assertIn('user_data', str(ex))
 
     @mock.patch.object(context.RequestContext, 'can')
     @mock.patch('nova.db.api.instance_update_and_get_original')
@@ -3660,7 +3659,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('is too short', six.text_type(ex))
+        self.assertIn('is too short', str(ex))
 
     def test_rebuild_server_with_empty_trusted_certs(self):
         """Make sure that we can't rebuild with an empty array of IDs"""
@@ -3669,7 +3668,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('is too short', six.text_type(ex))
+        self.assertIn('is too short', str(ex))
 
     def test_rebuild_server_with_too_many_trusted_certs(self):
         """Make sure that we can't rebuild with an array of >50 unique IDs"""
@@ -3679,7 +3678,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('is too long', six.text_type(ex))
+        self.assertIn('is too long', str(ex))
 
     def test_rebuild_server_with_nonunique_trusted_certs(self):
         """Make sure that we can't rebuild with a non-unique array of IDs"""
@@ -3688,7 +3687,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('has non-unique elements', six.text_type(ex))
+        self.assertIn('has non-unique elements', str(ex))
 
     def test_rebuild_server_with_invalid_trusted_cert_id(self):
         """Make sure that we can't rebuild with non-string certificate IDs"""
@@ -3697,7 +3696,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('is not of type', six.text_type(ex))
+        self.assertIn('is not of type', str(ex))
 
     def test_rebuild_server_with_invalid_trusted_certs(self):
         """Make sure that we can't rebuild with certificates in a non-array"""
@@ -3706,7 +3705,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('is not of type', six.text_type(ex))
+        self.assertIn('is not of type', str(ex))
 
     def test_rebuild_server_with_trusted_certs_pre_2_63_fails(self):
         """Make sure we can't use trusted_certs before 2.63"""
@@ -3716,8 +3715,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller._action_rebuild,
                                self.req, FAKE_UUID, body=self.body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     def test_rebuild_server_with_trusted_certs_policy_failed(self):
         rule_name = "os_compute_api:servers:rebuild:trusted_certs"
@@ -3740,8 +3738,7 @@ class ServersControllerRebuildTestV263(ControllerTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._rebuild_server,
                                certs=['trusted-cert-id'])
-        self.assertIn('test cert validation error',
-                      six.text_type(ex))
+        self.assertIn('test cert validation error', str(ex))
 
 
 class ServersControllerRebuildTestV271(ControllerTest):
@@ -4335,7 +4332,7 @@ class ServersControllerCreateTest(test.TestCase):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._test_create_instance,
                                flavor=1324)
-        self.assertEqual('Flavor 1324 could not be found.', six.text_type(ex))
+        self.assertEqual('Flavor 1324 could not be found.', str(ex))
 
     def test_create_server_bad_image_uuid(self):
         self.body['server']['min_count'] = 1
@@ -4447,7 +4444,7 @@ class ServersControllerCreateTest(test.TestCase):
                                self.controller.create,
                                self.req, body=self.body)
         # Make sure the failure was about user_data and not something else.
-        self.assertIn('user_data', six.text_type(ex))
+        self.assertIn('user_data', str(ex))
 
     @mock.patch.object(compute_api.API, 'create',
                        side_effect=exception.NetworkRequiresSubnet(
@@ -6343,7 +6340,7 @@ class ServersControllerCreateTest(test.TestCase):
         # Tests that PciRequestAliasNotDefined is translated to a 400 error.
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._test_create_extra, {})
-        self.assertIn('PCI alias fake_name is not defined', six.text_type(ex))
+        self.assertIn('PCI alias fake_name is not defined', str(ex))
 
     @mock.patch.object(compute_api.API, 'create',
                        side_effect=exception.PciInvalidAlias(
@@ -6352,7 +6349,7 @@ class ServersControllerCreateTest(test.TestCase):
         # Tests that PciInvalidAlias is translated to a 400 error.
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._test_create_extra, {})
-        self.assertIn('Invalid PCI alias definition', six.text_type(ex))
+        self.assertIn('Invalid PCI alias definition', str(ex))
 
     def test_create_instance_with_user_data(self):
         value = base64.encode_as_text("A random string")
@@ -6577,7 +6574,7 @@ class ServersControllerCreateTestV237(test.NoDBTestCase):
         ex = self.assertRaises(
             webob.exc.HTTPBadRequest, self._create_server, 'auto')
         # make sure it was a flavor not found error and not something else
-        self.assertIn('Flavor 2 could not be found', six.text_type(ex))
+        self.assertIn('Flavor 2 could not be found', str(ex))
 
     @mock.patch.object(objects.Flavor, 'get_by_flavor_id',
                        side_effect=exception.FlavorNotFound(flavor_id='2'))
@@ -6589,7 +6586,7 @@ class ServersControllerCreateTestV237(test.NoDBTestCase):
         ex = self.assertRaises(
             webob.exc.HTTPBadRequest, self._create_server, 'none')
         # make sure it was a flavor not found error and not something else
-        self.assertIn('Flavor 2 could not be found', six.text_type(ex))
+        self.assertIn('Flavor 2 could not be found', str(ex))
 
     @mock.patch.object(objects.Flavor, 'get_by_flavor_id',
                        side_effect=exception.FlavorNotFound(flavor_id='2'))
@@ -6604,7 +6601,7 @@ class ServersControllerCreateTestV237(test.NoDBTestCase):
                 [{'uuid': 'e3b686a8-b91d-4a61-a3fc-1b74bb619ddb'},
                  {'uuid': 'e0f00941-f85f-46ec-9315-96ded58c2f14'}])
         # make sure it was a flavor not found error and not something else
-        self.assertIn('Flavor 2 could not be found', six.text_type(ex))
+        self.assertIn('Flavor 2 could not be found', str(ex))
 
     def test_create_server_legacy_neutron_network_id_fails(self):
         """Tests that we no longer support the legacy br-<uuid> format for
@@ -6688,7 +6685,7 @@ class ServersControllerCreateTestV257(test.NoDBTestCase):
         req.headers['content-type'] = 'application/json'
         ex = self.assertRaises(
             exception.ValidationError, controller.create, req, body=body)
-        self.assertIn('personality', six.text_type(ex))
+        self.assertIn('personality', str(ex))
 
 
 @mock.patch('nova.compute.utils.check_num_instances_quota',
@@ -6745,7 +6742,7 @@ class ServersControllerCreateTestV260(test.NoDBTestCase):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._post_server, '2.59')
         self.assertIn('Multiattach volumes are only supported starting with '
-                      'compute API version 2.60', six.text_type(ex))
+                      'compute API version 2.60', str(ex))
 
 
 class ServersControllerCreateTestV263(ServersControllerCreateTest):
@@ -6779,7 +6776,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('is too short', six.text_type(ex))
+        self.assertIn('is too short', str(ex))
 
     def test_create_instance_with_empty_trusted_certs(self):
         """Make sure we can't create with an empty array of IDs"""
@@ -6790,7 +6787,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('is too short', six.text_type(ex))
+        self.assertIn('is too short', str(ex))
 
     def test_create_instance_with_too_many_trusted_certs(self):
         """Make sure we can't create with an array of >50 unique IDs"""
@@ -6798,7 +6795,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('is too long', six.text_type(ex))
+        self.assertIn('is too long', str(ex))
 
     def test_create_instance_with_nonunique_trusted_certs(self):
         """Make sure we can't create with a non-unique array of IDs"""
@@ -6806,7 +6803,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('has non-unique elements', six.text_type(ex))
+        self.assertIn('has non-unique elements', str(ex))
 
     def test_create_instance_with_invalid_trusted_cert_id(self):
         """Make sure we can't create with non-string certificate IDs"""
@@ -6814,7 +6811,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('is not of type', six.text_type(ex))
+        self.assertIn('is not of type', str(ex))
 
     def test_create_instance_with_invalid_trusted_certs(self):
         """Make sure we can't create with certificates in a non-array"""
@@ -6822,7 +6819,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('is not of type', six.text_type(ex))
+        self.assertIn('is not of type', str(ex))
 
     def test_create_server_with_trusted_certs_pre_2_63_fails(self):
         """Make sure we can't use trusted_certs before 2.63"""
@@ -6832,8 +6829,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     def test_create_server_with_trusted_certs_policy_failed(self):
         rule_name = "os_compute_api:servers:create:trusted_certs"
@@ -6861,8 +6857,7 @@ class ServersControllerCreateTestV263(ServersControllerCreateTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.create, self.req,
                                body=self.body)
-        self.assertIn('test cert validation error',
-                      six.text_type(ex))
+        self.assertIn('test cert validation error', str(ex))
 
 
 class ServersControllerCreateTestV267(ServersControllerCreateTest):
@@ -6894,7 +6889,7 @@ class ServersControllerCreateTestV267(ServersControllerCreateTest):
         ex = self.assertRaises(
             exception.ValidationError, self.controller.create, self.req,
             body=self.body)
-        self.assertIn("'volume_type' was unexpected", six.text_type(ex))
+        self.assertIn("'volume_type' was unexpected", str(ex))
 
     @mock.patch.object(compute_api.API, 'create',
                        side_effect=exception.VolumeTypeNotFound(
@@ -6906,8 +6901,7 @@ class ServersControllerCreateTestV267(ServersControllerCreateTest):
         params = {'block_device_mapping_v2': self.block_device_mapping_v2}
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self._test_create_extra, params)
-        self.assertIn('Volume type fake-lvm-1 could not be found',
-                      six.text_type(ex))
+        self.assertIn('Volume type fake-lvm-1 could not be found', str(ex))
 
     def test_create_instance_with_volume_type_empty_string(self):
         """Test passing volume_type='' which is accepted but not used."""
@@ -6933,7 +6927,7 @@ class ServersControllerCreateTestV267(ServersControllerCreateTest):
         params = {'block_device_mapping_v2': self.block_device_mapping_v2}
         ex = self.assertRaises(exception.ValidationError,
                                self._test_create_extra, params)
-        self.assertIn('is too long', six.text_type(ex))
+        self.assertIn('is too long', str(ex))
 
 
 class ServersControllerCreateTestV274(ServersControllerCreateTest):
@@ -6965,8 +6959,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn('Compute host node-invalid could not be found.',
-                      six.text_type(ex))
+        self.assertIn('Compute host node-invalid could not be found.', str(ex))
 
     def test_create_instance_with_non_string_host(self):
         self._generate_req(host=123)
@@ -6974,8 +6967,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn("Invalid input for field/attribute host.",
-                      six.text_type(ex))
+        self.assertIn("Invalid input for field/attribute host.", str(ex))
 
     def test_create_instance_with_invalid_hypervisor_hostname(self):
         get_resp = mock.Mock()
@@ -6987,8 +6979,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn('Compute host node-invalid could not be found.',
-                      six.text_type(ex))
+        self.assertIn('Compute host node-invalid could not be found.', str(ex))
 
     def test_create_instance_with_non_string_hypervisor_hostname(self):
         get_resp = mock.Mock()
@@ -7001,7 +6992,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
                                self.controller.create,
                                self.req, body=self.body)
         self.assertIn("Invalid input for field/attribute hypervisor_hostname.",
-                      six.text_type(ex))
+                      str(ex))
 
     def test_create_instance_with_invalid_host_and_hypervisor_hostname(self):
         self._generate_req(host='host-invalid', node='node-invalid')
@@ -7009,8 +7000,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn('Compute host host-invalid could not be found.',
-                      six.text_type(ex))
+        self.assertIn('Compute host host-invalid could not be found.', str(ex))
 
     def test_create_instance_with_non_string_host_and_hypervisor_hostname(
             self):
@@ -7019,8 +7009,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn("Invalid input for field/attribute",
-                      six.text_type(ex))
+        self.assertIn("Invalid input for field/attribute", str(ex))
 
     def test_create_instance_pre_274(self):
         self._generate_req(host='host', node='node', api_version='2.73')
@@ -7028,8 +7017,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn("Invalid input for field/attribute server.",
-                      six.text_type(ex))
+        self.assertIn("Invalid input for field/attribute server.", str(ex))
 
     def test_create_instance_mutual(self):
         self._generate_req(host='host', node='node', az='nova:host:node')
@@ -7037,7 +7025,7 @@ class ServersControllerCreateTestV274(ServersControllerCreateTest):
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.create,
                                self.req, body=self.body)
-        self.assertIn("mutually exclusive", six.text_type(ex))
+        self.assertIn("mutually exclusive", str(ex))
 
     def test_create_instance_private_flavor(self):
         # Here we use admin context, so if we do not pass it or
diff --git a/nova/tests/unit/api/openstack/compute/test_services.py b/nova/tests/unit/api/openstack/compute/test_services.py
index 170b39f20844..8d77ad0d9fe4 100644
--- a/nova/tests/unit/api/openstack/compute/test_services.py
+++ b/nova/tests/unit/api/openstack/compute/test_services.py
@@ -20,7 +20,6 @@ from keystoneauth1 import exceptions as ks_exc
 import mock
 from oslo_utils import fixture as utils_fixture
 from oslo_utils.fixture import uuidsentinel
-import six
 import webob.exc
 
 from nova.api.openstack.compute import services as services_v21
@@ -1191,13 +1190,13 @@ class ServicesTestV253(test.TestCase):
         """Tests that the service uuid is validated in a DELETE request."""
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.delete, self.req, 1234)
-        self.assertIn('Invalid uuid', six.text_type(ex))
+        self.assertIn('Invalid uuid', str(ex))
 
     def test_update_invalid_service_uuid(self):
         """Tests that the service uuid is validated in a PUT request."""
         ex = self.assertRaises(webob.exc.HTTPBadRequest,
                                self.controller.update, self.req, 1234, body={})
-        self.assertIn('Invalid uuid', six.text_type(ex))
+        self.assertIn('Invalid uuid', str(ex))
 
     def test_update_policy_failed(self):
         """Tests that policy is checked with microversion 2.53."""
@@ -1270,7 +1269,7 @@ class ServicesTestV253(test.TestCase):
                                body={'status': 'enabled',
                                      'disabled_reason': 'invalid'})
         self.assertIn("Specifying 'disabled_reason' with status 'enabled' "
-                      "is invalid.", six.text_type(ex))
+                      "is invalid.", str(ex))
 
     def test_update_disabled_reason_and_forced_down(self):
         """Tests disabling a service with a reason and forcing it down is
@@ -1321,7 +1320,7 @@ class ServicesTestV253(test.TestCase):
                                body={'forced_down': True})
         self.assertEqual('Updating a nova-scheduler service is not supported. '
                          'Only nova-compute services can be updated.',
-                         six.text_type(ex))
+                         str(ex))
 
     def test_update_empty_body(self):
         """Tests that the caller gets a 400 error if they don't request any
@@ -1333,7 +1332,7 @@ class ServicesTestV253(test.TestCase):
                                self.req, service.uuid, body={})
         self.assertEqual("No updates were requested. Fields 'status' or "
                          "'forced_down' should be specified.",
-                         six.text_type(ex))
+                         str(ex))
 
     def test_update_only_disabled_reason(self):
         """Tests that the caller gets a 400 error if they only specify
@@ -1345,7 +1344,7 @@ class ServicesTestV253(test.TestCase):
                                body={'disabled_reason': 'missing status'})
         self.assertEqual("No updates were requested. Fields 'status' or "
                          "'forced_down' should be specified.",
-                         six.text_type(ex))
+                         str(ex))
 
 
 class ServicesTestV275(test.TestCase):
diff --git a/nova/tests/unit/api/openstack/compute/test_shelve.py b/nova/tests/unit/api/openstack/compute/test_shelve.py
index 5a063aa7ed84..9cf87d9c427f 100644
--- a/nova/tests/unit/api/openstack/compute/test_shelve.py
+++ b/nova/tests/unit/api/openstack/compute/test_shelve.py
@@ -17,7 +17,6 @@ import mock
 import ddt
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 import webob
 
 from nova.api.openstack import api_version_request
@@ -151,8 +150,7 @@ class UnshelveServerControllerTestV277(test.NoDBTestCase):
                                 self.controller._unshelve,
                                 self.req, fakes.FAKE_UUID,
                                 body=body)
-        self.assertIn("\'availability_zone\' is a required property",
-                      six.text_type(exc))
+        self.assertIn("\'availability_zone\' is a required property", str(exc))
 
     def test_invalid_az_name_with_int(self):
         body = {
@@ -187,5 +185,4 @@ class UnshelveServerControllerTestV277(test.NoDBTestCase):
             exception.ValidationError,
             self.controller._unshelve, self.req,
             fakes.FAKE_UUID, body=body)
-        self.assertIn("Additional properties are not allowed",
-                      six.text_type(exc))
+        self.assertIn("Additional properties are not allowed", str(exc))
diff --git a/nova/tests/unit/api/openstack/compute/test_suspend_server.py b/nova/tests/unit/api/openstack/compute/test_suspend_server.py
index 84fa0e95127c..7d6857770e12 100644
--- a/nova/tests/unit/api/openstack/compute/test_suspend_server.py
+++ b/nova/tests/unit/api/openstack/compute/test_suspend_server.py
@@ -13,7 +13,6 @@
 #    under the License.
 
 import mock
-import six
 import webob
 
 from nova.api.openstack.compute import suspend_server as \
@@ -48,7 +47,7 @@ class SuspendServerTestsV21(admin_only_action_common.CommonTests):
                                self.controller._suspend,
                                self.req, fakes.FAKE_UUID, body={})
         self.assertIn("Operation 'suspend' not supported for SEV-enabled "
-                      "instance (%s)" % instance.uuid, six.text_type(ex))
+                      "instance (%s)" % instance.uuid, str(ex))
 
     def test_suspend_resume_with_non_existed_instance(self):
         self._test_actions_with_non_existed_instance(['_suspend', '_resume'])
diff --git a/nova/tests/unit/api/openstack/compute/test_volumes.py b/nova/tests/unit/api/openstack/compute/test_volumes.py
index 75f90bee3b63..0e2fff58b4f3 100644
--- a/nova/tests/unit/api/openstack/compute/test_volumes.py
+++ b/nova/tests/unit/api/openstack/compute/test_volumes.py
@@ -22,7 +22,6 @@ import mock
 from oslo_serialization import jsonutils
 from oslo_utils import encodeutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 import webob
 from webob import exc
 
@@ -949,7 +948,7 @@ class VolumeAttachTestsV260(test.NoDBTestCase):
         create_kwargs = attach.call_args[1]
         self.assertFalse(create_kwargs['supports_multiattach'])
         self.assertIn('Multiattach volumes are only supported starting with '
-                      'compute API version 2.60', six.text_type(ex))
+                      'compute API version 2.60', str(ex))
 
     def test_attach_with_multiattach_fails_not_supported_by_driver(self):
         """Tests the case that the user tries to attach with a
@@ -966,7 +965,7 @@ class VolumeAttachTestsV260(test.NoDBTestCase):
         create_kwargs = attach.call_args[1]
         self.assertTrue(create_kwargs['supports_multiattach'])
         self.assertIn("has 'multiattach' set, which is not supported for "
-                      "this instance", six.text_type(ex))
+                      "this instance", str(ex))
 
     def test_attach_with_multiattach_fails_for_shelved_offloaded_server(self):
         """Tests the case that the user tries to attach with a
@@ -981,7 +980,7 @@ class VolumeAttachTestsV260(test.NoDBTestCase):
         create_kwargs = attach.call_args[1]
         self.assertTrue(create_kwargs['supports_multiattach'])
         self.assertIn('Attaching multiattach volumes is not supported for '
-                      'shelved-offloaded instances.', six.text_type(ex))
+                      'shelved-offloaded instances.', str(ex))
 
 
 class VolumeAttachTestsV2_75(VolumeAttachTestsV21):
@@ -1048,8 +1047,7 @@ class VolumeAttachTestsV279(VolumeAttachTestsV2_75):
         ex = self.assertRaises(exception.ValidationError,
                                self.controller.create,
                                req, FAKE_UUID, body=body)
-        self.assertIn("Additional properties are not allowed",
-                      six.text_type(ex))
+        self.assertIn("Additional properties are not allowed", str(ex))
 
     @mock.patch('nova.compute.api.API.attach_volume', return_value=None)
     def test_attach_volume_pre_v279(self, mock_attach_volume):
@@ -1089,7 +1087,7 @@ class VolumeAttachTestsV279(VolumeAttachTestsV2_75):
                                self.controller.create,
                                req, FAKE_UUID, body=body)
         self.assertIn("Invalid input for field/attribute "
-                      "delete_on_termination.", six.text_type(ex))
+                      "delete_on_termination.", str(ex))
 
     def test_create_volume_attach_invalid_delete_on_termination_value(self):
         """"Test the case that the user tries to set the delete_on_termination
@@ -1107,7 +1105,7 @@ class VolumeAttachTestsV279(VolumeAttachTestsV2_75):
                                self.controller.create,
                                req, FAKE_UUID, body=body)
         self.assertIn("Invalid input for field/attribute "
-                      "delete_on_termination.", six.text_type(ex))
+                      "delete_on_termination.", str(ex))
 
     @mock.patch('nova.compute.api.API.attach_volume', return_value=None)
     def test_attach_volume_v279(self, mock_attach_volume):
@@ -1397,8 +1395,7 @@ class UpdateVolumeAttachTests(VolumeAttachTestsV279):
                                self.attachments.update,
                                req, FAKE_UUID,
                                FAKE_UUID_A, body=body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     @mock.patch.object(objects.BlockDeviceMapping,
                        'get_by_volume_and_instance')
@@ -1440,8 +1437,7 @@ class UpdateVolumeAttachTests(VolumeAttachTestsV279):
                                self.attachments.update,
                                req, FAKE_UUID,
                                FAKE_UUID_A, body=body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     @mock.patch.object(objects.BlockDeviceMapping,
                        'get_by_volume_and_instance')
@@ -1479,8 +1475,7 @@ class UpdateVolumeAttachTests(VolumeAttachTestsV279):
                                self.attachments.update,
                                req, FAKE_UUID,
                                FAKE_UUID_A, body=body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     @mock.patch.object(objects.BlockDeviceMapping,
                        'get_by_volume_and_instance')
@@ -1518,8 +1513,7 @@ class UpdateVolumeAttachTests(VolumeAttachTestsV279):
                                self.attachments.update,
                                req, FAKE_UUID,
                                FAKE_UUID_A, body=body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
     def test_update_volume_with_delete_flag_old_microversion(self):
         body = {'volumeAttachment': {
@@ -1531,8 +1525,7 @@ class UpdateVolumeAttachTests(VolumeAttachTestsV279):
                                self.attachments.update,
                                req, FAKE_UUID,
                                FAKE_UUID_A, body=body)
-        self.assertIn('Additional properties are not allowed',
-                      six.text_type(ex))
+        self.assertIn('Additional properties are not allowed', str(ex))
 
 
 class SwapVolumeMultiattachTestCase(test.NoDBTestCase):
@@ -1603,7 +1596,7 @@ class SwapVolumeMultiattachTestCase(test.NoDBTestCase):
                 webob.exc.HTTPBadRequest, controller.update, req,
                 uuids.server1, uuids.old_vol_id, body=body)
         self.assertIn('Swapping multi-attach volumes with more than one ',
-                      six.text_type(ex))
+                      str(ex))
         mock_attachment_get.assert_has_calls([
             mock.call(ctxt, uuids.attachment_id1),
             mock.call(ctxt, uuids.attachment_id2)], any_order=True)
@@ -1866,7 +1859,7 @@ class AssistedSnapshotDeleteTestCaseV21(test.NoDBTestCase):
                                self.controller.delete, req, '5')
         # This is the result of a KeyError but the only thing in the message
         # is the missing key.
-        self.assertIn('volume_id', six.text_type(ex))
+        self.assertIn('volume_id', str(ex))
 
 
 class AssistedSnapshotDeleteTestCaseV275(AssistedSnapshotDeleteTestCaseV21):
diff --git a/nova/tests/unit/api/openstack/test_common.py b/nova/tests/unit/api/openstack/test_common.py
index 8c85b792011e..4666413e273d 100644
--- a/nova/tests/unit/api/openstack/test_common.py
+++ b/nova/tests/unit/api/openstack/test_common.py
@@ -18,7 +18,6 @@ Test suites for 'common' code used throughout the OpenStack HTTP API.
 """
 
 import mock
-import six
 from testtools import matchers
 import webob
 import webob.exc
@@ -367,7 +366,7 @@ class MiscFunctionsTest(test.TestCase):
             common.raise_http_conflict_for_instance_invalid_state(exc,
                     'meow', 'fake_server_id')
         except webob.exc.HTTPConflict as e:
-            self.assertEqual(six.text_type(e),
+            self.assertEqual(str(e),
                 "Cannot 'meow' instance fake_server_id while it is in "
                 "fake_attr fake_state")
         else:
diff --git a/nova/tests/unit/compute/test_api.py b/nova/tests/unit/compute/test_api.py
index 8e9d6513258c..3daf97f4048c 100644
--- a/nova/tests/unit/compute/test_api.py
+++ b/nova/tests/unit/compute/test_api.py
@@ -27,7 +27,6 @@ from oslo_utils import fixture as utils_fixture
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
-import six
 
 from nova.compute import api as compute_api
 from nova.compute import flavors
@@ -4579,7 +4578,7 @@ class _ComputeAPIUnitTestMixIn(object):
                 exception.MismatchVolumeAZException,
                 self.compute_api._validate_vol_az_for_create, None, volumes)
             self.assertIn('Volumes are in different availability zones: 0,1',
-                          six.text_type(ex))
+                          str(ex))
 
     def test_validate_vol_az_for_create_vol_az_matches_default_cpu_az(self):
         """Tests the scenario that the instance is not being created in a
@@ -6131,7 +6130,7 @@ class _ComputeAPIUnitTestMixIn(object):
         exp = self.assertRaises(exception.InstanceNotFound,
             self.compute_api._get_instance_from_cell, self.context,
             im, [], False)
-        self.assertIn('could not be found', six.text_type(exp))
+        self.assertIn('could not be found', str(exp))
 
     @mock.patch('nova.compute.api.API._save_user_id_in_instance_mapping')
     @mock.patch.object(objects.RequestSpec, 'get_by_instance_uuid')
@@ -6156,13 +6155,13 @@ class _ComputeAPIUnitTestMixIn(object):
         exp = self.assertRaises(exception.NovaException,
             self.compute_api._get_instance_from_cell, self.context,
             im1, [], False)
-        self.assertIn('info is not available', six.text_type(exp))
+        self.assertIn('info is not available', str(exp))
 
         # Have cell down support, error + queued_for_delete = NotFound
         exp = self.assertRaises(exception.InstanceNotFound,
             self.compute_api._get_instance_from_cell, self.context,
             im1, [], True)
-        self.assertIn('could not be found', six.text_type(exp))
+        self.assertIn('could not be found', str(exp))
 
         # Have cell down support, error + archived reqspec = NotFound
         mock_rs.side_effect = exception.RequestSpecNotFound(
@@ -6170,7 +6169,7 @@ class _ComputeAPIUnitTestMixIn(object):
         exp = self.assertRaises(exception.InstanceNotFound,
             self.compute_api._get_instance_from_cell, self.context,
             im2, [], True)
-        self.assertIn('could not be found', six.text_type(exp))
+        self.assertIn('could not be found', str(exp))
 
         # Have cell down support, error + reqspec + not queued_for_delete
         # means we return a minimal instance
diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py
index 56c691e7393c..8f6cae721edd 100644
--- a/nova/tests/unit/compute/test_compute.py
+++ b/nova/tests/unit/compute/test_compute.py
@@ -36,7 +36,6 @@ from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_utils import units
 from oslo_utils import uuidutils
-import six
 import testtools
 from testtools import matchers as testtools_matchers
 
@@ -8968,7 +8967,7 @@ class ComputeAPITestCase(BaseTestCase):
                                self.compute_api.rebuild, self.context,
                                instance, self.fake_image['id'], 'new_password')
         self.assertIn('Unable to find root block device mapping for '
-                      'volume-backed instance', six.text_type(ex))
+                      'volume-backed instance', str(ex))
 
     @mock.patch('nova.objects.RequestSpec')
     def test_rebuild_with_deleted_image(self, mock_reqspec):
diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py
index 1fd43ad4741d..df3133688356 100644
--- a/nova/tests/unit/compute/test_compute_mgr.py
+++ b/nova/tests/unit/compute/test_compute_mgr.py
@@ -33,7 +33,6 @@ from oslo_service import fixture as service_fixture
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
-import six
 import testtools
 
 import nova
@@ -1316,7 +1315,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
             self._test__validate_pinning_configuration)
         self.assertIn('This host has unpinned instances but has no CPUs '
                       'set aside for this purpose;',
-                      six.text_type(ex))
+                      str(ex))
 
     def test__validate_pinning_configuration_invalid_pinned_config(self):
         """Test that configuring only 'cpu_shared_set' when there are pinned
@@ -1329,7 +1328,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
             self._test__validate_pinning_configuration)
         self.assertIn('This host has pinned instances but has no CPUs '
                       'set aside for this purpose;',
-                      six.text_type(ex))
+                      str(ex))
 
     @mock.patch.object(manager.LOG, 'warning')
     def test__validate_pinning_configuration_warning(self, mock_log):
@@ -1345,7 +1344,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
         self.assertEqual(1, mock_log.call_count)
         self.assertIn('Instance is pinned to host CPUs %(cpus)s '
                       'but one or more of these CPUs are not included in ',
-                      six.text_type(mock_log.call_args[0]))
+                      str(mock_log.call_args[0]))
 
     def test__validate_pinning_configuration_no_config(self):
         """Test that not configuring 'cpu_dedicated_set' or 'cpu_shared_set'
@@ -1357,7 +1356,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
         self.assertIn("This host has mixed instance requesting both pinned "
                       "and unpinned CPUs but hasn't set aside unpinned CPUs "
                       "for this purpose;",
-                      six.text_type(ex))
+                      str(ex))
 
     def test__validate_pinning_configuration_not_supported(self):
         """Test that the entire check is skipped if the driver doesn't even
@@ -5533,8 +5532,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
                 allocations=self.allocations,
                 request_group_resource_providers_mapping=mock.sentinel.mapping,
                 accel_uuids=[])
-        self.assertIn('Trusted image certificates provided on host',
-                      six.text_type(ex))
+        self.assertIn('Trusted image certificates provided on host', str(ex))
 
     def test_reverts_task_state_instance_not_found(self):
         # Tests that the reverts_task_state decorator in the compute manager
@@ -7461,7 +7459,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
         ex = self.assertRaises(exception.InvalidBDM,
                                self.compute._prep_block_device,
                                self.context, self.instance, bdms)
-        self.assertEqual('oops!', six.text_type(ex))
+        self.assertEqual('oops!', str(ex))
 
     @mock.patch('nova.objects.InstanceGroup.get_by_hint')
     def test_validate_policy_honors_workaround_disabled(self, mock_get):
@@ -9401,7 +9399,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
                 exception.MigrationError, self.compute._do_live_migration,
                 self.context, 'dest-host', self.instance, None,
                 self.migration, migrate_data)
-            self.assertIn('Timed out waiting for events', six.text_type(ex))
+            self.assertIn('Timed out waiting for events', str(ex))
         self.assertEqual('error', self.migration.status)
         mock_rollback_live_mig.assert_called_once_with(
             self.context, self.instance, 'dest-host',
@@ -10830,7 +10828,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
             wrapped_exc = ex2.exc_info[1]
             # The original error should be in the MigrationPreCheckError which
             # itself is in the ExpectedException.
-            self.assertIn(ex1.format_message(), six.text_type(wrapped_exc))
+            self.assertIn(ex1.format_message(), str(wrapped_exc))
         # Assert the mock calls.
         _send_prep_resize_notifications.assert_has_calls([
             mock.call(self.context, self.instance,
@@ -10877,7 +10875,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
             wrapped_exc = ex2.exc_info[1]
             # The original error should be in the MigrationPreCheckError which
             # itself is in the ExpectedException.
-            self.assertIn(ex1.format_message(), six.text_type(wrapped_exc))
+            self.assertIn(ex1.format_message(), str(wrapped_exc))
         # Assert the mock calls.
         _send_prep_resize_notifications.assert_has_calls([
             mock.call(self.context, self.instance,
@@ -11076,7 +11074,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
         # ExpectedException.
         wrapped_exc = ex2.exc_info[1]
         self.assertIn('Failed to power off instance: testing',
-                      six.text_type(wrapped_exc))
+                      str(wrapped_exc))
         # Assert the non-decorator mock calls.
         _prep_snapshot_based_resize_at_source.assert_called_once_with(
             self.context, self.instance, self.migration,
@@ -11948,7 +11946,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
         # is still called and in this case also fails so the resulting
         # exception should be the one from _complete_volume_attachments
         # but the finish_revert_migration error should have been logged.
-        self.assertIn('vol complete failed', six.text_type(ex))
+        self.assertIn('vol complete failed', str(ex))
         self.assertIn('driver fail', self.stdlog.logger.output)
         # Assert the migration status was not updated.
         self.migration.save.assert_not_called()
diff --git a/nova/tests/unit/compute/test_compute_utils.py b/nova/tests/unit/compute/test_compute_utils.py
index 5207002ab112..98d567de56ca 100644
--- a/nova/tests/unit/compute/test_compute_utils.py
+++ b/nova/tests/unit/compute/test_compute_utils.py
@@ -24,7 +24,6 @@ import mock
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import uuidutils
-import six
 
 from nova.accelerator.cyborg import _CyborgClient as cyborgclient
 from nova.compute import manager
@@ -178,7 +177,7 @@ class ComputeValidateDeviceTestCase(test.NoDBTestCase):
     def test_device_in_use(self):
         exc = self.assertRaises(exception.DevicePathInUse,
                           self._validate_device, '/dev/vda')
-        self.assertIn('/dev/vda', six.text_type(exc))
+        self.assertIn('/dev/vda', str(exc))
 
     def test_swap(self):
         self.instance['default_swap_device'] = "/dev/vdc"
diff --git a/nova/tests/unit/compute/test_instance_list.py b/nova/tests/unit/compute/test_instance_list.py
index 2da6121b5153..4ee1190479e5 100644
--- a/nova/tests/unit/compute/test_instance_list.py
+++ b/nova/tests/unit/compute/test_instance_list.py
@@ -12,7 +12,6 @@
 
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.compute import instance_list
 from nova.compute import multi_cell_list
@@ -215,7 +214,7 @@ class TestInstanceList(test.NoDBTestCase):
         exp = self.assertRaises(exception.NovaException,
             instance_list.get_instance_objects_sorted, self.context, {}, None,
             None, [], None, None)
-        self.assertIn('configuration indicates', six.text_type(exp))
+        self.assertIn('configuration indicates', str(exp))
 
     @mock.patch('nova.context.scatter_gather_cells')
     def test_get_instances_with_cell_down_support(self, mock_sg):
diff --git a/nova/tests/unit/compute/test_keypairs.py b/nova/tests/unit/compute/test_keypairs.py
index 0a5b544c7a26..339ffe4783b4 100644
--- a/nova/tests/unit/compute/test_keypairs.py
+++ b/nova/tests/unit/compute/test_keypairs.py
@@ -17,7 +17,6 @@
 import mock
 from oslo_concurrency import processutils
 from oslo_config import cfg
-import six
 
 from nova.compute import api as compute_api
 from nova import context
@@ -119,7 +118,7 @@ class CreateImportSharedTestMixIn(object):
 
         exc = self.assertRaises(exc_class, func, self.ctxt, self.ctxt.user_id,
                                 name, *args)
-        self.assertEqual(expected_message, six.text_type(exc))
+        self.assertEqual(expected_message, str(exc))
 
     def assertInvalidKeypair(self, expected_message, name):
         msg = 'Keypair data is invalid: %s' % expected_message
@@ -232,7 +231,7 @@ class ImportKeypairTestCase(KeypairAPITestCase, CreateImportSharedTestMixIn):
                                 self.ctxt, self.ctxt.user_id, 'foo',
                                 'bad key data')
         msg = u'Keypair data is invalid: failed to generate fingerprint'
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
 
 class GetKeypairTestCase(KeypairAPITestCase):
diff --git a/nova/tests/unit/compute/test_rpcapi.py b/nova/tests/unit/compute/test_rpcapi.py
index 6beee6a5be24..f2655eddfc9e 100644
--- a/nova/tests/unit/compute/test_rpcapi.py
+++ b/nova/tests/unit/compute/test_rpcapi.py
@@ -19,7 +19,6 @@ Unit Tests for nova.compute.rpcapi
 import mock
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.compute import rpcapi as compute_rpcapi
 from nova import context
@@ -534,7 +533,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             limits={},
             request_spec=objects.RequestSpec(),
             destination='dest')
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_prep_snapshot_based_resize_at_source(self):
         """Tests happy path for prep_snapshot_based_resize_at_source rpc call
@@ -564,7 +563,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             instance=self.fake_instance_obj,
             migration=migration_obj.Migration(),
             snapshot_id=uuids.snapshot_id)
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_finish_snapshot_based_resize_at_dest(self):
         """Tests happy path for finish_snapshot_based_resize_at_dest."""
@@ -595,7 +594,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             migration=migration_obj.Migration(dest_compute='dest'),
             snapshot_id=uuids.snapshot_id,
             request_spec=objects.RequestSpec())
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_confirm_snapshot_based_resize_at_source(self):
         """Tests happy path for confirm_snapshot_based_resize_at_source."""
@@ -622,7 +621,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             self.context,
             instance=self.fake_instance_obj,
             migration=migration_obj.Migration(source_compute='source'))
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_revert_snapshot_based_resize_at_dest(self):
         """Tests happy path for revert_snapshot_based_resize_at_dest."""
@@ -649,7 +648,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             self.context,
             instance=self.fake_instance_obj,
             migration=migration_obj.Migration(dest_compute='dest'))
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_finish_revert_snapshot_based_resize_at_source(self):
         """Tests happy path for finish_revert_snapshot_based_resize_at_source.
@@ -679,7 +678,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
             self.context,
             instance=self.fake_instance_obj,
             migration=migration_obj.Migration(source_compute='source'))
-        self.assertIn('Compute too old', six.text_type(ex))
+        self.assertIn('Compute too old', str(ex))
 
     def test_reboot_instance(self):
         self.maxDiff = None
diff --git a/nova/tests/unit/conductor/tasks/test_cross_cell_migrate.py b/nova/tests/unit/conductor/tasks/test_cross_cell_migrate.py
index 08c225a29c53..938bbf1c1568 100644
--- a/nova/tests/unit/conductor/tasks/test_cross_cell_migrate.py
+++ b/nova/tests/unit/conductor/tasks/test_cross_cell_migrate.py
@@ -16,7 +16,6 @@ import mock
 from oslo_messaging import exceptions as messaging_exceptions
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
-import six
 
 from nova.compute import instance_actions
 from nova.compute import power_state
@@ -452,8 +451,7 @@ class CrossCellMigrationTaskTestCase(test.NoDBTestCase):
                 return_value=False):
             ex = self.assertRaises(exception.MigrationPreCheckError,
                                    self.task._perform_external_api_checks)
-            self.assertIn('Required networking service API extension',
-                          six.text_type(ex))
+            self.assertIn('Required networking service API extension', str(ex))
 
     @mock.patch('nova.conductor.tasks.cross_cell_migrate.LOG.exception')
     def test_rollback_idempotent(self, mock_log_exception):
@@ -472,7 +470,7 @@ class CrossCellMigrationTaskTestCase(test.NoDBTestCase):
         with mock.patch.object(self.task, '_execute', side_effect=error):
             # The TestingException from the main task should be raised.
             ex = self.assertRaises(test.TestingException, self.task.execute)
-            self.assertEqual('main task', six.text_type(ex))
+            self.assertEqual('main task', str(ex))
         # And all three sub-task rollbacks should have been called.
         for subtask in self.task._completed_tasks.values():
             subtask.rollback.assert_called_once_with(error)
@@ -740,7 +738,7 @@ class PrepResizeAtDestTaskTestCase(test.NoDBTestCase):
                 exception.MigrationPreCheckError, self.task.execute)
             self.assertIn(
                 'RPC timeout while checking if we can cross-cell migrate to '
-                'host: fake-host', six.text_type(ex))
+                'host: fake-host', str(ex))
 
         _create_port_bindings.assert_called_once_with()
         _create_volume_attachments.assert_called_once_with()
@@ -1600,7 +1598,7 @@ class RevertResizeTaskTestCase(test.NoDBTestCase, ObjectComparatorMixin):
         ex = self.assertRaises(exception.ObjectActionError,
                                self.task._update_source_obj_from_target_cell,
                                source, target)
-        self.assertIn('nested objects are not supported', six.text_type(ex))
+        self.assertIn('nested objects are not supported', str(ex))
 
     @mock.patch('nova.objects.Migration.get_by_uuid')
     def test_update_migration_in_source_cell(self, mock_get_migration):
diff --git a/nova/tests/unit/conductor/tasks/test_live_migrate.py b/nova/tests/unit/conductor/tasks/test_live_migrate.py
index 65841cdad131..e8bb2310c95c 100644
--- a/nova/tests/unit/conductor/tasks/test_live_migrate.py
+++ b/nova/tests/unit/conductor/tasks/test_live_migrate.py
@@ -14,7 +14,6 @@ import mock
 import oslo_messaging as messaging
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.compute import power_state
 from nova.compute import rpcapi as compute_rpcapi
@@ -393,7 +392,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
             mock.patch.object(self.task, '_check_can_migrate_pci')):
             ex = self.assertRaises(exception.MigrationPreCheckError,
                                    self.task._check_requested_destination)
-        self.assertIn('across cells', six.text_type(ex))
+        self.assertIn('across cells', str(ex))
 
     @mock.patch.object(live_migrate.LiveMigrationTask,
                        '_call_livem_checks_on_host')
diff --git a/nova/tests/unit/conductor/test_conductor.py b/nova/tests/unit/conductor/test_conductor.py
index 12158cb343b9..9dd46a493280 100644
--- a/nova/tests/unit/conductor/test_conductor.py
+++ b/nova/tests/unit/conductor/test_conductor.py
@@ -24,7 +24,6 @@ from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_versionedobjects import exception as ovo_exc
-import six
 
 from nova.accelerator import cyborg
 from nova import block_device
@@ -2971,7 +2970,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
                              task_state=None,
                              expected_task_state=task_states.MIGRATING,),
                         expected_ex, request_spec)
-        self.assertEqual(ex.kwargs['reason'], six.text_type(expected_ex))
+        self.assertEqual(ex.kwargs['reason'], str(expected_ex))
 
     @mock.patch.object(scheduler_utils, 'set_vm_state_and_notify')
     def test_set_vm_state_and_notify(self, mock_set):
diff --git a/nova/tests/unit/console/securityproxy/test_rfb.py b/nova/tests/unit/console/securityproxy/test_rfb.py
index 24a54608bb41..d27b91c1109f 100644
--- a/nova/tests/unit/console/securityproxy/test_rfb.py
+++ b/nova/tests/unit/console/securityproxy/test_rfb.py
@@ -15,8 +15,6 @@
 
 """Tests the Console Security Proxy Framework."""
 
-import six
-
 import mock
 
 from nova.console.rfb import auth
@@ -128,7 +126,7 @@ class RFBSecurityProxyTestCase(test.NoDBTestCase):
                                    self.proxy.connect,
                                    self.tenant_sock,
                                    self.compute_sock)
-            self.assertIn('version 3.8, but server', six.text_type(ex))
+            self.assertIn('version 3.8, but server', str(ex))
             self._assert_expected_calls()
 
     def test_fails_on_tenant_version(self):
@@ -150,7 +148,7 @@ class RFBSecurityProxyTestCase(test.NoDBTestCase):
                                    self.proxy.connect,
                                    self.tenant_sock,
                                    self.compute_sock)
-            self.assertIn('version 3.8, but tenant', six.text_type(ex))
+            self.assertIn('version 3.8, but tenant', str(ex))
             self._assert_expected_calls()
 
     def test_fails_on_sec_type_cnt_zero(self):
@@ -172,7 +170,7 @@ class RFBSecurityProxyTestCase(test.NoDBTestCase):
                                self.proxy.connect,
                                self.tenant_sock,
                                self.compute_sock)
-        self.assertIn('cheese', six.text_type(ex))
+        self.assertIn('cheese', str(ex))
 
         self._assert_expected_calls()
 
diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py
index dd2a369aae62..9207a984db5d 100644
--- a/nova/tests/unit/db/test_db_api.py
+++ b/nova/tests/unit/db/test_db_api.py
@@ -36,7 +36,6 @@ from oslo_utils import fixture as utils_fixture
 from oslo_utils.fixture import uuidsentinel
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
-import six
 from sqlalchemy import Column
 from sqlalchemy.dialects import sqlite
 from sqlalchemy.exc import OperationalError
@@ -828,7 +827,7 @@ class SqlAlchemyDbApiTestCase(DbTestCase):
 
         self.assertEqual(1, len(result))
         self.assertEqual(2, len(result['host1']))
-        self.assertEqual(six.text_type, type(result['host1'][0]))
+        self.assertEqual(str, type(result['host1'][0]))
 
         result = test2(ctxt)
 
diff --git a/nova/tests/unit/db/test_sqlalchemy_migration.py b/nova/tests/unit/db/test_sqlalchemy_migration.py
index 3fba94465683..e5d7b7b8fdb7 100644
--- a/nova/tests/unit/db/test_sqlalchemy_migration.py
+++ b/nova/tests/unit/db/test_sqlalchemy_migration.py
@@ -20,7 +20,6 @@ from migrate.versioning import api as versioning_api
 import mock
 from oslo_db.sqlalchemy import utils as db_utils
 from oslo_utils.fixture import uuidsentinel
-import six
 import sqlalchemy
 
 from nova import context
@@ -537,4 +536,4 @@ class TestServicesUUIDCheck(test.TestCase):
         ex = self.assertRaises(exception.ValidationError,
                                self.migration.upgrade, self.engine)
         self.assertIn('There are still 1 unmigrated records in the '
-                      'services table.', six.text_type(ex))
+                      'services table.', str(ex))
diff --git a/nova/tests/unit/matchers.py b/nova/tests/unit/matchers.py
index f95abb120607..986583bd8fa4 100644
--- a/nova/tests/unit/matchers.py
+++ b/nova/tests/unit/matchers.py
@@ -21,7 +21,6 @@ import io
 import pprint
 
 from lxml import etree
-import six
 from testtools import content
 import testtools.matchers
 
@@ -409,7 +408,7 @@ class XMLMatches(object):
 
     @staticmethod
     def _parse(text_or_bytes):
-        if isinstance(text_or_bytes, six.text_type):
+        if isinstance(text_or_bytes, str):
             text_or_bytes = text_or_bytes.encode("utf-8")
         parser = etree.XMLParser(encoding="UTF-8")
         return etree.parse(io.BytesIO(text_or_bytes), parser)
@@ -567,7 +566,7 @@ class EncodedByUTF8(object):
                 except UnicodeDecodeError:
                     return testtools.matchers.Mismatch(
                         "%s is not encoded in UTF-8." % obj)
-        elif isinstance(obj, six.text_type):
+        elif isinstance(obj, str):
             try:
                 obj.encode("utf-8", "strict")
             except UnicodeDecodeError:
diff --git a/nova/tests/unit/network/test_neutron.py b/nova/tests/unit/network/test_neutron.py
index 373e520154c4..a308c69e5ce3 100644
--- a/nova/tests/unit/network/test_neutron.py
+++ b/nova/tests/unit/network/test_neutron.py
@@ -31,7 +31,6 @@ from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
 import requests_mock
-import six
 
 from nova import context
 from nova.db.sqlalchemy import api as db_api
@@ -176,7 +175,7 @@ class TestNeutronClient(test.NoDBTestCase):
         exc = self.assertRaises(
             exception.Forbidden,
             client.create_port)
-        self.assertIsInstance(exc.format_message(), six.text_type)
+        self.assertIsInstance(exc.format_message(), str)
 
     def test_withtoken_context_is_admin(self):
         self.flags(endpoint_override='http://anyhost/', group='neutron')
@@ -438,8 +437,8 @@ class TestAPIBase(test.TestCase):
         info_cache['created_at'] = timeutils.utcnow()
         info_cache['deleted_at'] = timeutils.utcnow()
         info_cache['updated_at'] = timeutils.utcnow()
-        info_cache['network_info'] = model.NetworkInfo.hydrate(six.text_type(
-                                    jsonutils.dumps(nw_info)))
+        info_cache['network_info'] = model.NetworkInfo.hydrate(
+                                    str(jsonutils.dumps(nw_info)))
         return info_cache
 
     def _fake_instance_object_with_info_cache(self, instance):
@@ -1828,7 +1827,7 @@ class TestAPI(TestAPIBase):
                                self.api.validate_networks, self.context,
                                requested_networks, 1)
 
-        self.assertIn(uuids.my_netid1, six.text_type(ex))
+        self.assertIn(uuids.my_netid1, str(ex))
         mock_get_client.assert_called_once_with(self.context)
         mocked_client.list_networks.assert_called_once_with(
             id=[uuids.my_netid1])
@@ -1847,8 +1846,8 @@ class TestAPI(TestAPIBase):
                                self.api.validate_networks,
                                self.context, requested_networks, 1)
 
-        self.assertIn(uuids.my_netid2, six.text_type(ex))
-        self.assertIn(uuids.my_netid3, six.text_type(ex))
+        self.assertIn(uuids.my_netid2, str(ex))
+        self.assertIn(uuids.my_netid3, str(ex))
         mock_get_client.assert_called_once_with(self.context)
         mocked_client.list_networks.assert_called_once_with(id=ids)
 
@@ -4074,7 +4073,7 @@ class TestAPI(TestAPIBase):
                                   '(Network ID is %(net_id)s)' %
                                   {'instance': instance.uuid,
                                    'net_id': uuids.my_netid1})
-        self.assertEqual(expected_exception_msg, six.text_type(exc))
+        self.assertEqual(expected_exception_msg, str(exc))
         mock_client.delete_port.assert_called_once_with(uuids.port_id)
 
     @mock.patch('nova.network.neutron.LOG')
@@ -4098,7 +4097,7 @@ class TestAPI(TestAPIBase):
                                   '(Network ID is %(net_id)s)' %
                                   {'instance': instance.uuid,
                                    'net_id': uuids.my_netid1})
-        self.assertEqual(expected_exception_msg, six.text_type(exc))
+        self.assertEqual(expected_exception_msg, str(exc))
         mock_client.delete_port.assert_called_once_with(uuids.port_id)
         self.assertTrue(mock_log.exception.called)
 
@@ -4693,7 +4692,7 @@ class TestAPI(TestAPIBase):
         self.assertIn(
             "Provider mappings are not available to the compute service but "
             "are required for ports with a resource request.",
-            six.text_type(ex))
+            str(ex))
 
     @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
     def test_update_port_bindings_for_instance_with_resource_req_live_mig(
@@ -4929,8 +4928,8 @@ class TestAPI(TestAPIBase):
                     self.api.setup_networks_on_host,
                     self.context, instance, host='new-host', teardown=True)
                 # Make sure both ports show up in the exception message.
-                self.assertIn(uuids.port1, six.text_type(ex))
-                self.assertIn(uuids.port2, six.text_type(ex))
+                self.assertIn(uuids.port1, str(ex))
+                self.assertIn(uuids.port2, str(ex))
         self.api._clear_migration_port_profile.assert_called_once_with(
             self.context, instance, get_client_mock.return_value,
             get_ports['ports'])
diff --git a/nova/tests/unit/network/test_os_vif_util.py b/nova/tests/unit/network/test_os_vif_util.py
index c96fca51bbc6..12971f2314ef 100644
--- a/nova/tests/unit/network/test_os_vif_util.py
+++ b/nova/tests/unit/network/test_os_vif_util.py
@@ -14,7 +14,6 @@
 
 from os_vif import objects as osv_objects
 from os_vif.objects import fields as os_vif_fields
-import six
 
 from nova import exception
 from nova.network import model
@@ -1016,7 +1015,7 @@ class OSVIFUtilTestCase(test.NoDBTestCase):
 
         ex = self.assertRaises(exception.NovaException,
                                os_vif_util.nova_to_osvif_vif, vif)
-        self.assertIn('Unsupported VIF type wibble', six.text_type(ex))
+        self.assertIn('Unsupported VIF type wibble', str(ex))
 
     def test_nova_to_osvif_vif_binding_failed(self):
         vif = model.VIF(
diff --git a/nova/tests/unit/objects/test_host_mapping.py b/nova/tests/unit/objects/test_host_mapping.py
index 7cbd9ae9c90a..8917e318afb8 100644
--- a/nova/tests/unit/objects/test_host_mapping.py
+++ b/nova/tests/unit/objects/test_host_mapping.py
@@ -13,7 +13,6 @@
 import mock
 from oslo_db import exception as db_exc
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova import context
 from nova import exception
@@ -330,7 +329,7 @@ Found 1 unmapped computes in cell: %(cell)s""" % {'cell': uuids.cell1}
         exp = self.assertRaises(exception.HostMappingExists,
                                 host_mapping.discover_hosts, ctxt)
         expected = "Host 'bar' mapping already exists"
-        self.assertIn(expected, six.text_type(exp))
+        self.assertIn(expected, str(exp))
 
     @mock.patch('nova.objects.CellMappingList.get_all')
     @mock.patch('nova.objects.HostMapping.get_by_host')
@@ -349,4 +348,4 @@ Found 1 unmapped computes in cell: %(cell)s""" % {'cell': uuids.cell1}
                                 host_mapping.discover_hosts, ctxt,
                                 by_service=True)
         expected = "Host 'bar' mapping already exists"
-        self.assertIn(expected, six.text_type(exp))
+        self.assertIn(expected, str(exp))
diff --git a/nova/tests/unit/objects/test_image_meta.py b/nova/tests/unit/objects/test_image_meta.py
index 3cbb8e925d1a..445fe8b9c890 100644
--- a/nova/tests/unit/objects/test_image_meta.py
+++ b/nova/tests/unit/objects/test_image_meta.py
@@ -13,7 +13,6 @@
 # under the License.
 
 import datetime
-import six
 
 from nova import exception
 from nova import objects
@@ -373,7 +372,7 @@ class TestImageMetaProps(test.NoDBTestCase):
             obj = objects.ImageMetaProps(hw_video_model=model)
             ex = self.assertRaises(exception.ObjectActionError,
                                    obj.obj_to_primitive, '1.21')
-            self.assertIn('hw_video_model', six.text_type(ex))
+            self.assertIn('hw_video_model', str(ex))
 
     def test_obj_make_compatible_watchdog_action_not_disabled(self):
         """Tests that we don't pop the hw_watchdog_action if the value is not
diff --git a/nova/tests/unit/objects/test_instance.py b/nova/tests/unit/objects/test_instance.py
index 63e82eab5aa9..53f3ea415fb9 100644
--- a/nova/tests/unit/objects/test_instance.py
+++ b/nova/tests/unit/objects/test_instance.py
@@ -14,7 +14,6 @@
 
 import collections
 import datetime
-import six
 
 import mock
 import netaddr
@@ -1210,7 +1209,7 @@ class _TestInstanceObject(object):
         inst.host = None
         ex = self.assertRaises(exception.ObjectActionError,
                                inst.destroy, hard_delete=True)
-        self.assertIn('host changed', six.text_type(ex))
+        self.assertIn('host changed', str(ex))
 
     def test_name_does_not_trigger_lazy_loads(self):
         values = {'user_id': self.context.user_id,
diff --git a/nova/tests/unit/objects/test_instance_action.py b/nova/tests/unit/objects/test_instance_action.py
index 6576f60b9963..aa9fc200258b 100644
--- a/nova/tests/unit/objects/test_instance_action.py
+++ b/nova/tests/unit/objects/test_instance_action.py
@@ -19,7 +19,6 @@ import mock
 from oslo_utils import fixture as utils_fixture
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
-import six
 
 from nova.db import api as db
 from nova import exception
@@ -187,7 +186,7 @@ class _TestInstanceActionObject(object):
     def test_create_id_in_updates_error(self):
         action = instance_action.InstanceAction(self.context, id=1)
         ex = self.assertRaises(exception.ObjectActionError, action.create)
-        self.assertIn('already created', six.text_type(ex))
+        self.assertIn('already created', str(ex))
 
     @mock.patch('nova.db.api.action_start')
     def test_create(self, mock_action_start):
@@ -335,14 +334,13 @@ class _TestInstanceActionEventObject(object):
         self.useFixture(utils_fixture.TimeFixture(NOW))
         test_class = instance_action.InstanceActionEvent
         expected_packed_values = test_class.pack_action_event_finish(
-            self.context, 'fake-uuid', 'fake-event', 'val',
-            six.text_type('fake-tb'))
+            self.context, 'fake-uuid', 'fake-event', 'val', 'fake-tb')
         expected_packed_values['finish_time'] = NOW
 
         mock_finish.return_value = fake_event
         event = test_class.event_finish_with_failure(
             self.context, 'fake-uuid', 'fake-event', exc_val='val',
-            exc_tb=six.text_type('fake-tb'), want_result=True)
+            exc_tb='fake-tb', want_result=True)
         mock_finish.assert_called_once_with(self.context,
                                             expected_packed_values)
         self.compare_obj(event, fake_event)
@@ -404,7 +402,7 @@ class _TestInstanceActionEventObject(object):
         ex = self.assertRaises(
             exception.ObjectActionError, event.create,
             fake_action['instance_uuid'], fake_action['request_id'])
-        self.assertIn('already created', six.text_type(ex))
+        self.assertIn('already created', str(ex))
 
     @mock.patch('nova.db.api.action_event_start')
     def test_create(self, mock_action_event_start):
diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py
index e19f7c7bd095..a0fe7b9e981e 100644
--- a/nova/tests/unit/objects/test_objects.py
+++ b/nova/tests/unit/objects/test_objects.py
@@ -25,7 +25,6 @@ from oslo_utils import timeutils
 from oslo_versionedobjects import base as ovo_base
 from oslo_versionedobjects import exception as ovo_exc
 from oslo_versionedobjects import fixture
-import six
 
 from nova import context
 from nova import exception
@@ -257,7 +256,7 @@ class FakeIndirectionHack(fixture.FakeIndirectionAPI):
         objinst = self._ser.deserialize_entity(
             context, self._ser.serialize_entity(
                 context, objinst))
-        objmethod = six.text_type(objmethod)
+        objmethod = str(objmethod)
         args = self._ser.deserialize_entity(
             None, self._ser.serialize_entity(None, args))
         kwargs = self._ser.deserialize_entity(
@@ -272,9 +271,9 @@ class FakeIndirectionHack(fixture.FakeIndirectionAPI):
 
     def object_class_action(self, context, objname, objmethod, objver,
                             args, kwargs):
-        objname = six.text_type(objname)
-        objmethod = six.text_type(objmethod)
-        objver = six.text_type(objver)
+        objname = str(objname)
+        objmethod = str(objmethod)
+        objver = str(objver)
         args = self._ser.deserialize_entity(
             None, self._ser.serialize_entity(None, args))
         kwargs = self._ser.deserialize_entity(
@@ -292,9 +291,9 @@ class FakeIndirectionHack(fixture.FakeIndirectionAPI):
 
     def object_class_action_versions(self, context, objname, objmethod,
                                      object_versions, args, kwargs):
-        objname = six.text_type(objname)
-        objmethod = six.text_type(objmethod)
-        object_versions = {six.text_type(o): six.text_type(v)
+        objname = str(objname)
+        objmethod = str(objmethod)
+        object_versions = {str(o): str(v)
                            for o, v in object_versions.items()}
         args, kwargs = self._canonicalize_args(context, args, kwargs)
         objver = object_versions[objname]
diff --git a/nova/tests/unit/objects/test_resource.py b/nova/tests/unit/objects/test_resource.py
index 966d9c6d207c..892562f11d4b 100644
--- a/nova/tests/unit/objects/test_resource.py
+++ b/nova/tests/unit/objects/test_resource.py
@@ -13,7 +13,6 @@
 import mock
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.objects import resource
 from nova.tests.unit.objects import test_objects
@@ -53,8 +52,7 @@ class TestResourceObject(test_objects._LocalTest):
                               resource_class=rc,
                               identifier='foo')
         except ValueError as e:
-            self.assertEqual('Malformed Resource Class %s' % rc,
-                             six.text_type(e))
+            self.assertEqual('Malformed Resource Class %s' % rc, str(e))
         else:
             self.fail('Check malformed resource class failed.')
 
diff --git a/nova/tests/unit/objects/test_service.py b/nova/tests/unit/objects/test_service.py
index de4d96d53f7a..e5ad835ff938 100644
--- a/nova/tests/unit/objects/test_service.py
+++ b/nova/tests/unit/objects/test_service.py
@@ -17,7 +17,6 @@ from oslo_utils.fixture import uuidsentinel
 from oslo_utils import timeutils
 from oslo_versionedobjects import base as ovo_base
 from oslo_versionedobjects import exception as ovo_exc
-import six
 
 from nova.compute import manager as compute_manager
 from nova import context
@@ -530,7 +529,7 @@ class TestServiceVersionCells(test.TestCase):
         ex = self.assertRaises(exception.ObjectActionError,
                                service.get_minimum_version_all_cells,
                                self.context, ['compute'])
-        self.assertIn('Invalid binary prefix', six.text_type(ex))
+        self.assertIn('Invalid binary prefix', str(ex))
         self.assertTrue(mock_log.warning.called)
 
     @mock.patch('nova.context.scatter_gather_all_cells')
diff --git a/nova/tests/unit/pci/test_devspec.py b/nova/tests/unit/pci/test_devspec.py
index ad895c79e6fc..69d774cd866f 100644
--- a/nova/tests/unit/pci/test_devspec.py
+++ b/nova/tests/unit/pci/test_devspec.py
@@ -13,7 +13,6 @@
 
 
 import mock
-import six
 
 from nova import exception
 from nova import objects
@@ -212,7 +211,7 @@ class PciAddressTestCase(test.NoDBTestCase):
             devspec.PciDeviceSpec, pci_info)
         msg = ("Invalid PCI devices Whitelist config: property func ('12:6') "
                "does not parse as a hex number.")
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
     def test_max_func(self):
         pci_info = {"address": "0000:0a:00.%s" % (devspec.MAX_FUNC + 1),
@@ -222,7 +221,7 @@ class PciAddressTestCase(test.NoDBTestCase):
         msg = ('Invalid PCI devices Whitelist config: property func (%x) is '
                'greater than the maximum allowable value (%x).'
                   % (devspec.MAX_FUNC + 1, devspec.MAX_FUNC))
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
     def test_max_domain(self):
         pci_info = {"address": "%x:0a:00.5" % (devspec.MAX_DOMAIN + 1),
@@ -232,7 +231,7 @@ class PciAddressTestCase(test.NoDBTestCase):
         msg = ('Invalid PCI devices Whitelist config: property domain (%X) '
                'is greater than the maximum allowable value (%X).'
                % (devspec.MAX_DOMAIN + 1, devspec.MAX_DOMAIN))
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
     def test_max_bus(self):
         pci_info = {"address": "0000:%x:00.5" % (devspec.MAX_BUS + 1),
@@ -242,7 +241,7 @@ class PciAddressTestCase(test.NoDBTestCase):
         msg = ('Invalid PCI devices Whitelist config: property bus (%X) is '
                'greater than the maximum allowable value (%X).'
                % (devspec.MAX_BUS + 1, devspec.MAX_BUS))
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
     def test_max_slot(self):
         pci_info = {"address": "0000:0a:%x.5" % (devspec.MAX_SLOT + 1),
@@ -252,7 +251,7 @@ class PciAddressTestCase(test.NoDBTestCase):
         msg = ('Invalid PCI devices Whitelist config: property slot (%X) is '
                'greater than the maximum allowable value (%X).'
                % (devspec.MAX_SLOT + 1, devspec.MAX_SLOT))
-        self.assertEqual(msg, six.text_type(exc))
+        self.assertEqual(msg, str(exc))
 
     def test_address_is_undefined(self):
         pci_info = {"vendor_id": "8086", "product_id": "5057"}
@@ -388,7 +387,7 @@ class PciDevSpecTestCase(test.NoDBTestCase):
         self.assertEqual(
             "Invalid PCI devices Whitelist config: property vendor_id (80860) "
             "is greater than the maximum allowable value (FFFF).",
-            six.text_type(exc))
+            str(exc))
 
     def test_invalid_product_id(self):
         pci_info = {"vendor_id": "8086", "address": "*: *: *.5",
@@ -404,7 +403,7 @@ class PciDevSpecTestCase(test.NoDBTestCase):
         self.assertEqual(
             "Invalid PCI devices Whitelist config: property product_id "
             "(50570) is greater than the maximum allowable value (FFFF).",
-            six.text_type(exc))
+            str(exc))
 
     def test_devname_and_address(self):
         pci_info = {"devname": "eth0", "vendor_id": "8086",
diff --git a/nova/tests/unit/scheduler/client/test_report.py b/nova/tests/unit/scheduler/client/test_report.py
index 7e9db2cd3931..8c1ac409ffce 100644
--- a/nova/tests/unit/scheduler/client/test_report.py
+++ b/nova/tests/unit/scheduler/client/test_report.py
@@ -19,7 +19,6 @@ import mock
 import os_resource_classes as orc
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 import nova.conf
 from nova import context
@@ -3588,7 +3587,7 @@ class TestAllocations(SchedulerReportClientTestCase):
             exception.AllocationUpdateFailed,
             self._test_remove_res_from_alloc, current_allocations,
             resources_to_remove, None)
-        self.assertIn('The allocation is empty', six.text_type(ex))
+        self.assertIn('The allocation is empty', str(ex))
 
     @mock.patch("nova.scheduler.client.report.SchedulerReportClient.put")
     @mock.patch("nova.scheduler.client.report.SchedulerReportClient.get")
@@ -3623,9 +3622,7 @@ class TestAllocations(SchedulerReportClientTestCase):
         ex = self.assertRaises(
             exception.AllocationUpdateFailed, self._test_remove_res_from_alloc,
             current_allocations, resources_to_remove, None)
-        self.assertIn(
-            "Key 'VCPU' is missing from the allocation",
-            six.text_type(ex))
+        self.assertIn("Key 'VCPU' is missing from the allocation", str(ex))
 
     def test_remove_res_from_alloc_missing_rp(self):
         current_allocations = {
@@ -3652,7 +3649,7 @@ class TestAllocations(SchedulerReportClientTestCase):
             current_allocations, resources_to_remove, None)
         self.assertIn(
             "Key '%s' is missing from the allocation" % uuids.other_rp,
-            six.text_type(ex))
+            str(ex))
 
     def test_remove_res_from_alloc_not_enough_resource_to_remove(self):
         current_allocations = {
@@ -3682,7 +3679,7 @@ class TestAllocations(SchedulerReportClientTestCase):
             'provider to remove 400 amount of NET_BW_EGR_KILOBIT_PER_SEC '
             'resources' %
             uuids.rp1,
-            six.text_type(ex))
+            str(ex))
 
     @mock.patch('time.sleep', new=mock.Mock())
     @mock.patch("nova.scheduler.client.report.SchedulerReportClient.put")
@@ -3810,7 +3807,7 @@ class TestAllocations(SchedulerReportClientTestCase):
             self.context, uuids.consumer_uuid, resources_to_remove)
         self.assertIn(
             'due to multiple successive generation conflicts',
-            six.text_type(ex))
+            str(ex))
 
         get_call = mock.call(
             '/allocations/%s' % uuids.consumer_uuid, version='1.28',
diff --git a/nova/tests/unit/scheduler/filters/test_compute_capabilities_filters.py b/nova/tests/unit/scheduler/filters/test_compute_capabilities_filters.py
index 09c5e701f86a..a90ec4367d72 100644
--- a/nova/tests/unit/scheduler/filters/test_compute_capabilities_filters.py
+++ b/nova/tests/unit/scheduler/filters/test_compute_capabilities_filters.py
@@ -10,8 +10,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
-
 from nova import objects
 from nova.scheduler.filters import compute_capabilities_filter
 from nova import test
@@ -53,7 +51,7 @@ class TestComputeCapabilitiesFilter(test.NoDBTestCase):
     def test_compute_filter_fails_without_capabilites(self):
         cpu_info = """ { } """
 
-        cpu_info = six.text_type(cpu_info)
+        cpu_info = str(cpu_info)
 
         self._do_test_compute_filter_extra_specs(
             ecaps={'cpu_info': cpu_info},
@@ -65,7 +63,7 @@ class TestComputeCapabilitiesFilter(test.NoDBTestCase):
         "arch": "i686","features": ["lahf_lm", "rdtscp"], "topology":
         {"cores": 1, "threads":1, "sockets": 1}} """
 
-        cpu_info = six.text_type(cpu_info)
+        cpu_info = str(cpu_info)
 
         self._do_test_compute_filter_extra_specs(
             ecaps={'cpu_info': cpu_info},
@@ -77,7 +75,7 @@ class TestComputeCapabilitiesFilter(test.NoDBTestCase):
         "arch": "i686","features": ["lahf_lm", "rdtscp"], "topology":
         {"cores": 1, "threads":1, "sockets": 1}} """
 
-        cpu_info = six.text_type(cpu_info)
+        cpu_info = str(cpu_info)
 
         self._do_test_compute_filter_extra_specs(
             ecaps={'cpu_info': cpu_info},
@@ -89,7 +87,7 @@ class TestComputeCapabilitiesFilter(test.NoDBTestCase):
         "arch": "i686","features": ["lahf_lm", "rdtscp"], "topology":
         {"cores": 1, "threads":1, "sockets": 1}} """
 
-        cpu_info = six.text_type(cpu_info)
+        cpu_info = str(cpu_info)
 
         self._do_test_compute_filter_extra_specs(
             ecaps={'cpu_info': cpu_info},
@@ -98,7 +96,7 @@ class TestComputeCapabilitiesFilter(test.NoDBTestCase):
 
     def test_compute_filter_fail_cpu_info_as_text_type_not_valid(self):
         cpu_info = "cpu_info"
-        cpu_info = six.text_type(cpu_info)
+        cpu_info = str(cpu_info)
         self._do_test_compute_filter_extra_specs(
             ecaps={'cpu_info': cpu_info},
             especs={'capabilities:cpu_info:vendor': 'Intel'},
diff --git a/nova/tests/unit/scheduler/test_scheduler_utils.py b/nova/tests/unit/scheduler/test_scheduler_utils.py
index d63529c2954d..356e2c6e1f81 100644
--- a/nova/tests/unit/scheduler/test_scheduler_utils.py
+++ b/nova/tests/unit/scheduler/test_scheduler_utils.py
@@ -18,7 +18,6 @@ Tests For Scheduler Utils
 
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova.compute import flavors
 from nova.compute import utils as compute_utils
@@ -245,7 +244,7 @@ class SchedulerUtilsTestCase(test.NoDBTestCase):
                                 scheduler_utils.populate_retry,
                                 filter_properties, uuids.instance)
         # make sure 'msg' is a substring of the complete exception text
-        self.assertIn(msg, six.text_type(nvh))
+        self.assertIn(msg, str(nvh))
 
     def _check_parse_options(self, opts, sep, converter, expected):
         good = scheduler_utils.parse_options(opts,
diff --git a/nova/tests/unit/scheduler/test_utils.py b/nova/tests/unit/scheduler/test_utils.py
index e5a5e73a0f49..2a5aeb6e0872 100644
--- a/nova/tests/unit/scheduler/test_utils.py
+++ b/nova/tests/unit/scheduler/test_utils.py
@@ -15,7 +15,6 @@ import mock
 import os_resource_classes as orc
 from oslo_serialization import jsonutils
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova import context as nova_context
 from nova import exception
@@ -1310,7 +1309,7 @@ class TestUtils(TestUtilsBase):
                 self.context, instance.uuid)
             self.assertIn(
                 'Expected to find allocations for source node resource '
-                'provider %s' % source_node.uuid, six.text_type(ex))
+                'provider %s' % source_node.uuid, str(ex))
 
         test()
 
diff --git a/nova/tests/unit/test_api_validation.py b/nova/tests/unit/test_api_validation.py
index a5d1e0064842..d7499ce94604 100644
--- a/nova/tests/unit/test_api_validation.py
+++ b/nova/tests/unit/test_api_validation.py
@@ -17,7 +17,6 @@ import re
 
 import fixtures
 from jsonschema import exceptions as jsonschema_exc
-import six
 
 from nova.api.openstack import api_version_request as api_version
 from nova.api import validation
@@ -284,7 +283,7 @@ class QueryParamsSchemaTestCase(test.NoDBTestCase):
         req.api_version_request = api_version.APIVersionRequest("2.1")
         ex = self.assertRaises(
             exception.ValidationError, self.controller.get, req)
-        self.assertIn("Query string is not UTF-8 encoded", six.text_type(ex))
+        self.assertIn("Query string is not UTF-8 encoded", str(ex))
 
     def test_strip_out_additional_properties(self):
         req = fakes.HTTPRequest.blank(
diff --git a/nova/tests/unit/test_availability_zones.py b/nova/tests/unit/test_availability_zones.py
index 6252ef10ac23..36f94ab422cd 100644
--- a/nova/tests/unit/test_availability_zones.py
+++ b/nova/tests/unit/test_availability_zones.py
@@ -19,7 +19,6 @@ Tests for availability zones
 
 import mock
 from oslo_utils.fixture import uuidsentinel
-import six
 
 from nova import availability_zones as az
 from nova.compute import api as compute_api
@@ -120,7 +119,7 @@ class AvailabilityZoneTestCases(test.TestCase):
         service = self._create_service_with_topic('network', self.host)
         services = db.service_get_all(self.context)
         az.set_availability_zones(self.context, services)
-        self.assertIsInstance(services[0]['host'], six.text_type)
+        self.assertIsInstance(services[0]['host'], str)
         cached_key = az._make_cache_key(services[0]['host'])
         self.assertIsInstance(cached_key, str)
         self._destroy_service(service)
diff --git a/nova/tests/unit/test_block_device.py b/nova/tests/unit/test_block_device.py
index 74a8c4e764fb..2e9d768d58db 100644
--- a/nova/tests/unit/test_block_device.py
+++ b/nova/tests/unit/test_block_device.py
@@ -20,7 +20,6 @@ Tests for Block Device utility functions.
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import units
-import six
 
 from nova import block_device
 from nova.compute import api as compute_api
@@ -630,8 +629,7 @@ class TestBlockDeviceDict(test.NoDBTestCase):
         ex = self.assertRaises(exception.InvalidBDMFormat,
                                block_device.BlockDeviceDict.from_api,
                                api_dict, False)
-        self.assertIn('Mapping image to local is not supported',
-                      six.text_type(ex))
+        self.assertIn('Mapping image to local is not supported', str(ex))
 
     def test_from_api_invalid_volume_type_to_destination_local_mapping(self):
         api_dict = {'id': 1,
@@ -643,7 +641,7 @@ class TestBlockDeviceDict(test.NoDBTestCase):
                                block_device.BlockDeviceDict.from_api,
                                api_dict, False)
         self.assertIn('Specifying a volume_type with destination_type=local '
-                      'is not supported', six.text_type(ex))
+                      'is not supported', str(ex))
 
     def test_from_api_invalid_specify_volume_type_with_source_volume_mapping(
             self):
@@ -656,7 +654,7 @@ class TestBlockDeviceDict(test.NoDBTestCase):
                                block_device.BlockDeviceDict.from_api,
                                api_dict, False)
         self.assertIn('Specifying volume type to existing volume is '
-                      'not supported', six.text_type(ex))
+                      'not supported', str(ex))
 
     def test_legacy(self):
         for legacy, new in zip(self.legacy_mapping, self.new_mapping):
diff --git a/nova/tests/unit/test_exception.py b/nova/tests/unit/test_exception.py
index 0db2ee906dd8..099ab9ba2ef6 100644
--- a/nova/tests/unit/test_exception.py
+++ b/nova/tests/unit/test_exception.py
@@ -18,7 +18,6 @@ import inspect
 
 import fixtures
 import mock
-import six
 from webob.util import status_reasons
 
 from nova import context
@@ -148,11 +147,10 @@ class NovaExceptionTestCase(test.NoDBTestCase):
             msg_fmt = "default message"
 
         exc = FakeNovaException()
-        self.assertEqual('default message', six.text_type(exc))
+        self.assertEqual('default message', str(exc))
 
     def test_error_msg(self):
-        self.assertEqual('test',
-                         six.text_type(exception.NovaException('test')))
+        self.assertEqual('test', str(exception.NovaException('test')))
         self.assertEqual('test',
                          exception.NovaException(Exception('test')).message)
 
@@ -161,7 +159,7 @@ class NovaExceptionTestCase(test.NoDBTestCase):
             msg_fmt = "default message: %(code)s"
 
         exc = FakeNovaException(code=500)
-        self.assertEqual('default message: 500', six.text_type(exc))
+        self.assertEqual('default message: 500', str(exc))
         self.assertEqual('default message: 500', exc.message)
 
     def test_error_msg_exception_with_kwargs(self):
@@ -169,7 +167,7 @@ class NovaExceptionTestCase(test.NoDBTestCase):
             msg_fmt = "default message: %(misspelled_code)s"
 
         exc = FakeNovaException(code=500, misspelled_code='blah')
-        self.assertEqual('default message: blah', six.text_type(exc))
+        self.assertEqual('default message: blah', str(exc))
         self.assertEqual('default message: blah', exc.message)
 
     def test_default_error_code(self):
@@ -198,7 +196,7 @@ class NovaExceptionTestCase(test.NoDBTestCase):
             msg_fmt = "some message"
 
         exc = FakeNovaException()
-        self.assertEqual(six.text_type(exc), exc.format_message())
+        self.assertEqual(str(exc), exc.format_message())
 
     def test_format_message_remote(self):
         class FakeNovaException_Remote(exception.NovaException):
@@ -208,7 +206,7 @@ class NovaExceptionTestCase(test.NoDBTestCase):
                 return "print the whole trace"
 
         exc = FakeNovaException_Remote()
-        self.assertEqual(u"print the whole trace", six.text_type(exc))
+        self.assertEqual(u"print the whole trace", str(exc))
         self.assertEqual("some message", exc.format_message())
 
     def test_format_message_remote_error(self):
diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py
index 45c2b6a6a8ce..b74a0a533eaa 100644
--- a/nova/tests/unit/test_metadata.py
+++ b/nova/tests/unit/test_metadata.py
@@ -36,7 +36,6 @@ from oslo_serialization import jsonutils
 from oslo_utils import encodeutils
 from oslo_utils.fixture import uuidsentinel as uuids
 import requests
-import six
 import webob
 
 from nova.api.metadata import base
@@ -933,7 +932,7 @@ class OpenStackMetadataTestCase(test.TestCase):
                 # Verify the warning message is the one we expect which is the
                 # first and only arg to the first and only call to the warning.
                 self.assertIn('Passing insecure dynamic vendordata requests',
-                              six.text_type(warning_calls[0][0]))
+                              str(warning_calls[0][0]))
             self.assertEqual('10.0.0.1', vd['static'].get('ldap'))
             self.assertEqual('10.0.0.2', vd['static'].get('ad'))
 
diff --git a/nova/tests/unit/test_rpc.py b/nova/tests/unit/test_rpc.py
index 59503316b350..1c55fabe2b7c 100644
--- a/nova/tests/unit/test_rpc.py
+++ b/nova/tests/unit/test_rpc.py
@@ -16,7 +16,6 @@ import mock
 import oslo_messaging as messaging
 from oslo_messaging.rpc import dispatcher
 from oslo_serialization import jsonutils
-import six
 
 import nova.conf
 from nova import context
@@ -354,7 +353,7 @@ class TestJsonPayloadSerializer(test.NoDBTestCase):
         self.assertIsInstance(primitive, dict)
         # Convert anything else, should get a string.
         primitive = rpc.JsonPayloadSerializer.fallback(mock.sentinel.entity)
-        self.assertIsInstance(primitive, six.text_type)
+        self.assertIsInstance(primitive, str)
 
 
 class TestRequestContextSerializer(test.NoDBTestCase):
diff --git a/nova/tests/unit/test_test.py b/nova/tests/unit/test_test.py
index 78bb36815b97..97a1f7792f3b 100644
--- a/nova/tests/unit/test_test.py
+++ b/nova/tests/unit/test_test.py
@@ -23,7 +23,6 @@ import uuid
 import mock
 from oslo_log import log as logging
 import oslo_messaging as messaging
-import six
 
 import nova.conf
 from nova import exception
@@ -125,10 +124,10 @@ class JsonTestCase(test.NoDBTestCase):
                 e.difference)
             self.assertIn(
                 "actual:\n{'top': {'l1': {'l2': ['c', 'a', 'b', 'd']}}}",
-                six.text_type(e))
+                str(e))
             self.assertIn(
                 "expected:\n{'top': {'l1': {'l2': ['a', 'b', 'c']}}}",
-                six.text_type(e))
+                str(e))
         else:
             self.fail("This should have raised a mismatch exception")
 
@@ -206,10 +205,10 @@ class JsonTestCase(test.NoDBTestCase):
                 e.difference)
             self.assertIn(
                 "actual:\n{'top': {'l1': {'l2': ['c', 'a', 'd']}}}",
-                six.text_type(e))
+                str(e))
             self.assertIn(
                 "expected:\n{'top': {'l1': {'l2': ['a', 'b', 'c']}}}",
-                six.text_type(e))
+                str(e))
         else:
             self.fail("This should have raised a mismatch exception")
 
@@ -233,11 +232,9 @@ class JsonTestCase(test.NoDBTestCase):
         except Exception as e:
             self.assertEqual(
                 "3 != 4: path: root.top.l1.l2.c", e.difference)
-            self.assertIn("actual:\n{'top': {'l1': {'l2': {", six.text_type(e))
-            self.assertIn(
-                "expected:\n{'top': {'l1': {'l2': {", six.text_type(e))
-            self.assertIn(
-                "message: test message\n", six.text_type(e))
+            self.assertIn("actual:\n{'top': {'l1': {'l2': {", str(e))
+            self.assertIn("expected:\n{'top': {'l1': {'l2': {", str(e))
+            self.assertIn("message: test message\n", str(e))
         else:
             self.fail("This should have raised a mismatch exception")
 
@@ -310,13 +307,13 @@ class NovaExceptionReraiseFormatErrorTestCase(test.NoDBTestCase):
         # wrong kwarg
         ex = self.assertRaises(KeyError, FakeImageException,
                                bogus='wrongkwarg')
-        self.assertIn('image_id', six.text_type(ex))
+        self.assertIn('image_id', str(ex))
         # no kwarg
         ex = self.assertRaises(KeyError, FakeImageException)
-        self.assertIn('image_id', six.text_type(ex))
+        self.assertIn('image_id', str(ex))
         # not enough kwargs
         ex = self.assertRaises(KeyError, FakeImageException, image_id='image')
-        self.assertIn('type', six.text_type(ex))
+        self.assertIn('type', str(ex))
 
 
 class PatchExistsTestCase(test.NoDBTestCase):
diff --git a/nova/tests/unit/test_utils.py b/nova/tests/unit/test_utils.py
index dce9430be974..03f565b7e498 100644
--- a/nova/tests/unit/test_utils.py
+++ b/nova/tests/unit/test_utils.py
@@ -31,7 +31,6 @@ from oslo_context import fixture as context_fixture
 from oslo_utils import encodeutils
 from oslo_utils import fixture as utils_fixture
 from oslo_utils.secretutils import md5
-import six
 
 from nova import context
 from nova import exception
@@ -215,8 +214,7 @@ class GenericUtilsTestCase(test.NoDBTestCase):
         instance.display_name = u'\u00CD\u00F1st\u00E1\u00F1c\u00E9'
         # should be a bytes string if python2 before conversion
         self.assertIs(str, type(repr(instance)))
-        self.assertIs(six.text_type,
-                      type(utils.get_obj_repr_unicode(instance)))
+        self.assertIs(str, type(utils.get_obj_repr_unicode(instance)))
 
     @mock.patch('oslo_concurrency.processutils.execute')
     def test_ssh_execute(self, mock_execute):
diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py
index d2f584d9d62e..54d910abeaf6 100644
--- a/nova/tests/unit/virt/ironic/test_driver.py
+++ b/nova/tests/unit/virt/ironic/test_driver.py
@@ -23,7 +23,6 @@ from oslo_config import cfg
 from oslo_service import loopingcall
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import uuidutils
-import six
 from testtools import matchers
 from tooz import hashring as hash_ring
 
@@ -2008,7 +2007,7 @@ class IronicDriverTestCase(test.NoDBTestCase):
         instance = fake_instance.fake_instance_obj(self.ctx,
                                                    node=node_uuid)
         network_info = utils.get_test_network_info()
-        vif_id = six.text_type(network_info[0]['id'])
+        vif_id = str(network_info[0]['id'])
 
         self.driver._plug_vifs(node, instance, network_info)
 
@@ -2133,7 +2132,7 @@ class IronicDriverTestCase(test.NoDBTestCase):
         instance = fake_instance.fake_instance_obj(self.ctx,
                                                    node=node_id)
         network_info = utils.get_test_network_info()
-        vif_id = six.text_type(network_info[0]['id'])
+        vif_id = str(network_info[0]['id'])
         self.driver.unplug_vifs(instance, network_info)
 
         # asserts
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index 77b93fc74f43..ed49dbb4db1d 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -59,7 +59,6 @@ from oslo_utils import strutils
 from oslo_utils import units
 from oslo_utils import uuidutils
 from oslo_utils import versionutils
-import six
 
 from nova.api.metadata import base as instance_metadata
 from nova.compute import manager
@@ -1448,7 +1447,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
         self.assertIn(
             "Reserving memory via '[DEFAULT] reserved_host_memory_mb' is not "
             "compatible",
-            six.text_type(mock_log.call_args[0]),
+            str(mock_log.call_args[0]),
         )
 
     def test__check_cpu_compatibility_start_ok(self):
@@ -1547,7 +1546,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
         exc = self.assertRaises(exception.InvalidConfiguration,
                                 drvr.init_host, 'dummyhost')
         self.assertIn("vTPM support requires '[libvirt] virt_type' of 'qemu' "
-                      "or 'kvm'; found 'lxc'.", six.text_type(exc))
+                      "or 'kvm'; found 'lxc'.", str(exc))
 
     @mock.patch.object(host.Host, 'has_min_version', return_value=True)
     @mock.patch('shutil.which')
@@ -1690,7 +1689,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
         ex = self.assertRaises(exception.InvalidConfiguration,
                                drvr._check_cpu_set_configuration)
         self.assertIn("The 'reserved_host_cpus' config option cannot be "
-                      "defined alongside ", six.text_type(ex))
+                      "defined alongside ", str(ex))
 
     @mock.patch.object(libvirt_driver.LOG, 'warning')
     def test_check_cpu_set_configuration__vcpu_pin_set(self, mock_log):
@@ -1709,7 +1708,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
         self.assertIn("When defined, 'vcpu_pin_set' will be used to calculate "
                       "'VCPU' inventory and schedule instances that have "
                       "'VCPU' allocations.",
-                      six.text_type(mock_log.call_args[0]))
+                      str(mock_log.call_args[0]))
 
     @mock.patch.object(libvirt_driver.LOG, 'warning')
     def test_check_cpu_set_configuration__vcpu_pin_set_cpu_shared_set(
@@ -1728,7 +1727,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
         mock_log.assert_called_once()
         self.assertIn("The '[compute] cpu_shared_set' and 'vcpu_pin_set' "
                       "config options have both been defined.",
-                      six.text_type(mock_log.call_args[0]))
+                      str(mock_log.call_args[0]))
 
     def test_check_cpu_set_configuration__vcpu_pin_set_cpu_dedicated_set(
             self):
@@ -1745,7 +1744,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
                                drvr._check_cpu_set_configuration)
         self.assertIn("The 'vcpu_pin_set' config option has been deprecated "
                       "and cannot be defined alongside '[compute] "
-                      "cpu_dedicated_set'.", six.text_type(ex))
+                      "cpu_dedicated_set'.", str(ex))
 
     def _do_test_parse_migration_flags(self, lm_expected=None,
                                        bm_expected=None):
@@ -2193,7 +2192,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
                       'provider status to "enabled" for provider: %s' %
                       uuids.rp_uuid, log_output)
         # The error should have been logged as well.
-        self.assertIn(six.text_type(error), log_output)
+        self.assertIn(str(error), log_output)
 
     @mock.patch.object(fakelibvirt.virConnect, "nodeDeviceLookupByName")
     def test_prepare_pci_device(self, mock_lookup):
@@ -19866,8 +19865,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
                                create=True) as mock_define:
             srcfile = "/first/path"
             dstfile = "/second/path"
-            orig_xml = six.text_type(mock.sentinel.orig_xml)
-            new_xml = six.text_type(mock.sentinel.new_xml)
+            orig_xml = str(mock.sentinel.orig_xml)
+            new_xml = str(mock.sentinel.new_xml)
 
             mock_dom.XMLDesc.return_value = orig_xml
             mock_dom.isPersistent.return_value = True
@@ -20515,7 +20514,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
             image_meta=image_meta, disk_info=disk_info, accel_info=accel_info)
         mock_add_accel.assert_called_once_with(mock.ANY, [])
         self.assertIn('Ignoring accelerator requests for instance',
-                      six.text_type(mock_log.call_args[0]))
+                      str(mock_log.call_args[0]))
 
     def test_get_guest_disk_config_rbd_older_config_drive_fall_back(self):
         # New config drives are stored in rbd but existing instances have
@@ -21507,7 +21506,7 @@ class TestUpdateProviderTree(test.NoDBTestCase):
                                self.pt, self.cn_rp['name'],
                                allocations=allocations)
         self.assertIn('Unexpected VGPU resource allocation on provider %s'
-                      % uuids.other_rp, six.text_type(ex))
+                      % uuids.other_rp, str(ex))
 
     @mock.patch('nova.objects.instance.Instance.get_by_uuid')
     @mock.patch('nova.objects.migration.MigrationList'
@@ -23654,7 +23653,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
         self.assertFalse(mock_log.error.called)
         self.assertEqual(1, mock_log.warning.call_count)
         self.assertIn('the device is no longer found on the guest',
-                      six.text_type(mock_log.warning.call_args[0]))
+                      str(mock_log.warning.call_args[0]))
 
     @mock.patch('nova.virt.libvirt.driver.LOG')
     def test_detach_interface_guest_not_found_after_detach(self, mock_log):
@@ -26710,7 +26709,7 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
                                    self.drvr._volume_snapshot_delete,
                                    self.c, instance, self.volume_uuid,
                                    snapshot_id, self.delete_info_1)
-            self.assertIn('has not been fully tested', six.text_type(ex))
+            self.assertIn('has not been fully tested', str(ex))
 
     @mock.patch('time.sleep', new=mock.Mock())
     @mock.patch.object(host.Host, '_get_domain')
diff --git a/nova/tests/unit/virt/libvirt/test_guest.py b/nova/tests/unit/virt/libvirt/test_guest.py
index bbf35f0b300d..2c7de622c10a 100644
--- a/nova/tests/unit/virt/libvirt/test_guest.py
+++ b/nova/tests/unit/virt/libvirt/test_guest.py
@@ -19,7 +19,6 @@ import sys
 import mock
 from oslo_service import fixture as service_fixture
 from oslo_utils import encodeutils
-import six
 
 from nova import context
 from nova import exception
@@ -280,7 +279,7 @@ class GuestTestCase(test.NoDBTestCase):
         ex = self.assertRaises(
             exception.DeviceNotFound, self.guest.detach_device_with_retry,
             get_config, "/dev/vdb", live=True)
-        self.assertIn("/dev/vdb", six.text_type(ex))
+        self.assertIn("/dev/vdb", str(ex))
 
     def test_detach_device_with_retry_device_not_found_alt_name(self):
         """Tests to make sure we use the alternative name in errors."""
@@ -290,7 +289,7 @@ class GuestTestCase(test.NoDBTestCase):
             exception.DeviceNotFound, self.guest.detach_device_with_retry,
             get_config, mock.sentinel.device, live=True,
             alternative_device_name='foo')
-        self.assertIn('foo', six.text_type(ex))
+        self.assertIn('foo', str(ex))
 
     @mock.patch.object(libvirt_guest.Guest, "detach_device")
     def _test_detach_device_with_retry_second_detach_failure(
diff --git a/nova/tests/unit/virt/libvirt/test_migration.py b/nova/tests/unit/virt/libvirt/test_migration.py
index 6166458ccc38..950ed67e8c34 100644
--- a/nova/tests/unit/virt/libvirt/test_migration.py
+++ b/nova/tests/unit/virt/libvirt/test_migration.py
@@ -20,7 +20,6 @@ from lxml import etree
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import units
-import six
 
 from nova.compute import power_state
 from nova import exception
@@ -896,8 +895,7 @@ class UtilityMigrationTestCase(test.NoDBTestCase):
         ex = self.assertRaises(exception.NovaException,
                                migration._update_vif_xml,
                                doc, data, get_vif_config)
-        self.assertIn('Unable to find MAC address in interface XML',
-                      six.text_type(ex))
+        self.assertIn('Unable to find MAC address in interface XML', str(ex))
 
     def test_update_vif_xml_no_matching_vif(self):
         """Tests that the vif in the migrate data is not found in the existing
@@ -921,7 +919,7 @@ class UtilityMigrationTestCase(test.NoDBTestCase):
         doc = etree.fromstring(original_xml)
         ex = self.assertRaises(KeyError, migration._update_vif_xml,
                                doc, data, get_vif_config)
-        self.assertIn("CA:FE:DE:AD:BE:EF", six.text_type(ex))
+        self.assertIn("CA:FE:DE:AD:BE:EF", str(ex))
 
 
 class MigrationMonitorTestCase(test.NoDBTestCase):
diff --git a/nova/tests/unit/virt/libvirt/test_vif.py b/nova/tests/unit/virt/libvirt/test_vif.py
index a3a781907163..7b6dde6423b9 100644
--- a/nova/tests/unit/virt/libvirt/test_vif.py
+++ b/nova/tests/unit/virt/libvirt/test_vif.py
@@ -22,7 +22,6 @@ from os_vif.objects import fields as osv_fields
 from oslo_concurrency import processutils
 from oslo_config import cfg
 from oslo_utils.fixture import uuidsentinel as uuids
-import six
 
 from nova import exception
 from nova.network import model as network_model
@@ -1215,9 +1214,9 @@ class LibvirtVifTestCase(test.NoDBTestCase):
                           self._get_instance_xml,
                           d,
                           self.vif_macvtap_exception)
-        self.assertIn('macvtap_source', six.text_type(e))
-        self.assertIn('macvtap_mode', six.text_type(e))
-        self.assertIn('physical_interface', six.text_type(e))
+        self.assertIn('macvtap_source', str(e))
+        self.assertIn('macvtap_mode', str(e))
+        self.assertIn('physical_interface', str(e))
 
     @mock.patch('nova.virt.libvirt.vif.ensure_vlan')
     def test_macvtap_plug_vlan(self, ensure_vlan_mock):
diff --git a/nova/tests/unit/virt/libvirt/volume/test_quobyte.py b/nova/tests/unit/virt/libvirt/volume/test_quobyte.py
index 5e6aba3cd259..8a0c647fc858 100644
--- a/nova/tests/unit/virt/libvirt/volume/test_quobyte.py
+++ b/nova/tests/unit/virt/libvirt/volume/test_quobyte.py
@@ -22,7 +22,6 @@ import mock
 from oslo_concurrency import processutils
 from oslo_utils import fileutils
 import psutil
-import six
 
 from nova import exception as nova_exception
 from nova import test
@@ -51,7 +50,7 @@ class QuobyteTestCase(test.NoDBTestCase):
             self.assertIsInstance(exc, excClass,
                                   'Wrong exception caught: %s Stacktrace: %s' %
                                   (exc, traceback.format_exc()))
-            self.assertIn(msg, six.text_type(exc))
+            self.assertIn(msg, str(exc))
 
         if not caught:
             self.fail('Expected raised exception but nothing caught.')
diff --git a/nova/tests/unit/virt/powervm/test_driver.py b/nova/tests/unit/virt/powervm/test_driver.py
index 25e99cd4b68e..025d823d15d8 100644
--- a/nova/tests/unit/virt/powervm/test_driver.py
+++ b/nova/tests/unit/virt/powervm/test_driver.py
@@ -24,7 +24,6 @@ from pypowervm.helpers import log_helper as pvm_hlp_log
 from pypowervm.helpers import vios_busy as pvm_hlp_vbusy
 from pypowervm.utils import transaction as pvm_tx
 from pypowervm.wrappers import virtual_io_server as pvm_vios
-import six
 
 from nova import block_device as nova_block_device
 from nova.compute import provider_tree
@@ -505,11 +504,11 @@ class TestPowerVMDriver(test.NoDBTestCase):
         mock_tf_run.side_effect = exception.InstanceNotFound('id')
         exc = self.assertRaises(exception.VirtualInterfacePlugException,
                                 self.drv.plug_vifs, mock_inst, 'net_info')
-        self.assertIn('instance', six.text_type(exc))
+        self.assertIn('instance', str(exc))
         mock_tf_run.side_effect = Exception
         exc = self.assertRaises(exception.VirtualInterfacePlugException,
                                 self.drv.plug_vifs, mock_inst, 'net_info')
-        self.assertIn('unexpected', six.text_type(exc))
+        self.assertIn('unexpected', str(exc))
 
     @mock.patch('nova.virt.powervm.tasks.base.run', autospec=True)
     @mock.patch('nova.virt.powervm.tasks.network.UnplugVifs', autospec=True)
diff --git a/nova/tests/unit/virt/test_images.py b/nova/tests/unit/virt/test_images.py
index 199d4cf8e1c6..085b169db3c6 100644
--- a/nova/tests/unit/virt/test_images.py
+++ b/nova/tests/unit/virt/test_images.py
@@ -16,7 +16,6 @@ import os
 
 import mock
 from oslo_concurrency import processutils
-import six
 
 from nova.compute import utils as compute_utils
 from nova import exception
@@ -78,7 +77,7 @@ class QemuTestCase(test.NoDBTestCase):
         exc = self.assertRaises(exception.InvalidDiskInfo,
                                 images.qemu_img_info,
                                 '/fake/path')
-        self.assertIn('qemu-img aborted by prlimits', six.text_type(exc))
+        self.assertIn('qemu-img aborted by prlimits', str(exc))
 
     @mock.patch('oslo_concurrency.processutils.execute')
     @mock.patch.object(os.path, 'exists', return_value=True)
diff --git a/nova/tests/unit/virt/test_virt.py b/nova/tests/unit/virt/test_virt.py
index ca46bc5b390a..11f306c761f9 100644
--- a/nova/tests/unit/virt/test_virt.py
+++ b/nova/tests/unit/virt/test_virt.py
@@ -17,7 +17,6 @@ import io
 
 import mock
 import os_traits
-import six
 
 from nova import test
 from nova.virt.disk import api as disk_api
@@ -133,7 +132,7 @@ class FakeMount(object):
 
 class TestDiskImage(test.NoDBTestCase):
     def mock_proc_mounts(self, mock_open):
-        response = io.StringIO(six.text_type(PROC_MOUNTS_CONTENTS))
+        response = io.StringIO(str(PROC_MOUNTS_CONTENTS))
         mock_open.return_value = response
 
     @mock.patch('builtins.open')
diff --git a/nova/tests/unit/virt/vmwareapi/test_vmops.py b/nova/tests/unit/virt/vmwareapi/test_vmops.py
index 102f6e505975..8eb77ec9275b 100644
--- a/nova/tests/unit/virt/vmwareapi/test_vmops.py
+++ b/nova/tests/unit/virt/vmwareapi/test_vmops.py
@@ -23,7 +23,6 @@ from oslo_utils import uuidutils
 from oslo_vmware import exceptions as vexc
 from oslo_vmware.objects import datastore as ds_obj
 from oslo_vmware import vim_util as vutil
-import six
 
 from nova.compute import power_state
 from nova import context
@@ -1734,9 +1733,9 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
             self._verify_spawn_method_calls(_call_method, extras)
 
             dc_ref = 'fake_dc_ref'
-            source_file = six.text_type('[fake_ds] vmware_base/%s/%s.vmdk' %
+            source_file = ('[fake_ds] vmware_base/%s/%s.vmdk' %
                           (self._image_id, self._image_id))
-            dest_file = six.text_type('[fake_ds] vmware_base/%s/%s.%d.vmdk' %
+            dest_file = ('[fake_ds] vmware_base/%s/%s.%d.vmdk' %
                           (self._image_id, self._image_id,
                           self._instance['root_gb']))
             # TODO(dims): add more tests for copy_virtual_disk after
diff --git a/nova/tests/unit/volume/test_cinder.py b/nova/tests/unit/volume/test_cinder.py
index 4ca8e4ee3e88..0d53ab2c6962 100644
--- a/nova/tests/unit/volume/test_cinder.py
+++ b/nova/tests/unit/volume/test_cinder.py
@@ -23,7 +23,6 @@ from keystoneclient import exceptions as keystone_exception
 import mock
 from oslo_utils.fixture import uuidsentinel as uuids
 from oslo_utils import timeutils
-import six
 
 import nova.conf
 from nova import context
@@ -218,7 +217,7 @@ class CinderApiTestCase(test.NoDBTestCase):
 
         ex = self.assertRaises(exception.NotFound,
                                self.api.create, self.ctx, 1, '', '')
-        self.assertEqual('Volume type can not be found.', six.text_type(ex))
+        self.assertEqual('Volume type can not be found.', str(ex))
 
     @mock.patch('nova.volume.cinder.cinderclient')
     def test_create_over_quota_failed(self, mock_cinderclient):
@@ -531,7 +530,7 @@ class CinderApiTestCase(test.NoDBTestCase):
                                attachment_id)
 
         self.assertEqual(404, ex.code)
-        self.assertIn(attachment_id, six.text_type(ex))
+        self.assertIn(attachment_id, str(ex))
 
     @mock.patch('nova.volume.cinder.cinderclient',
                 side_effect=exception.CinderAPIVersionNotAvailable(
@@ -604,7 +603,7 @@ class CinderApiTestCase(test.NoDBTestCase):
                                attachment_id)
 
         self.assertEqual(404, ex.code)
-        self.assertIn(attachment_id, six.text_type(ex))
+        self.assertIn(attachment_id, str(ex))
 
     @mock.patch('nova.volume.cinder.cinderclient',
                 side_effect=exception.CinderAPIVersionNotAvailable(
@@ -725,7 +724,7 @@ class CinderApiTestCase(test.NoDBTestCase):
                                attachment_id)
 
         self.assertEqual(404, ex.code)
-        self.assertIn(attachment_id, six.text_type(ex))
+        self.assertIn(attachment_id, str(ex))
 
     @mock.patch('nova.volume.cinder.cinderclient',
                 side_effect=exception.CinderAPIVersionNotAvailable(
diff --git a/requirements.txt b/requirements.txt
index ccf10aa7b9a2..36c97f5a26ad 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -29,7 +29,6 @@ keystoneauth1>=3.16.0 # Apache-2.0
 python-neutronclient>=6.7.0 # Apache-2.0
 python-glanceclient>=2.8.0 # Apache-2.0
 requests>=2.23.0 # Apache-2.0
-six>=1.11.0 # MIT
 stevedore>=1.20.0 # Apache-2.0
 websockify>=0.9.0 # LGPLv3
 oslo.cache>=1.26.0 # Apache-2.0