diff --git a/tempest/cli/simple_read_only/test_cinder.py b/tempest/cli/simple_read_only/test_cinder.py
index eb5df63..25157a4 100644
--- a/tempest/cli/simple_read_only/test_cinder.py
+++ b/tempest/cli/simple_read_only/test_cinder.py
@@ -136,139 +136,3 @@
         if not region:
             region = self.config.identity.region
         self.cinder('list', flags='--os-region-name ' + region)
-
-
-class SimpleReadOnlyCinderClientV2Test(tempest.cli.ClientTestBase):
-    """Basic, read-only tests for Cinder v2 CLI client.
-
-    Checks return values and output of read-only commands.
-    These tests do not presume any content, nor do they create
-    their own. They only verify the structure of output if present.
-    """
-
-    version_flag = '--os-volume-api-version'
-    version_support = 2
-
-    def _get_resp_from_diff_versions(self, version_tuple, cmd, param=None):
-        # Get each result from different versions.
-        # Note(wingwj): If you want to get each cli response on v1&v2 version,
-        #   the value of version_tuple should be (1, 2).
-        #   The function will be also available for v3 in future
-
-        resp_set = []
-        for i in set(version_tuple):
-            if not isinstance(i, int) or \
-                    i not in range(1, self.version_support + 1):
-                LOG.error("version_num must be a positive integer, "
-                          "Cinder supports %s versions now"
-                          % self.version_support)
-                continue
-            else:
-                if not param:
-                    item = self.cinder(cmd,
-                                       flags=self.version_flag + ' ' + str(i))
-                else:
-                    item = self.cinder(cmd, params=param,
-                                       flags=self.version_flag + ' ' + str(i))
-                resp_set.append(item)
-
-        return resp_set
-
-    def _check_accordance_between_two_versions(self, input1, input2,
-                                               expected=True):
-        # Check input1 and input2 is not Empty first
-        self.assertNotEqual("", input1)
-        self.assertNotEqual("", input2)
-        # Compare input1 and input2 based on 'expected' parameter
-        if expected:
-            self.assertEqual(input1, input2)
-        else:
-            self.assertNotEqual(input1, input2)
-
-    def test_cinder_volumes_list_in_v2(self):
-        cmd = 'list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        # This CLI representation in v1/v2 is different.
-        self._check_accordance_between_two_versions(v1, v2, False)
-
-    def test_cinder_absolute_limit_list_in_v2(self):
-        cmd = 'absolute-limits'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_backup_list_in_v2(self):
-        cmd = 'backup-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_extra_specs_list_in_v2(self):
-        cmd = 'extra-specs-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_quota_class_show_in_v2(self):
-        cmd = 'quota-class-show'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd, 'abc')
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_quota_defaults_in_v2(self):
-        cmd = 'quota-defaults'
-        v1, v2 = self._get_resp_from_diff_versions(
-            (1, 2), cmd, self.identity.admin_tenant_name)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_quota_show_in_v2(self):
-        cmd = 'quota-show'
-        v1, v2 = self._get_resp_from_diff_versions(
-            (1, 2), cmd, self.identity.admin_tenant_name)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_rate_limits_in_v2(self):
-        cmd = 'rate-limits'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_snapshot_list_in_v2(self):
-        cmd = 'snapshot-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        # This CLI representation in v1/v2 is different.
-        self._check_accordance_between_two_versions(v1, v2, False)
-
-    def test_cinder_type_list_in_v2(self):
-        cmd = 'type-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_availability_zone_list_in_v2(self):
-        cmd = 'availability-zone-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_service_list_in_v2(self):
-        cmd = 'service-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self.assertNotEqual("", v1)
-        self.assertNotEqual("", v2)
-
-        # The 'Updated_at' and 'State' item may be changed
-        #   due to the periodical update-task. Need to omit.
-        v1 = self.parser.listing(v1)
-        v2 = self.parser.listing(v2)
-        for i in v1:
-            del i['Updated_at']
-            del i['State']
-        for j in v2:
-            del j['Updated_at']
-            del j['State']
-        self.assertEqual(v1, v2)
-
-    def test_cinder_transfer_list_in_v2(self):
-        cmd = 'transfer-list'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        self._check_accordance_between_two_versions(v1, v2, True)
-
-    def test_cinder_bash_completion_in_v2(self):
-        cmd = 'bash-completion'
-        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
-        # This CLI representation in v1/v2 is different.
-        self._check_accordance_between_two_versions(v1, v2, False)
