diff --git a/openstackclient/tests/unit/volume/v3/fakes.py b/openstackclient/tests/unit/volume/v3/fakes.py index dcd8b11f3..cd914e7d9 100644 --- a/openstackclient/tests/unit/volume/v3/fakes.py +++ b/openstackclient/tests/unit/volume/v3/fakes.py @@ -18,6 +18,7 @@ from cinderclient import api_versions from openstack.block_storage.v3 import _proxy from openstack.block_storage.v3 import availability_zone as _availability_zone from openstack.block_storage.v3 import extension as _extension +from openstack.block_storage.v3 import resource_filter as _filters from openstack.block_storage.v3 import volume as _volume from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes @@ -243,7 +244,7 @@ def create_one_resource_filter(attrs=None): # Overwrite default attributes if there are some attributes set resource_filter_info.update(attrs) - return fakes.FakeResource(None, resource_filter_info, loaded=True) + return _filters.ResourceFilter(**resource_filter_info) def create_resource_filters(attrs=None, count=2): diff --git a/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py b/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py index a5c0da3d3..70d8911c4 100644 --- a/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +++ b/openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py @@ -10,7 +10,11 @@ # License for the specific language governing permissions and limitations # under the License. +from unittest import mock + from cinderclient import api_versions +from openstack import utils as sdk_utils +from osc_lib.cli import format_columns from osc_lib import exceptions from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes @@ -21,9 +25,22 @@ class TestBlockStorageResourceFilter(volume_fakes.TestVolume): def setUp(self): super().setUp() - # Get a shortcut to the ResourceFilterManager Mock - self.resource_filter_mock = self.volume_client.resource_filters - self.resource_filter_mock.reset_mock() + patcher = mock.patch.object( + sdk_utils, 'supports_microversion', return_value=True + ) + self.addCleanup(patcher.stop) + self.supports_microversion_mock = patcher.start() + self._set_mock_microversion( + self.app.client_manager.volume.api_version.get_string() + ) + + def _set_mock_microversion(self, mock_v): + """Set a specific microversion for the mock supports_microversion().""" + self.supports_microversion_mock.reset_mock(return_value=True) + self.supports_microversion_mock.side_effect = ( + lambda _, v: api_versions.APIVersion(v) + <= api_versions.APIVersion(mock_v) + ) class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): @@ -33,7 +50,7 @@ class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): def setUp(self): super().setUp() - self.resource_filter_mock.list.return_value = ( + self.volume_sdk_client.resource_filters.return_value = ( self.fake_resource_filters ) @@ -45,7 +62,7 @@ class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): ) def test_resource_filter_list(self): - self.volume_client.api_version = api_versions.APIVersion('3.33') + self._set_mock_microversion('3.33') arglist = [] verifylist = [] @@ -55,7 +72,7 @@ class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): expected_data = tuple( ( resource_filter.resource, - resource_filter.filters, + format_columns.ListColumn(resource_filter.filters), ) for resource_filter in self.fake_resource_filters ) @@ -65,10 +82,10 @@ class TestBlockStorageResourceFilterList(TestBlockStorageResourceFilter): self.assertEqual(expected_data, tuple(data)) # checking if proper call was made to list clusters - self.resource_filter_mock.list.assert_called_with() + self.volume_sdk_client.resource_filters.assert_called_with() def test_resource_filter_list_pre_v333(self): - self.volume_client.api_version = api_versions.APIVersion('3.32') + self._set_mock_microversion('3.32') arglist = [] verifylist = [] @@ -89,7 +106,7 @@ class TestBlockStorageResourceFilterShow(TestBlockStorageResourceFilter): def setUp(self): super().setUp() - self.resource_filter_mock.list.return_value = iter( + self.volume_sdk_client.resource_filters.return_value = iter( [self.fake_resource_filter] ) @@ -101,7 +118,7 @@ class TestBlockStorageResourceFilterShow(TestBlockStorageResourceFilter): ) def test_resource_filter_show(self): - self.volume_client.api_version = api_versions.APIVersion('3.33') + self._set_mock_microversion('3.33') arglist = [ self.fake_resource_filter.resource, @@ -111,10 +128,10 @@ class TestBlockStorageResourceFilterShow(TestBlockStorageResourceFilter): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - expected_columns = ('filters', 'resource') + expected_columns = ('Resource', 'Filters') expected_data = ( - self.fake_resource_filter.filters, self.fake_resource_filter.resource, + format_columns.ListColumn(self.fake_resource_filter.filters), ) columns, data = self.cmd.take_action(parsed_args) @@ -122,10 +139,12 @@ class TestBlockStorageResourceFilterShow(TestBlockStorageResourceFilter): self.assertEqual(expected_data, data) # checking if proper call was made to list clusters - self.resource_filter_mock.list.assert_called_with(resource='volume') + self.volume_sdk_client.resource_filters.assert_called_with( + resource='volume' + ) def test_resource_filter_show_pre_v333(self): - self.volume_client.api_version = api_versions.APIVersion('3.32') + self._set_mock_microversion('3.32') arglist = [ self.fake_resource_filter.resource, diff --git a/openstackclient/volume/v3/block_storage_resource_filter.py b/openstackclient/volume/v3/block_storage_resource_filter.py index 4963fd4c7..494d9cbe1 100644 --- a/openstackclient/volume/v3/block_storage_resource_filter.py +++ b/openstackclient/volume/v3/block_storage_resource_filter.py @@ -12,7 +12,8 @@ """Volume V3 Resource Filters implementations""" -from cinderclient import api_versions +from openstack import utils as sdk_utils +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -24,9 +25,9 @@ class ListBlockStorageResourceFilter(command.Lister): _description = _('List block storage resource filters') def take_action(self, parsed_args): - volume_client = self.app.client_manager.volume + volume_client = self.app.client_manager.sdk_connection.volume - if volume_client.api_version < api_versions.APIVersion('3.33'): + if not sdk_utils.supports_microversion(volume_client, '3.33'): msg = _( "--os-volume-api-version 3.33 or greater is required to " "support the 'block storage resource filter list' command" @@ -37,12 +38,20 @@ class ListBlockStorageResourceFilter(command.Lister): 'Resource', 'Filters', ) + columns = ( + 'resource', + 'filters', + ) - data = volume_client.resource_filters.list() + data = volume_client.resource_filters() + formatters = {'filters': format_columns.ListColumn} return ( column_headers, - (utils.get_item_properties(s, column_headers) for s in data), + ( + utils.get_item_properties(s, columns, formatters=formatters) + for s in data + ), ) @@ -60,18 +69,16 @@ class ShowBlockStorageResourceFilter(command.ShowOne): return parser def take_action(self, parsed_args): - volume_client = self.app.client_manager.volume + volume_client = self.app.client_manager.sdk_connection.volume - if volume_client.api_version < api_versions.APIVersion('3.33'): + if not sdk_utils.supports_microversion(volume_client, '3.33'): msg = _( "--os-volume-api-version 3.33 or greater is required to " "support the 'block storage resource filter show' command" ) raise exceptions.CommandError(msg) - data = volume_client.resource_filters.list( - resource=parsed_args.resource - ) + data = volume_client.resource_filters(resource=parsed_args.resource) if not data: msg = _( "No resource filter with a name of {parsed_args.resource}' " @@ -80,4 +87,19 @@ class ShowBlockStorageResourceFilter(command.ShowOne): raise exceptions.CommandError(msg) resource_filter = next(data) - return zip(*sorted(resource_filter._info.items())) + column_headers = ( + 'Resource', + 'Filters', + ) + columns = ( + 'resource', + 'filters', + ) + formatters = {'filters': format_columns.ListColumn} + + return ( + column_headers, + utils.get_dict_properties( + resource_filter, columns, formatters=formatters + ), + ) diff --git a/releasenotes/notes/migrate-resource-filter-commands-2a353edb965723d1.yaml b/releasenotes/notes/migrate-resource-filter-commands-2a353edb965723d1.yaml new file mode 100644 index 000000000..bf5ce3b60 --- /dev/null +++ b/releasenotes/notes/migrate-resource-filter-commands-2a353edb965723d1.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Migrated ``block storage resource filters list`` and + ``block storage resource filters show`` commands to SDK.