compute: Fix filtering servers by tags

The nova API expects the 'tags' and 'not-tags' filters of the 'GET
/servers' (list servers) API to be a CSV string [1]:

  tags (Optional)
    A list of tags to filter the server list by. Servers that match all
    tags in this list will be returned. Boolean expression in this case
    is 't1 AND t2'. Tags in query must be separated by comma.

    New in version 2.26

  not-tags (Optional)
    A list of tags to filter the server list by. Servers that don’t
    match all tags in this list will be returned. Boolean expression in
    this case is 'NOT (t1 AND t2)'. Tags in query must be separated by
    comma.

    New in version 2.26

We were instead providing a Python list, which was simply being URL
encoded. Correct this.

[1] https://docs.openstack.org/api-ref/compute/?expanded=list-servers-detail#list-servers

Change-Id: Ie0251a0dccdf3385089e5bbaedf646a5e928cc48
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Closes-Bug: #1946816
This commit is contained in:
Stephen Finucane 2021-10-13 10:18:53 +01:00
parent e0c61f0cbe
commit 53debe7fe1
3 changed files with 10 additions and 4 deletions

View File

@ -2257,7 +2257,7 @@ class ListServer(command.Lister):
)
raise exceptions.CommandError(msg)
search_opts['tags'] = parsed_args.tags
search_opts['tags'] = ','.join(parsed_args.tags)
if parsed_args.not_tags:
if compute_client.api_version < api_versions.APIVersion('2.26'):
@ -2267,7 +2267,7 @@ class ListServer(command.Lister):
)
raise exceptions.CommandError(msg)
search_opts['not-tags'] = parsed_args.not_tags
search_opts['not-tags'] = ','.join(parsed_args.not_tags)
if parsed_args.locked:
if compute_client.api_version < api_versions.APIVersion('2.73'):

View File

@ -4489,7 +4489,7 @@ class TestServerList(TestServer):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.search_opts['tags'] = ['tag1', 'tag2']
self.search_opts['tags'] = 'tag1,tag2'
self.servers_mock.list.assert_called_with(**self.kwargs)
@ -4532,7 +4532,7 @@ class TestServerList(TestServer):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.search_opts['not-tags'] = ['tag1', 'tag2']
self.search_opts['not-tags'] = 'tag1,tag2'
self.servers_mock.list.assert_called_with(**self.kwargs)

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Filtering servers by tags (``server list --tag``,
``server list --not-tag``) now works correctly.
[Bug `1946816 <https://bugs.launchpad.net/bugs/1946816>`_]