Merge "Update export location retrieval APIs"
diff --git a/manila_tempest_tests/config.py b/manila_tempest_tests/config.py
index c0c38bd..10da4cb 100644
--- a/manila_tempest_tests/config.py
+++ b/manila_tempest_tests/config.py
@@ -36,7 +36,7 @@
                help="The minimum api microversion is configured to be the "
                     "value of the minimum microversion supported by Manila."),
     cfg.StrOpt("max_api_microversion",
-               default="2.13",
+               default="2.14",
                help="The maximum api microversion is configured to be the "
                     "value of the latest microversion supported by Manila."),
     cfg.StrOpt("region",
diff --git a/manila_tempest_tests/tests/api/admin/test_export_locations.py b/manila_tempest_tests/tests/api/admin/test_export_locations.py
index 4791cb0..a7b45a8 100644
--- a/manila_tempest_tests/tests/api/admin/test_export_locations.py
+++ b/manila_tempest_tests/tests/api/admin/test_export_locations.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import ddt
 from oslo_utils import timeutils
 from oslo_utils import uuidutils
 import six
@@ -21,11 +22,14 @@
 
 from manila_tempest_tests import clients_share as clients
 from manila_tempest_tests.tests.api import base
+from manila_tempest_tests import utils
 
 CONF = config.CONF
+LATEST_MICROVERSION = CONF.share.max_api_microversion
 
 
 @base.skip_if_microversion_not_supported("2.9")
+@ddt.ddt
 class ExportLocationsTest(base.BaseSharesAdminTest):
 
     @classmethod
@@ -38,42 +42,82 @@
         cls.share_instances = cls.shares_v2_client.get_instances_of_share(
             cls.share['id'])
 
-    def _verify_export_location_structure(self, export_locations,
-                                          role='admin'):
-        expected_keys = [
-            'created_at', 'updated_at', 'path', 'uuid',
-        ]
-        if role == 'admin':
-            expected_keys.extend(['is_admin_only', 'share_instance_id'])
+    def _verify_export_location_structure(
+            self, export_locations, role='admin', version=LATEST_MICROVERSION,
+            format='summary'):
+
+        # Determine which keys to expect based on role, version and format
+        summary_keys = ['id', 'path']
+        if utils.is_microversion_ge(version, '2.14'):
+            summary_keys += ['preferred']
+
+        admin_summary_keys = summary_keys + [
+            'share_instance_id', 'is_admin_only']
+
+        detail_keys = summary_keys + ['created_at', 'updated_at']
+
+        admin_detail_keys = admin_summary_keys + ['created_at', 'updated_at']
+
+        if format == 'summary':
+            if role == 'admin':
+                expected_keys = admin_summary_keys
+            else:
+                expected_keys = summary_keys
+        else:
+            if role == 'admin':
+                expected_keys = admin_detail_keys
+            else:
+                expected_keys = detail_keys
 
         if not isinstance(export_locations, (list, tuple, set)):
             export_locations = (export_locations, )
 
         for export_location in export_locations:
+
+            # Check that the correct keys are present
             self.assertEqual(len(expected_keys), len(export_location))
             for key in expected_keys:
                 self.assertIn(key, export_location)
+
+            # Check the format of ever-present summary keys
+            self.assertTrue(uuidutils.is_uuid_like(export_location['id']))
+            self.assertTrue(isinstance(export_location['path'],
+                                       six.string_types))
+
+            if utils.is_microversion_ge(version, '2.14'):
+                self.assertIn(export_location['preferred'], (True, False))
+
             if role == 'admin':
                 self.assertIn(export_location['is_admin_only'], (True, False))
-                self.assertTrue(
-                    uuidutils.is_uuid_like(
-                        export_location['share_instance_id']))
-            self.assertTrue(uuidutils.is_uuid_like(export_location['uuid']))
-            self.assertTrue(
-                isinstance(export_location['path'], six.string_types))
-            for time in (export_location['created_at'],
-                         export_location['updated_at']):
-                # If var 'time' has incorrect value then ValueError exception
-                # is expected to be raised. So, just try parse it making
-                # assertion that it has proper date value.
-                timeutils.parse_strtime(time)
+                self.assertTrue(uuidutils.is_uuid_like(
+                    export_location['share_instance_id']))
+
+            # Check the format of the detail keys
+            if format == 'detail':
+                for time in (export_location['created_at'],
+                             export_location['updated_at']):
+                    # If var 'time' has incorrect value then ValueError
+                    # exception is expected to be raised. So, just try parse
+                    # it making assertion that it has proper date value.
+                    timeutils.parse_strtime(time)
 
     @test.attr(type=["gate", ])
+    @utils.skip_if_microversion_not_supported('2.13')
     def test_list_share_export_locations(self):
         export_locations = self.admin_client.list_share_export_locations(
-            self.share['id'])
+            self.share['id'], version='2.13')
 
-        self._verify_export_location_structure(export_locations)
+        self._verify_export_location_structure(export_locations,
+                                               version='2.13')
+
+    @test.attr(type=["gate", ])
+    @utils.skip_if_microversion_not_supported('2.14')
+    def test_list_share_export_locations_with_preferred_flag(self):
+        export_locations = self.admin_client.list_share_export_locations(
+            self.share['id'], version='2.14')
+
+        self._verify_export_location_structure(export_locations,
+                                               version='2.14')
 
     @test.attr(type=["gate", ])
     def test_get_share_export_location(self):
@@ -82,15 +126,15 @@
 
         for export_location in export_locations:
             el = self.admin_client.get_share_export_location(
-                self.share['id'], export_location['uuid'])
-            self._verify_export_location_structure(el)
+                self.share['id'], export_location['id'])
+            self._verify_export_location_structure(el, format='detail')
 
     @test.attr(type=["gate", ])
     def test_list_share_export_locations_by_member(self):
         export_locations = self.member_client.list_share_export_locations(
             self.share['id'])
 
-        self._verify_export_location_structure(export_locations, 'member')
+        self._verify_export_location_structure(export_locations, role='member')
 
     @test.attr(type=["gate", ])
     def test_get_share_export_location_by_member(self):
@@ -101,16 +145,29 @@
             if export_location['is_admin_only']:
                 continue
             el = self.member_client.get_share_export_location(
-                self.share['id'], export_location['uuid'])
-            self._verify_export_location_structure(el, 'member')
+                self.share['id'], export_location['id'])
+            self._verify_export_location_structure(el, role='member',
+                                                   format='detail')
 
     @test.attr(type=["gate", ])
+    @utils.skip_if_microversion_not_supported('2.13')
     def test_list_share_instance_export_locations(self):
         for share_instance in self.share_instances:
             export_locations = (
                 self.admin_client.list_share_instance_export_locations(
-                    share_instance['id']))
-            self._verify_export_location_structure(export_locations)
+                    share_instance['id'], version='2.13'))
+            self._verify_export_location_structure(export_locations,
+                                                   version='2.13')
+
+    @test.attr(type=["gate", ])
+    @utils.skip_if_microversion_not_supported('2.14')
+    def test_list_share_instance_export_locations_with_preferred_flag(self):
+        for share_instance in self.share_instances:
+            export_locations = (
+                self.admin_client.list_share_instance_export_locations(
+                    share_instance['id'], version='2.14'))
+            self._verify_export_location_structure(export_locations,
+                                                   version='2.14')
 
     @test.attr(type=["gate", ])
     def test_get_share_instance_export_location(self):
@@ -120,8 +177,8 @@
                     share_instance['id']))
             for el in export_locations:
                 el = self.admin_client.get_share_instance_export_location(
-                    share_instance['id'], el['uuid'])
-                self._verify_export_location_structure(el)
+                    share_instance['id'], el['id'])
+                self._verify_export_location_structure(el, format='detail')
 
     @test.attr(type=["gate", ])
     def test_share_contains_all_export_locations_of_all_share_instances(self):
@@ -140,6 +197,6 @@
             len(share_instances_export_locations)
         )
         self.assertEqual(
-            sorted(share_export_locations, key=lambda el: el['uuid']),
-            sorted(share_instances_export_locations, key=lambda el: el['uuid'])
+            sorted(share_export_locations, key=lambda el: el['id']),
+            sorted(share_instances_export_locations, key=lambda el: el['id'])
         )
diff --git a/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py b/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
index 9d53373..fda77b1 100644
--- a/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
@@ -90,5 +90,5 @@
                 self.assertRaises(
                     lib_exc.Forbidden,
                     self.member_client.get_share_instance_export_location,
-                    share_instance['id'], el['uuid'],
+                    share_instance['id'], el['id'],
                 )