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'],
)