From 8ee8ee15b1158ff9ca7bd045cbbfd8c39a2db1d9 Mon Sep 17 00:00:00 2001
From: songwenping <songwenping@inspur.com>
Date: Fri, 28 May 2021 15:40:50 +0800
Subject: [PATCH] Replace assertDictMatch with assertDictEqual method in tests

assertDictMatch was introduced for Python 2.6 only.
Python 2.7+ contains assertDictEqual.

Closes-Bug: #1646433
Change-Id: I41738cc0bd90656508fc6ff390072b55130cc6fc
---
 manila/test.py                                | 63 +-----------
 manila/tests/api/test_common.py               |  6 +-
 manila/tests/api/v1/test_limits.py            |  4 +-
 manila/tests/api/v1/test_scheduler_stats.py   | 10 +-
 manila/tests/api/v2/test_messages.py          |  2 +-
 manila/tests/api/v2/test_share_types.py       |  4 +-
 manila/tests/api/v2/test_shares.py            |  8 +-
 manila/tests/db/sqlalchemy/test_api.py        | 96 ++++++++++++-------
 manila/tests/scheduler/drivers/test_filter.py |  6 +-
 manila/tests/scheduler/test_host_manager.py   |  6 +-
 .../share/drivers/container/test_driver.py    |  2 +-
 .../drivers/container/test_storage_helper.py  | 10 +-
 .../drivers/infortrend/test_infortrend_nas.py |  4 +-
 .../dataontap/client/test_client_cmode.py     |  6 +-
 .../dataontap/cluster_mode/test_lib_base.py   | 28 +++---
 .../cluster_mode/test_lib_multi_svm.py        |  2 +-
 manila/tests/share/test_share_types.py        |  2 +-
 tools/install_venv.py                         |  1 -
 tools/install_venv_common.py                  |  4 -
 19 files changed, 114 insertions(+), 150 deletions(-)

diff --git a/manila/test.py b/manila/test.py
index 0056f8b51a..1e528edc9c 100644
--- a/manila/test.py
+++ b/manila/test.py
@@ -247,65 +247,7 @@ class TestCase(base_test.BaseTestCase):
         self.addCleanup(patcher.stop)
         return new_val
 
-    # Useful assertions
-    def assertDictMatch(self, d1, d2, approx_equal=False, tolerance=0.001):
-        """Assert two dicts are equivalent.
-
-        This is a 'deep' match in the sense that it handles nested
-        dictionaries appropriately.
-
-        NOTE:
-
-            If you don't care (or don't know) a given value, you can specify
-            the string DONTCARE as the value. This will cause that dict-item
-            to be skipped.
-
-        """
-        def raise_assertion(msg):
-            d1str = str(d1)
-            d2str = str(d2)
-            base_msg = ('Dictionaries do not match. %(msg)s d1: %(d1str)s '
-                        'd2: %(d2str)s' %
-                        {"msg": msg, "d1str": d1str, "d2str": d2str})
-            raise AssertionError(base_msg)
-
-        d1keys = set(d1.keys())
-        d2keys = set(d2.keys())
-        if d1keys != d2keys:
-            d1only = d1keys - d2keys
-            d2only = d2keys - d1keys
-            raise_assertion('Keys in d1 and not d2: %(d1only)s. '
-                            'Keys in d2 and not d1: %(d2only)s' %
-                            {"d1only": d1only, "d2only": d2only})
-
-        for key in d1keys:
-            d1value = d1[key]
-            d2value = d2[key]
-            try:
-                error = abs(float(d1value) - float(d2value))
-                within_tolerance = error <= tolerance
-            except (ValueError, TypeError):
-                # If both values aren't convertible to float, just ignore
-                # ValueError if arg is a str, TypeError if it's something else
-                # (like None)
-                within_tolerance = False
-
-            if hasattr(d1value, 'keys') and hasattr(d2value, 'keys'):
-                self.assertDictMatch(d1value, d2value)
-            elif 'DONTCARE' in (d1value, d2value):
-                continue
-            elif approx_equal and within_tolerance:
-                continue
-            elif d1value != d2value:
-                raise_assertion("d1['%(key)s']=%(d1value)s != "
-                                "d2['%(key)s']=%(d2value)s" %
-                                {
-                                    "key": key,
-                                    "d1value": d1value,
-                                    "d2value": d2value
-                                })
-
-    def assertDictListMatch(self, L1, L2, approx_equal=False, tolerance=0.001):
+    def assertDictListMatch(self, L1, L2):
         """Assert a list of dicts are equivalent."""
         def raise_assertion(msg):
             L1str = str(L1)
@@ -323,8 +265,7 @@ class TestCase(base_test.BaseTestCase):
                             {"L1count": L1count, "L2count": L2count})
 
         for d1, d2 in zip(L1, L2):
-            self.assertDictMatch(d1, d2, approx_equal=approx_equal,
-                                 tolerance=tolerance)
+            self.assertDictEqual(d1, d2)
 
     def assertSubDictMatch(self, sub_dict, super_dict):
         """Assert a sub_dict is subset of super_dict."""
diff --git a/manila/tests/api/test_common.py b/manila/tests/api/test_common.py
index 4334135ed9..7f7fd973a9 100644
--- a/manila/tests/api/test_common.py
+++ b/manila/tests/api/test_common.py
@@ -279,7 +279,7 @@ class MiscFunctionsTest(test.TestCase):
         actual_params = common.validate_public_share_policy(
             'fake_context', api_params)
 
-        self.assertDictMatch(api_params, actual_params)
+        self.assertDictEqual(api_params, actual_params)
         policy.check_policy.assert_not_called()
 
     @ddt.data('foo', 123, 'all', None)
@@ -313,7 +313,7 @@ class MiscFunctionsTest(test.TestCase):
         actual_params = common.validate_public_share_policy(
             'fake_context', api_params, api='update')
 
-        self.assertDictMatch({'is_public': False, 'size': '16'}, actual_params)
+        self.assertDictEqual({'is_public': False, 'size': '16'}, actual_params)
         policy.check_policy.assert_called_once_with(
             'fake_context', 'share', 'set_public_share', do_raise=False)
 
@@ -325,7 +325,7 @@ class MiscFunctionsTest(test.TestCase):
         actual_params = common.validate_public_share_policy(
             'fake_context', api_params, api='update')
 
-        self.assertDictMatch({'is_public': True, 'size': '16'}, actual_params)
+        self.assertDictEqual({'is_public': True, 'size': '16'}, actual_params)
         policy.check_policy.assert_called_once_with(
             'fake_context', 'share', 'set_public_share', do_raise=False)
 
diff --git a/manila/tests/api/v1/test_limits.py b/manila/tests/api/v1/test_limits.py
index 598ec8730e..91141ea510 100644
--- a/manila/tests/api/v1/test_limits.py
+++ b/manila/tests/api/v1/test_limits.py
@@ -846,7 +846,7 @@ class LimitsViewBuilderTest(test.TestCase):
         output = self.view_builder.build(request,
                                          self.rate_limits,
                                          self.absolute_limits)
-        self.assertDictMatch(expected_limits, output)
+        self.assertDictEqual(expected_limits, output)
 
     def test_build_limits_empty_limits(self):
         request = fakes.HTTPRequest.blank('/')
@@ -856,4 +856,4 @@ class LimitsViewBuilderTest(test.TestCase):
 
         output = self.view_builder.build(request, rate_limits, abs_limits)
 
-        self.assertDictMatch(expected_limits, output)
+        self.assertDictEqual(expected_limits, output)
diff --git a/manila/tests/api/v1/test_scheduler_stats.py b/manila/tests/api/v1/test_scheduler_stats.py
index 5757688c55..f650ed338b 100644
--- a/manila/tests/api/v1/test_scheduler_stats.py
+++ b/manila/tests/api/v1/test_scheduler_stats.py
@@ -102,7 +102,7 @@ class SchedulerStatsControllerTestCase(test.TestCase):
             ]
         }
 
-        self.assertDictMatch(result, expected)
+        self.assertDictEqual(result, expected)
         mock_get_pools.assert_called_once_with(self.ctxt, filters={},
                                                cached=True)
         self.mock_policy_check.assert_called_once_with(
@@ -149,7 +149,7 @@ class SchedulerStatsControllerTestCase(test.TestCase):
 
         result = self.controller._pools(req, action, False)
 
-        self.assertDictMatch(result, expected_result)
+        self.assertDictEqual(result, expected_result)
         mock_get_pools.assert_called_once_with(self.ctxt,
                                                filters=expected_filters,
                                                cached=True)
@@ -212,7 +212,7 @@ class SchedulerStatsControllerTestCase(test.TestCase):
 
         result = self.controller._pools(req, action, True)
 
-        self.assertDictMatch(result, expected_result)
+        self.assertDictEqual(result, expected_result)
         mock_get_pools.assert_called_once_with(self.ctxt,
                                                filters=expected_filters,
                                                cached=True)
@@ -274,7 +274,7 @@ class SchedulerStatsControllerTestCase(test.TestCase):
                 {'capabilities': {'snapshot_support': True}})
             expected_filters.pop('share_type', None)
 
-        self.assertDictMatch(result, expected)
+        self.assertDictEqual(result, expected)
         mock_get_pools.assert_called_once_with(self.ctxt,
                                                filters=expected_filters,
                                                cached=True)
@@ -328,7 +328,7 @@ class SchedulerStatsControllerTestCase(test.TestCase):
             ],
         }
 
-        self.assertDictMatch(expected, result)
+        self.assertDictEqual(expected, result)
         mock_get_pools.assert_called_once_with(self.ctxt, filters={},
                                                cached=True)
         self.mock_policy_check.assert_called_once_with(
diff --git a/manila/tests/api/v2/test_messages.py b/manila/tests/api/v2/test_messages.py
index 7ff91f2eee..457e5f6dec 100644
--- a/manila/tests/api/v2/test_messages.py
+++ b/manila/tests/api/v2/test_messages.py
@@ -169,7 +169,7 @@ class MessageApiTest(test.TestCase):
         ex1 = self._expected_message_from_controller(msg1['id'])['message']
         ex2 = self._expected_message_from_controller(msg2['id'])['message']
         expected = {'messages': [ex1, ex2]}
-        self.assertDictMatch(expected, res_dict)
+        self.assertDictEqual(expected, res_dict)
 
     def test_index_with_limit_and_offset(self):
         msg2 = stubs.stub_message(fakes.get_fake_uuid())
diff --git a/manila/tests/api/v2/test_share_types.py b/manila/tests/api/v2/test_share_types.py
index 9240466bc7..35add9d63a 100644
--- a/manila/tests/api/v2/test_share_types.py
+++ b/manila/tests/api/v2/test_share_types.py
@@ -364,7 +364,7 @@ class ShareTypesAPITest(test.TestCase):
         if self.is_microversion_ge(version, '2.41'):
             expected_share_type['description'] = 'description_test'
 
-        self.assertDictMatch(expected_share_type, output['share_type'])
+        self.assertDictEqual(expected_share_type, output['share_type'])
 
     @ddt.data(
         ('1.0', 'os-share-type-access', True),
@@ -427,7 +427,7 @@ class ShareTypesAPITest(test.TestCase):
             expected_share_type['description'] = 'description_test'
         for i in range(0, 10):
             expected_share_type['id'] = 42 + i
-            self.assertDictMatch(expected_share_type,
+            self.assertDictEqual(expected_share_type,
                                  output['share_types'][i])
 
     @ddt.data(None, True, 'true', 'false', 'all')
diff --git a/manila/tests/api/v2/test_shares.py b/manila/tests/api/v2/test_shares.py
index d4c803302e..4184c4273f 100644
--- a/manila/tests/api/v2/test_shares.py
+++ b/manila/tests/api/v2/test_shares.py
@@ -686,7 +686,7 @@ class ShareAPITest(test.TestCase):
 
         expected = self._get_expected_share_detailed_response(
             shr, version='2.7')
-        self.assertDictMatch(expected, res_dict)
+        self.assertDictEqual(expected, res_dict)
         # pylint: disable=unsubscriptable-object
         self.assertEqual("fakenetid",
                          create_mock.call_args[1]['share_network_id'])
@@ -1352,7 +1352,7 @@ class ShareAPITest(test.TestCase):
         res_dict = self.controller.create(req, body)
         expected = self._get_expected_share_detailed_response(
             shr, version='2.7')
-        self.assertDictMatch(expected, res_dict)
+        self.assertDictEqual(expected, res_dict)
         # pylint: disable=unsubscriptable-object
         self.assertEqual(parent_share_net,
                          create_mock.call_args[1]['share_network_id'])
@@ -1443,7 +1443,7 @@ class ShareAPITest(test.TestCase):
 
         res_dict = self.controller.show(req, '1')
 
-        self.assertDictMatch(expected, res_dict)
+        self.assertDictEqual(expected, res_dict)
 
     def test_share_show_with_share_group_earlier_version(self):
         req = fakes.HTTPRequest.blank(
@@ -1452,7 +1452,7 @@ class ShareAPITest(test.TestCase):
 
         res_dict = self.controller.show(req, '1')
 
-        self.assertDictMatch(expected, res_dict)
+        self.assertDictEqual(expected, res_dict)
 
     def test_share_show_with_share_type_name(self):
         req = fakes.HTTPRequest.blank('/v2/fake/shares/1', version='2.6')
diff --git a/manila/tests/db/sqlalchemy/test_api.py b/manila/tests/db/sqlalchemy/test_api.py
index 33c872c97f..2b429551e3 100644
--- a/manila/tests/db/sqlalchemy/test_api.py
+++ b/manila/tests/db/sqlalchemy/test_api.py
@@ -1065,7 +1065,7 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
     def test_share_group_get(self):
         share_group = db_utils.create_share_group()
 
-        self.assertDictMatch(
+        self.assertDictEqual(
             dict(share_group),
             dict(db_api.share_group_get(self.ctxt, share_group['id'])))
 
@@ -1096,7 +1096,7 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
         share_groups = db_api.share_group_get_all(self.ctxt, detailed=True)
 
         self.assertEqual(1, len(share_groups))
-        self.assertDictMatch(dict(expected_share_group), dict(share_groups[0]))
+        self.assertDictEqual(dict(expected_share_group), dict(share_groups[0]))
 
     def test_share_group_get_all_by_host(self):
         fake_host = 'my_fake_host'
@@ -1122,7 +1122,7 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
 
         self.assertEqual(1, len(share_groups))
         share_group = share_groups[0]
-        self.assertDictMatch(dict(expected_share_group), dict(share_group))
+        self.assertDictEqual(dict(expected_share_group), dict(share_group))
         self.assertEqual(fake_host, share_group['host'])
 
     def test_share_group_get_all_by_project(self):
@@ -1167,7 +1167,7 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
 
         self.assertEqual(1, len(groups))
         group = groups[0]
-        self.assertDictMatch(dict(expected_group), dict(group))
+        self.assertDictEqual(dict(expected_group), dict(group))
         self.assertEqual(fake_project, group['project_id'])
 
     @ddt.data(({'name': 'fo'}, 0), ({'description': 'd'}, 0),
@@ -1191,10 +1191,10 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
 
         self.assertEqual(group_number, len(groups))
         if group_number == 1:
-            self.assertDictMatch(dict(expected_group1), dict(groups[0]))
+            self.assertDictEqual(dict(expected_group1), dict(groups[0]))
         elif group_number == 2:
-            self.assertDictMatch(dict(expected_group1), dict(groups[1]))
-            self.assertDictMatch(dict(expected_group2), dict(groups[0]))
+            self.assertDictEqual(dict(expected_group1), dict(groups[1]))
+            self.assertDictEqual(dict(expected_group2), dict(groups[0]))
 
     def test_share_group_update(self):
         fake_name = "my_fake_name"
@@ -1238,11 +1238,15 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
 
     def test_share_group_snapshot_get(self):
         sg = db_utils.create_share_group()
-        sg_snap = db_utils.create_share_group_snapshot(sg['id'])
+        sg_snap = dict(db_utils.create_share_group_snapshot(sg['id']))
+        sg_snap_source_group = sg_snap.pop('share_group', {})
+        get_sg_snap = dict(
+            db_api.share_group_snapshot_get(self.ctxt, sg_snap['id']))
+        get_sg_snap_source_group = get_sg_snap.pop('share_group', {})
 
-        self.assertDictMatch(
-            dict(sg_snap),
-            dict(db_api.share_group_snapshot_get(self.ctxt, sg_snap['id'])))
+        self.assertDictEqual(
+            dict(sg_snap_source_group), dict(get_sg_snap_source_group))
+        self.assertDictEqual(sg_snap, get_sg_snap)
 
     def test_share_group_snapshot_get_all(self):
         sg = db_utils.create_share_group()
@@ -1258,13 +1262,17 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
 
     def test_share_group_snapshot_get_all_with_detail(self):
         sg = db_utils.create_share_group()
-        expected_sg_snap = db_utils.create_share_group_snapshot(sg['id'])
+        expected_sg_snap = dict(db_utils.create_share_group_snapshot(sg['id']))
+        sg_snap_source_group = expected_sg_snap.pop('share_group', {})
 
         snaps = db_api.share_group_snapshot_get_all(self.ctxt, detailed=True)
 
         self.assertEqual(1, len(snaps))
-        snap = snaps[0]
-        self.assertDictMatch(dict(expected_sg_snap), dict(snap))
+        actual_sg_snap = dict(snaps[0])
+        get_sg_snap_source = actual_sg_snap.pop('share_group', {})
+        self.assertDictEqual(
+            dict(sg_snap_source_group), dict(get_sg_snap_source))
+        self.assertDictEqual(expected_sg_snap, actual_sg_snap)
 
     def test_share_group_snapshot_get_all_by_project(self):
         fake_project = uuidutils.generate_uuid()
@@ -1284,16 +1292,21 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
     def test_share_group_snapshot_get_all_by_project_with_details(self):
         fake_project = uuidutils.generate_uuid()
         sg = db_utils.create_share_group()
-        expected_sg_snap = db_utils.create_share_group_snapshot(
-            sg['id'], project_id=fake_project)
+        expected_sg_snap = dict(db_utils.create_share_group_snapshot(
+            sg['id'], project_id=fake_project))
+        sg_snap_source_group = expected_sg_snap.pop(
+            'share_group', {})
 
         snaps = db_api.share_group_snapshot_get_all_by_project(
             self.ctxt, fake_project, detailed=True)
 
         self.assertEqual(1, len(snaps))
-        snap = snaps[0]
-        self.assertDictMatch(dict(expected_sg_snap), dict(snap))
-        self.assertEqual(fake_project, snap['project_id'])
+        actual_snap = dict(snaps[0])
+        get_sg_snap_source = actual_snap.pop('share_group', {})
+        self.assertDictEqual(
+            dict(sg_snap_source_group), dict(get_sg_snap_source))
+        self.assertEqual(expected_sg_snap, actual_snap)
+        self.assertEqual(fake_project, actual_snap['project_id'])
 
     def test_share_group_snapshot_update(self):
         fake_name = "my_fake_name"
@@ -1324,14 +1337,23 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
         share = db_utils.create_share(share_group_id=sg['id'])
         si = db_utils.create_share_instance(share_id=share['id'])
         sg_snap = db_utils.create_share_group_snapshot(sg['id'])
-        expected_member = db_utils.create_share_group_snapshot_member(
-            sg_snap['id'], share_instance_id=si['id'])
+        expected_member = dict(db_utils.create_share_group_snapshot_member(
+            sg_snap['id'], share_instance_id=si['id']))
+        sg_snap_source_member = expected_member.pop(
+            'share_group_snapshot', {})
+        sg_snap_source_member = expected_member.pop('share_instance', {})
 
         members = db_api.share_group_snapshot_members_get_all(
             self.ctxt, sg_snap['id'])
 
         self.assertEqual(1, len(members))
-        self.assertDictMatch(dict(expected_member), dict(members[0]))
+        member = dict(members[0])
+        get_sg_snap_source_member = member.pop(
+            'share_group_snapshot', {})
+        get_sg_snap_source_member = member.pop('share_instance', {})
+        self.assertDictEqual(dict(
+            sg_snap_source_member), dict(get_sg_snap_source_member))
+        self.assertDictEqual(expected_member, member)
 
     def test_count_share_group_snapshot_members_in_share(self):
         sg = db_utils.create_share_group()
@@ -1355,13 +1377,19 @@ class ShareGroupDatabaseAPITestCase(test.TestCase):
         share = db_utils.create_share(share_group_id=sg['id'])
         si = db_utils.create_share_instance(share_id=share['id'])
         sg_snap = db_utils.create_share_group_snapshot(sg['id'])
-        expected_member = db_utils.create_share_group_snapshot_member(
-            sg_snap['id'], share_instance_id=si['id'])
+        expected_member = dict(db_utils.create_share_group_snapshot_member(
+            sg_snap['id'], share_instance_id=si['id']))
+        sg_snap_source_member = expected_member.pop('share_group_snapshot', {})
+        sg_snap_source_member = expected_member.pop('share_instance', {})
 
-        member = db_api.share_group_snapshot_member_get(
-            self.ctxt, expected_member['id'])
+        member = dict(db_api.share_group_snapshot_member_get(
+            self.ctxt, expected_member['id']))
+        get_sg_snap_source_member = member.pop('share_group_snapshot', {})
+        get_sg_snap_source_member = member.pop('share_instance', {})
 
-        self.assertDictMatch(dict(expected_member), dict(member))
+        self.assertDictEqual(dict(
+            sg_snap_source_member), dict(get_sg_snap_source_member))
+        self.assertDictEqual(expected_member, member)
 
     def test_share_group_snapshot_members_get_not_found(self):
         self.assertRaises(
@@ -1429,7 +1457,7 @@ class ShareGroupTypeAPITestCase(test.TestCase):
         # Let's cleanup share_group_type_1 and verify it is gone
         self.assertIsNone(db_api.share_group_type_destroy(
             self.ctxt, share_group_type_1['id']))
-        self.assertDictMatch(
+        self.assertDictEqual(
             {}, db_api.share_group_type_specs_get(
                 self.ctxt, share_group_type_1['id']))
         self.assertRaises(exception.ShareGroupTypeNotFound,
@@ -3118,7 +3146,7 @@ class ShareServerDatabaseAPITestCase(test.TestCase):
         db_api.share_server_backend_details_set(self.ctxt, server['id'],
                                                 details)
 
-        self.assertDictMatch(
+        self.assertDictEqual(
             details,
             db_api.share_server_get(self.ctxt, server['id'])['backend_details']
         )
@@ -3147,7 +3175,7 @@ class ShareServerDatabaseAPITestCase(test.TestCase):
                          server.share_network_subnet_id)
         self.assertEqual(values['host'], server.host)
         self.assertEqual(values['status'], server.status)
-        self.assertDictMatch(server['backend_details'], details)
+        self.assertDictEqual(server['backend_details'], details)
         self.assertIn('backend_details', server.to_dict())
 
     def test_delete_with_details(self):
@@ -3745,7 +3773,7 @@ class ShareTypeAPITestCase(test.TestCase):
 
         self.assertIsNone(
             db_api.share_type_destroy(self.ctxt, share_type_1['id']))
-        self.assertDictMatch(
+        self.assertDictEqual(
             {}, db_api.share_type_extra_specs_get(
                 self.ctxt, share_type_1['id']))
         self.assertRaises(exception.ShareTypeNotFound,
@@ -3832,7 +3860,7 @@ class ShareTypeAPITestCase(test.TestCase):
             'shares': 10,
             'snapshots': 30,
         }
-        self.assertDictMatch(expected_quotas, share_type_quotas)
+        self.assertDictEqual(expected_quotas, share_type_quotas)
 
         db_api.share_type_destroy(self.ctxt, share_type['id'])
 
@@ -3852,7 +3880,7 @@ class ShareTypeAPITestCase(test.TestCase):
                 self.ctxt, 'fake-project-id', share_type['id'])
             expected_q_usages = {'project_id': 'fake-project-id',
                                  'share_type_id': share_type['id']}
-            self.assertDictMatch(expected_q_usages, q_usages)
+            self.assertDictEqual(expected_q_usages, q_usages)
         if reservations:
             q_reservations = db_api._quota_reservations_query(
                 db_session, self.ctxt, reservation_uuids).all()
@@ -4250,7 +4278,7 @@ class ShareResourcesAPITestCase(test.TestCase):
                                                      new_host)
 
         expected_updates = {'instances': 0, 'servers': 0, 'groups': 0}
-        self.assertDictMatch(expected_updates, updates)
+        self.assertDictEqual(expected_updates, updates)
         # validate that resources are unmodified:
         share_instances = db_api.share_instances_get_all(
             self.context, filters={'share_id': share_id})
diff --git a/manila/tests/scheduler/drivers/test_filter.py b/manila/tests/scheduler/drivers/test_filter.py
index 685876a72f..fa0f76a086 100644
--- a/manila/tests/scheduler/drivers/test_filter.py
+++ b/manila/tests/scheduler/drivers/test_filter.py
@@ -60,7 +60,7 @@ class FilterSchedulerTestCase(test_base.SchedulerTestCase):
         retval = sched._format_filter_properties(
             fake_context, {}, request_spec)
 
-        self.assertDictMatch(fake_type, retval[0]['resource_type'])
+        self.assertDictEqual(fake_type, retval[0]['resource_type'])
         self.assertIn('replication_domain', retval[0])
         # no "share_proto" was specified in the request_spec
         self.assertNotIn('storage_protocol', retval[0])
@@ -89,7 +89,7 @@ class FilterSchedulerTestCase(test_base.SchedulerTestCase):
         retval = sched._format_filter_properties(
             fake_context, {}, request_spec)
 
-        self.assertDictMatch(fake_type, retval[0]['resource_type'])
+        self.assertDictEqual(fake_type, retval[0]['resource_type'])
         self.assertNotIn('share_backend_name',
                          retval[0]['share_type']['extra_specs'])
 
@@ -118,7 +118,7 @@ class FilterSchedulerTestCase(test_base.SchedulerTestCase):
         filter_spec = retval['share_type']['extra_specs']['storage_protocol']
         expected_spec = 'NFS_CIFS' if spec_present else '<in> CEPHFS'
         self.assertEqual(expected_spec, filter_spec)
-        self.assertDictMatch(fake_type, retval['resource_type'])
+        self.assertDictEqual(fake_type, retval['resource_type'])
 
     def test_create_share_no_hosts(self):
         # Ensure empty hosts/child_zones result in NoValidHosts exception.
diff --git a/manila/tests/scheduler/test_host_manager.py b/manila/tests/scheduler/test_host_manager.py
index 738d2f21a4..da3630f7df 100644
--- a/manila/tests/scheduler/test_host_manager.py
+++ b/manila/tests/scheduler/test_host_manager.py
@@ -107,7 +107,7 @@ class HostManagerTestCase(test.TestCase):
 
     def test_update_service_capabilities_for_shares(self):
         service_states = self.host_manager.service_states
-        self.assertDictMatch(service_states, {})
+        self.assertDictEqual(service_states, {})
         host1_share_capabs = dict(free_capacity_gb=4321, timestamp=1)
         host2_share_capabs = dict(free_capacity_gb=5432, timestamp=1)
         host3_share_capabs = dict(free_capacity_gb=6543, timestamp=1)
@@ -135,7 +135,7 @@ class HostManagerTestCase(test.TestCase):
             'host2': host2_share_capabs,
             'host3': host3_share_capabs,
         }
-        self.assertDictMatch(service_states, expected)
+        self.assertDictEqual(service_states, expected)
 
     def test_get_all_host_states_share(self):
         fake_context = context.RequestContext('user', 'project')
@@ -1139,7 +1139,7 @@ class PoolStateTestCase(test.TestCase):
         self.assertEqual('pool0', fake_pool.pool_name)
         self.assertEqual(1024, fake_pool.total_capacity_gb)
         self.assertEqual(512, fake_pool.free_capacity_gb)
-        self.assertDictMatch(share_capability, fake_pool.capabilities)
+        self.assertDictEqual(share_capability, dict(fake_pool.capabilities))
 
         if 'thin_provisioning' in share_capability:
             thin_provisioned = scheduler_utils.thin_provisioning(
diff --git a/manila/tests/share/drivers/container/test_driver.py b/manila/tests/share/drivers/container/test_driver.py
index 04bb5b066f..1fccaec636 100644
--- a/manila/tests/share/drivers/container/test_driver.py
+++ b/manila/tests/share/drivers/container/test_driver.py
@@ -592,7 +592,7 @@ class ContainerShareDriverTestCase(test.TestCase):
         expected_result = {
             'share_updates': share_updates,
         }
-        self.assertDictMatch(expected_result,
+        self.assertDictEqual(expected_result,
                              self._driver.share_server_migration_complete(
                                  self._context, source_server, dest_server,
                                  shares_list, None, None))
diff --git a/manila/tests/share/drivers/container/test_storage_helper.py b/manila/tests/share/drivers/container/test_storage_helper.py
index fa90c32001..9b5a2474c6 100644
--- a/manila/tests/share/drivers/container/test_storage_helper.py
+++ b/manila/tests/share/drivers/container/test_storage_helper.py
@@ -235,7 +235,7 @@ class LVMHelperTestCase(test.TestCase):
             'preserve_metadata': True,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         if not compatible:
             mock_exception_log.assert_called_once()
 
@@ -252,7 +252,7 @@ class LVMHelperTestCase(test.TestCase):
         expected_progress = {
             'total_progress': 100,
         }
-        self.assertDictMatch(expected_progress, progress)
+        self.assertDictEqual(expected_progress, progress)
 
     @ddt.data({'source_host': 'host@back1', 'dest_host': 'host@back1',
                'shares_specs': {}},
@@ -279,7 +279,7 @@ class LVMHelperTestCase(test.TestCase):
                 self.context, source_server, dest_host, None, None,
                 shares_specs))
 
-        self.assertDictMatch(not_compatible, migration_compatibility)
+        self.assertDictEqual(not_compatible, migration_compatibility)
         mock_error_log.assert_called_once()
 
     @ddt.data({'source_host': 'host@back1', 'dest_host': 'host@back2#vg1',
@@ -308,7 +308,7 @@ class LVMHelperTestCase(test.TestCase):
                 self.context, source_server, dest_host, None, None,
                 shares_specs))
 
-        self.assertDictMatch(compatible, migration_compatibility)
+        self.assertDictEqual(compatible, migration_compatibility)
 
     def test_share_server_migration_continue(self):
         end1Phase = self.LVMHelper.share_server_migration_continue(
@@ -321,7 +321,7 @@ class LVMHelperTestCase(test.TestCase):
         expected_progress = {
             'total_progress': 100,
         }
-        self.assertDictMatch(expected_progress, progress)
+        self.assertDictEqual(expected_progress, progress)
 
     def test_get_share_pool_name(self):
         fake_vg_name = 'fake_vg'
diff --git a/manila/tests/share/drivers/infortrend/test_infortrend_nas.py b/manila/tests/share/drivers/infortrend/test_infortrend_nas.py
index 7d65248f3f..da21f9b777 100644
--- a/manila/tests/share/drivers/infortrend/test_infortrend_nas.py
+++ b/manila/tests/share/drivers/infortrend/test_infortrend_nas.py
@@ -162,7 +162,7 @@ class InfortrendNASDriverTestCase(test.TestCase):
 
         self._iftnas._check_channels_status()
 
-        self.assertDictMatch(expect_channel_dict, self._iftnas.channel_dict)
+        self.assertDictEqual(expect_channel_dict, self._iftnas.channel_dict)
 
     @mock.patch.object(infortrend_nas.LOG, 'warning')
     def test_channel_status_down(self, log_warning):
@@ -198,7 +198,7 @@ class InfortrendNASDriverTestCase(test.TestCase):
 
         self._iftnas._check_pools_setup()
 
-        self.assertDictMatch(expect_pool_dict, self._iftnas.pool_dict)
+        self.assertDictEqual(expect_pool_dict, self._iftnas.pool_dict)
 
     def test_unknow_pools_setup(self):
         self.fake_conf.set_default(
diff --git a/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py b/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py
index 5c2a92989b..55cbb222d7 100644
--- a/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py
+++ b/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py
@@ -7060,7 +7060,7 @@ class NetAppClientCmodeTestCase(test.TestCase):
             'phase': 'finishing',
         }
 
-        self.assertDictMatch(expected_status_info, actual_status_info)
+        self.assertDictEqual(expected_status_info, actual_status_info)
         self.client.send_iter_request.assert_called_once_with(
             'volume-move-get-iter', expected_api_args)
 
@@ -7153,7 +7153,7 @@ class NetAppClientCmodeTestCase(test.TestCase):
         }
         self.client.send_request.assert_called_once_with(
             'qos-policy-group-get-iter', qos_policy_group_get_iter_args, False)
-        self.assertDictMatch(fake.QOS_POLICY_GROUP, qos_info)
+        self.assertDictEqual(fake.QOS_POLICY_GROUP, qos_info)
 
     @ddt.data(None, fake.QOS_MAX_THROUGHPUT)
     def test_qos_policy_group_create(self, max_throughput):
@@ -7522,7 +7522,7 @@ class NetAppClientCmodeTestCase(test.TestCase):
         if api_response == fake.NO_RECORDS_RESPONSE:
             self.assertIsNone(result)
         else:
-            self.assertDictMatch(fake.VSERVER_INFO, result)
+            self.assertDictEqual(fake.VSERVER_INFO, result)
 
     @ddt.data({'discard_network': True, 'preserve_snapshots': False},
               {'discard_network': False, 'preserve_snapshots': True})
diff --git a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py
index 5aee184d11..65a69de3cf 100644
--- a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py
+++ b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py
@@ -1589,7 +1589,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
                               self.library._get_normalized_qos_specs,
                               extra_specs)
         else:
-            self.assertDictMatch(
+            self.assertDictEqual(
                 {}, self.library._get_normalized_qos_specs(extra_specs))
 
     @ddt.data({'qos': True, 'netapp:maxiops': '3000', 'netapp:maxbps': '9000'},
@@ -1614,7 +1614,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
 
         qos_specs = self.library._get_normalized_qos_specs(extra_specs)
 
-        self.assertDictMatch(expected_normalized_spec, qos_specs)
+        self.assertDictEqual(expected_normalized_spec, qos_specs)
         self.assertEqual(1, len(qos_specs))
 
     @ddt.data({'qos': {'maxiops': '3000'}, 'expected': '3000iops'},
@@ -3276,7 +3276,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             None, [fake.SHARE], fake.SHARE, [], [],
             share_server=None)
 
-        self.assertDictMatch(expected_model_update, model_update)
+        self.assertDictEqual(expected_model_update, model_update)
         mock_dm_session.create_snapmirror.assert_called_once_with(
             fake.SHARE, fake.SHARE)
         data_motion.get_client_for_backend.assert_called_once_with(
@@ -3303,7 +3303,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             None, [fake.SHARE], fake.SHARE, [], [],
             share_server=fake.SHARE_SERVER)
 
-        self.assertDictMatch(expected_model_update, model_update)
+        self.assertDictEqual(expected_model_update, model_update)
         mock_dm_session.create_snapmirror.assert_called_once_with(
             fake.SHARE, fake.SHARE)
         data_motion.get_client_for_backend.assert_called_once_with(
@@ -5038,7 +5038,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_warning_log.assert_called_once()
         self.assertFalse(data_motion.get_backend_configuration.called)
 
@@ -5071,7 +5071,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
         self.assertFalse(data_motion.get_backend_configuration.called)
 
@@ -5100,7 +5100,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
 
     def test_migration_check_compatibility_destination_not_configured(self):
@@ -5139,7 +5139,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
@@ -5186,7 +5186,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
@@ -5228,7 +5228,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
@@ -5273,7 +5273,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': False,
             'preserve_snapshots': False,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         mock_exception_log.assert_called_once()
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
@@ -5338,7 +5338,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': True,
             'preserve_snapshots': True,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
         mock_move_check.assert_called_once_with(
@@ -5395,7 +5395,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'preserve_metadata': True,
             'preserve_snapshots': True,
         }
-        self.assertDictMatch(expected_compatibility, migration_compatibility)
+        self.assertDictEqual(expected_compatibility, migration_compatibility)
         data_motion.get_backend_configuration.assert_called_once_with(
             'destination_backend')
 
@@ -5538,7 +5538,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             'details': '%s:: Volume move job in progress' % phase,
             'phase': phase,
         }
-        self.assertDictMatch(expected_progress, migration_progress)
+        self.assertDictEqual(expected_progress, migration_progress)
         mock_info_log.assert_called_once()
 
     @ddt.data({'state': 'failed'},
diff --git a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_multi_svm.py b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_multi_svm.py
index 29abc0d5ca..0078712fcd 100644
--- a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_multi_svm.py
+++ b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_multi_svm.py
@@ -1158,7 +1158,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
             None, [self.fake_replica], self.fake_new_replica, [], [],
             share_server=None)
 
-        self.assertDictMatch(lib_base_model_update, model_update)
+        self.assertDictEqual(lib_base_model_update, model_update)
         self.library._get_vservers_from_replicas.assert_called_once_with(
             None, [self.fake_replica], self.fake_new_replica
         )
diff --git a/manila/tests/share/test_share_types.py b/manila/tests/share/test_share_types.py
index 44dc12c8f2..243190a82f 100644
--- a/manila/tests/share/test_share_types.py
+++ b/manila/tests/share/test_share_types.py
@@ -461,7 +461,7 @@ class ShareTypesTestCase(test.TestCase):
             extra_specs[constants.ExtraSpecs.AVAILABILITY_ZONES] = spec_value
             expected_specs['availability_zones'] = 'az 1,az2,az 3'
 
-        self.assertDictMatch(expected_specs,
+        self.assertDictEqual(expected_specs,
                              share_types.sanitize_extra_specs(extra_specs))
 
     def test_add_access(self):
diff --git a/tools/install_venv.py b/tools/install_venv.py
index f80d6d46f4..f8af6b53fd 100644
--- a/tools/install_venv.py
+++ b/tools/install_venv.py
@@ -61,7 +61,6 @@ def main(argv):
     install = install_venv.InstallVenv(root, venv, pip_requires, test_requires,
                                        py_version, project)
     options = install.parse_args(argv)
-    install.check_python_version()
     install.check_dependencies()
     install.create_virtualenv(no_site_packages=options.no_site_packages)
     install.install_dependencies()
diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py
index 4cc27b07e5..813cf978ee 100644
--- a/tools/install_venv_common.py
+++ b/tools/install_venv_common.py
@@ -44,10 +44,6 @@ class InstallVenv(object):
         print(message % args, file=sys.stderr)
         sys.exit(1)
 
-    def check_python_version(self):
-        if sys.version_info < (2, 6):
-            self.die("Need Python Version >= 2.6")
-
     def run_command_with_code(self, cmd, redirect_output=True,
                               check_exit_code=True):
         """Runs a command in an out-of-process shell.