Merge "Add test_cases for cinder cli in v2 version"
diff --git a/tempest/cli/simple_read_only/test_cinder.py b/tempest/cli/simple_read_only/test_cinder.py
index 25157a4..eb5df63 100644
--- a/tempest/cli/simple_read_only/test_cinder.py
+++ b/tempest/cli/simple_read_only/test_cinder.py
@@ -136,3 +136,139 @@
         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)