summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-08-07 19:41:01 +0000
committerGerrit Code Review <review@openstack.org>2020-08-07 19:41:01 +0000
commitb8ff69eacac91342d006ce2b5f10bce65c8153d3 (patch)
treef76aeb39524833984a8daa93e1c4fb4ef739d441
parent38e1274f478219bee8899b6c9eaa09dbfd03bbcd (diff)
parent3b48ef54c8ad205dd086520cc17e4f96583e88ec (diff)
downloadpython-openstackclient-stable/stein.tar.gz
Merge "Fix openstack server list --deleted --marker option" into stable/steinstable/stein
-rw-r--r--openstackclient/compute/v2/server.py15
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py67
-rw-r--r--releasenotes/notes/bug-2006761-9041d1b25e845cfb.yaml8
3 files changed, 87 insertions, 3 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index da607bda..caa301d4 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -1134,7 +1134,8 @@ class ListServer(command.Lister):
default=None,
help=_('The last server of the previous page. Display '
'list of servers after marker. Display all servers if not '
- 'specified. (name or ID)')
+ 'specified. When used with ``--deleted``, the marker must '
+ 'be an ID, otherwise a name or ID can be used.'),
)
parser.add_argument(
'--limit',
@@ -1292,9 +1293,17 @@ class ListServer(command.Lister):
mixed_case_fields = []
marker_id = None
+
if parsed_args.marker:
- marker_id = utils.find_resource(compute_client.servers,
- parsed_args.marker).id
+ # Check if both "--marker" and "--deleted" are used.
+ # In that scenario a lookup is not needed as the marker
+ # needs to be an ID, because find_resource does not
+ # handle deleted resources
+ if parsed_args.deleted:
+ marker_id = parsed_args.marker
+ else:
+ marker_id = utils.find_resource(compute_client.servers,
+ parsed_args.marker).id
data = compute_client.servers.list(search_opts=search_opts,
marker=marker_id,
diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py
index c8fb44d3..795ce1a9 100644
--- a/openstackclient/tests/functional/compute/v2/test_server.py
+++ b/openstackclient/tests/functional/compute/v2/test_server.py
@@ -63,6 +63,73 @@ 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_since(self):
+ """Test server list.
+
+ Getting the servers list with updated_at time equal or
+ later than changes-since.
+ """
+ cmd_output = self.server_create()
+ server_name1 = cmd_output['name']
+ cmd_output = self.server_create()
+ server_name2 = cmd_output['name']
+ updated_at2 = cmd_output['updated']
+ cmd_output = self.server_create()
+ server_name3 = cmd_output['name']
+
+ cmd_output = json.loads(self.openstack(
+ 'server list -f json '
+ '--changes-since ' + updated_at2
+ ))
+
+ col_updated = [server["Name"] for server in cmd_output]
+ self.assertNotIn(server_name1, col_updated)
+ self.assertIn(server_name2, col_updated)
+ self.assertIn(server_name3, col_updated)
+
def test_server_set(self):
"""Test server create, delete, set, show"""
cmd_output = self.server_create()
diff --git a/releasenotes/notes/bug-2006761-9041d1b25e845cfb.yaml b/releasenotes/notes/bug-2006761-9041d1b25e845cfb.yaml
new file mode 100644
index 00000000..e647cf21
--- /dev/null
+++ b/releasenotes/notes/bug-2006761-9041d1b25e845cfb.yaml
@@ -0,0 +1,8 @@
+---
+fixes:
+ - |
+ Fixes the "No server with a name or ID of 'id' exists" error when running
+ ``server list --deleted --marker``. The fix removes using a name for
+ the marker when both ``--deleted`` and ``--marker`` are used. In
+ this scenario an ID must be supplied for the marker.
+ [Story `2006761 <https://storyboard.openstack.org/#!/story/2006761>`_]