[srbac] Testing volumes metatada

Testing reader, member and admin users

Change-Id: I50f62d025d34b862148922d4cdaeaef27a01e96f
Signed-off-by: Yosi Ben Shimon <ybenshim@redhat.com>
This commit is contained in:
Yosi Ben Shimon 2023-10-02 15:07:34 +03:00
parent dfe2c229ed
commit 557ebe146a
2 changed files with 274 additions and 3 deletions

View File

@ -13,7 +13,6 @@
from tempest.common import waiters
from tempest import config
from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import api_version_utils
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
@ -51,8 +50,6 @@ class VolumeV3RbacBaseTests(
def setUp(self):
super(VolumeV3RbacBaseTests, self).setUp()
self.useFixture(api_microversion_fixture.APIMicroversionFixture(
volume_microversion=self.request_microversion))
@classmethod
def resource_setup(cls):
@ -61,6 +58,8 @@ class VolumeV3RbacBaseTests(
api_version_utils.select_request_microversion(
cls.min_microversion,
CONF.volume.min_microversion))
cls.setup_api_microversion_fixture(
volume_microversion=cls.request_microversion)
def do_request(self, method, expected_status=200, client=None, **payload):
"""Perform API call

View File

@ -0,0 +1,272 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tempest.lib import decorators
from tempest.lib import exceptions
from cinder_tempest_plugin.rbac.v3 import base as rbac_base
class VolumeV3RbacVolumesMetadataTests(rbac_base.VolumeV3RbacBaseTests):
min_microversion = '3.12'
metadata = {"key1": "value1",
"key2": "value2"}
@classmethod
def setup_clients(cls):
super().setup_clients()
cls.volumes_client = cls.os_project_admin.volumes_client_latest
@classmethod
def resource_setup(cls):
super(VolumeV3RbacVolumesMetadataTests, cls).resource_setup()
cls.volume_id = cls.create_volume(
client=cls.volumes_client, metadata=cls.metadata
)
def _create_volume_metadata(self, expected_status):
"""Test create_volume_metadata operation.
Args:
expected_status: The expected HTTP response code
"""
volume_id = self.create_volume(client=self.volumes_client)
self.do_request(
method='create_volume_metadata', expected_status=expected_status,
volume_id=volume_id, metadata={'key3': 'value3'}
)
if expected_status != exceptions.Forbidden:
vol = self.volumes_client.show_volume(
volume_id=volume_id
)['volume']
self.assertIn(
'key3', vol['metadata'].keys(),
"'key3' not found in volume metadata keys"
)
def _show_volume_metadata(self, expected_status):
"""Test show_volume_metadata operation.
Args:
expected_status: The expected HTTP response code
"""
metadata = self.do_request(
method='show_volume_metadata', expected_status=expected_status,
volume_id=self.volume_id
)['metadata']
self.assertIn(
'key1', metadata.keys(),
"'key1' not found in volume metadata keys"
)
self.assertIn(
'key2', metadata.keys(),
"'key2' not found in volume metadata keys"
)
def _update_volume_metadata(self, expected_status):
"""Test update_volume_metadata operation.
Args:
expected_status: The expected HTTP response code
"""
volume_id = self.create_volume(client=self.volumes_client)
self.do_request(
method='update_volume_metadata', expected_status=expected_status,
volume_id=volume_id, metadata={'key3': 'value3'}
)
if expected_status != exceptions.Forbidden:
vol = self.volumes_client.show_volume(
volume_id=volume_id
)['volume']
self.assertIn(
'key3', vol['metadata'].keys(),
"'key3' not found in volume metadata keys"
)
self.assertNotIn(
'key1', vol['metadata'].keys(),
"'key1' found in volume metadata keys"
)
def _show_volume_metadata_item(self, expected_status):
"""Test show_volume_metadata_item operation.
Args:
expected_status: The expected HTTP response code
"""
meta = self.do_request(
method='show_volume_metadata_item',
expected_status=expected_status,
volume_id=self.volume_id, id='key1'
)['meta']
self.assertNotEmpty(meta, "'key1' not found in volume metadata keys")
def _delete_volume_metadata_item(self, expected_status):
"""Test delete_volume_metadata_item operation.
Args:
expected_status: The expected HTTP response code
"""
volume_id = self.create_volume(
client=self.volumes_client, metadata=self.metadata
)
self.do_request(
method='delete_volume_metadata_item',
expected_status=expected_status,
volume_id=volume_id, id='key1'
)
if expected_status != exceptions.Forbidden:
vol = self.volumes_client.show_volume(
volume_id=volume_id
)['volume']
self.assertNotIn(
'key1', vol['metadata'].keys(),
"'key1' found in volume metadata keys"
)
def _update_volume_metadata_item(self, expected_status):
"""Test update_volume_metadata_item operation.
Args:
expected_status: The expected HTTP response code
"""
volume_id = self.create_volume(
client=self.volumes_client, metadata=self.metadata
)
self.do_request(
method='update_volume_metadata_item',
expected_status=expected_status,
volume_id=volume_id, id='key1',
meta_item={'key1': 'value1_updated'}
)
if expected_status != exceptions.Forbidden:
vol = self.volumes_client.show_volume(
volume_id=volume_id
)['volume']
self.assertIn(
'key1', vol['metadata'].keys(),
"'key1' not found in volume metadata keys"
)
self.assertEqual(
'value1_updated', vol['metadata']['key1'],
"'key1' value is not up-to-date"
)
class ProjectReaderTests(VolumeV3RbacVolumesMetadataTests):
credentials = ['project_reader', 'project_admin']
@classmethod
def setup_clients(cls):
super().setup_clients()
cls.client = cls.os_project_reader.volumes_client_latest
@decorators.skip_because(bug='2038369')
@decorators.idempotent_id('6743fe4f-58bb-4b81-9054-272826e0525a')
def test_create_volume_metadata(self):
self._create_volume_metadata(expected_status=exceptions.Forbidden)
@decorators.idempotent_id('f15be3ed-ed44-41ba-a462-24dc17a1dd90')
def test_show_volume_metadata(self):
self._show_volume_metadata(expected_status=200)
@decorators.skip_because(bug='2038369')
@decorators.idempotent_id('05335522-41b2-4377-a817-a1191c7ca71c')
def test_update_volume_metadata(self):
self._update_volume_metadata(expected_status=exceptions.Forbidden)
@decorators.idempotent_id('50dc3630-db40-4bfc-b2a5-049f77e11633')
def test_show_volume_metadata_item(self):
self._show_volume_metadata_item(expected_status=200)
@decorators.skip_because(bug='2038369')
@decorators.idempotent_id('8ed21ba6-fb6c-46c8-8018-03cb4fc84023')
def test_delete_volume_metadata_item(self):
self._delete_volume_metadata_item(expected_status=exceptions.Forbidden)
@decorators.skip_because(bug='2038369')
@decorators.idempotent_id('aa8626c0-2ab1-4c14-b881-2a8d1bfcd31e')
def test_update_volume_metadata_item(self):
self._update_volume_metadata_item(expected_status=exceptions.Forbidden)
class ProjectMemberTests(VolumeV3RbacVolumesMetadataTests):
credentials = ['project_member', 'project_admin']
@classmethod
def setup_clients(cls):
super().setup_clients()
cls.client = cls.os_project_member.volumes_client_latest
@decorators.idempotent_id('69cf1a35-85ad-4ab0-bc5f-e262f327600b')
def test_create_volume_metadata(self):
self._create_volume_metadata(expected_status=200)
@decorators.idempotent_id('f7b5a594-6856-4b45-ba19-d8b36404147a')
def test_show_volume_metadata(self):
self._show_volume_metadata(expected_status=200)
@decorators.idempotent_id('11ec15b5-5198-4cb9-849a-5510328e41bb')
def test_update_volume_metadata(self):
self._update_volume_metadata(expected_status=200)
@decorators.idempotent_id('ed5a50d6-baea-4c10-9ce5-cd5b2929c29c')
def test_show_volume_metadata_item(self):
self._show_volume_metadata_item(expected_status=200)
@decorators.idempotent_id('c4c265e2-c71d-4a67-94dc-6da90d7bb79f')
def test_delete_volume_metadata_item(self):
self._delete_volume_metadata_item(expected_status=200)
@decorators.idempotent_id('c2fc1a82-9eb9-432e-9cd5-e894fe2f5d9d')
def test_update_volume_metadata_item(self):
self._update_volume_metadata_item(expected_status=200)
class ProjectAdminTests(VolumeV3RbacVolumesMetadataTests):
credentials = ['project_admin']
@classmethod
def setup_clients(cls):
super().setup_clients()
cls.client = cls.os_project_admin.volumes_client_latest
@decorators.idempotent_id('ec623abe-9cca-42c7-9516-b26fca1c39e7')
def test_create_volume_metadata(self):
self._create_volume_metadata(expected_status=200)
@decorators.idempotent_id('93a45eda-2753-428c-b846-325eaee560a7')
def test_show_volume_metadata(self):
self._show_volume_metadata(expected_status=200)
@decorators.idempotent_id('d1ad8db6-0f63-420e-b945-e40de817f427')
def test_update_volume_metadata(self):
self._update_volume_metadata(expected_status=200)
@decorators.idempotent_id('37f2129e-a8fa-419f-81dc-3ee66edd3c0c')
def test_show_volume_metadata_item(self):
self._show_volume_metadata_item(expected_status=200)
@decorators.idempotent_id('ff7c632b-4a26-4242-80ef-6375bf153462')
def test_delete_volume_metadata_item(self):
self._delete_volume_metadata_item(expected_status=200)
@decorators.idempotent_id('310f41e5-534b-4556-a859-089774d912c2')
def test_update_volume_metadata_item(self):
self._update_volume_metadata_item(expected_status=200)