summaryrefslogtreecommitdiff
path: root/openstackclient/tests
diff options
context:
space:
mode:
authorKeithMnemonic <keith.berger@suse.com>2019-10-24 14:39:50 -0400
committerKeith Berger <keith.berger@suse.com>2020-01-02 20:05:56 +0000
commitf5384ae16a24cdd54149fa21827d14b8b8983d4f (patch)
treefee10d3f8cb4a7ca26637977f1fce42960475bf9 /openstackclient/tests
parent5b3a827a1ff80e4b51c7ede44b84bf640d5b6380 (diff)
downloadpython-openstackclient-f5384ae16a24cdd54149fa21827d14b8b8983d4f.tar.gz
Fix openstack server list --deleted --marker option
This patch removes using the "name" option for a marker when --deleted is also used. The find_resource() function that is being called does not correctly handle using the marker as the "name" in the search when also using deleted=True. One simple way to fix this is force the marker to only be an ID when --deleted is used. This is how the nova client works. Using the --deleted option is available to users with the admin role by default. If you're an admin listing --deleted servers with a marker by name, find_resource() is going to fail to find it since it doesn't apply the --deleted filter to find_resource(). The find_resource() function is trying to find the marker server by name if it's not found by id, and to find it by name it's listing servers with the given marker as the name, but not applying the --deleted filter so it doesn't get back any results. In the story it was suggested modifying find_resource to include the deleted query param when it's specified on the command line but that didn't work because it still results in something like this: http://192.168.1.123/compute/v2.1/servers?deleted=True&name=4cecd49f-bc25-4a7e-826e-4aea6f9267d9 It seems like there are bugs in find_resource(). Restricting the marker to be the server ID when listing deleted servers is probably OK since if you're using --deleted you're an admin and you could be listing across all projects and if you're filtering by a server across all projects anyway (not that you have to, I'm just saying if you are), or even showing a server in another project, you have to do it by id rather than name because find_resource() won't find the server in another project by name, only ID. story: 2006761 Task: 37258 Change-Id: Ib878982b1d469212ca3483dcfaf407a8e1d2b417
Diffstat (limited to 'openstackclient/tests')
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py
index 2bca70d0..6e080e9b 100644
--- a/openstackclient/tests/functional/compute/v2/test_server.py
+++ b/openstackclient/tests/functional/compute/v2/test_server.py
@@ -63,6 +63,49 @@ class ServerTests(common.ComputeTestCase):
self.assertNotIn(name1, col_name)
self.assertIn(name2, col_name)
+ def test_server_list_with_marker_and_deleted(self):
+ """Test server list with deleted and marker"""
+ cmd_output = self.server_create(cleanup=False)
+ name1 = cmd_output['name']
+ cmd_output = self.server_create(cleanup=False)
+ name2 = cmd_output['name']
+ id2 = cmd_output['id']
+ self.wait_for_status(name1, "ACTIVE")
+ self.wait_for_status(name2, "ACTIVE")
+
+ # Test list --marker with ID
+ cmd_output = json.loads(self.openstack(
+ 'server list -f json --marker ' + id2
+ ))
+ col_name = [x["Name"] for x in cmd_output]
+ self.assertIn(name1, col_name)
+
+ # Test list --marker with Name
+ cmd_output = json.loads(self.openstack(
+ 'server list -f json --marker ' + name2
+ ))
+ col_name = [x["Name"] for x in cmd_output]
+ self.assertIn(name1, col_name)
+
+ self.openstack('server delete --wait ' + name1)
+ self.openstack('server delete --wait ' + name2)
+
+ # Test list --deleted --marker with ID
+ cmd_output = json.loads(self.openstack(
+ 'server list -f json --deleted --marker ' + id2
+ ))
+ col_name = [x["Name"] for x in cmd_output]
+ self.assertIn(name1, col_name)
+
+ # Test list --deleted --marker with Name
+ try:
+ cmd_output = json.loads(self.openstack(
+ 'server list -f json --deleted --marker ' + name2
+ ))
+ except exceptions.CommandFailed as e:
+ self.assertIn('marker [%s] not found (HTTP 400)' % (name2),
+ e.stderr.decode('utf-8'))
+
def test_server_list_with_changes_before(self):
"""Test server list.