Skip to content

Commit 2b4b1e0

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix openstack server list --deleted --marker option" into stable/train
2 parents 576d9ec + c42c27a commit 2b4b1e0

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

openstackclient/compute/v2/server.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,8 @@ def get_parser(self, prog_name):
12291229
default=None,
12301230
help=_('The last server of the previous page. Display '
12311231
'list of servers after marker. Display all servers if not '
1232-
'specified. (name or ID)')
1232+
'specified. When used with ``--deleted``, the marker must '
1233+
'be an ID, otherwise a name or ID can be used.'),
12331234
)
12341235
parser.add_argument(
12351236
'--limit',
@@ -1437,9 +1438,17 @@ def take_action(self, parsed_args):
14371438
mixed_case_fields = []
14381439

14391440
marker_id = None
1441+
14401442
if parsed_args.marker:
1441-
marker_id = utils.find_resource(compute_client.servers,
1442-
parsed_args.marker).id
1443+
# Check if both "--marker" and "--deleted" are used.
1444+
# In that scenario a lookup is not needed as the marker
1445+
# needs to be an ID, because find_resource does not
1446+
# handle deleted resources
1447+
if parsed_args.deleted:
1448+
marker_id = parsed_args.marker
1449+
else:
1450+
marker_id = utils.find_resource(compute_client.servers,
1451+
parsed_args.marker).id
14431452

14441453
data = compute_client.servers.list(search_opts=search_opts,
14451454
marker=marker_id,

openstackclient/tests/functional/compute/v2/test_server.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,49 @@ def test_server_list(self):
6363
self.assertNotIn(name1, col_name)
6464
self.assertIn(name2, col_name)
6565

66+
def test_server_list_with_marker_and_deleted(self):
67+
"""Test server list with deleted and marker"""
68+
cmd_output = self.server_create(cleanup=False)
69+
name1 = cmd_output['name']
70+
cmd_output = self.server_create(cleanup=False)
71+
name2 = cmd_output['name']
72+
id2 = cmd_output['id']
73+
self.wait_for_status(name1, "ACTIVE")
74+
self.wait_for_status(name2, "ACTIVE")
75+
76+
# Test list --marker with ID
77+
cmd_output = json.loads(self.openstack(
78+
'server list -f json --marker ' + id2
79+
))
80+
col_name = [x["Name"] for x in cmd_output]
81+
self.assertIn(name1, col_name)
82+
83+
# Test list --marker with Name
84+
cmd_output = json.loads(self.openstack(
85+
'server list -f json --marker ' + name2
86+
))
87+
col_name = [x["Name"] for x in cmd_output]
88+
self.assertIn(name1, col_name)
89+
90+
self.openstack('server delete --wait ' + name1)
91+
self.openstack('server delete --wait ' + name2)
92+
93+
# Test list --deleted --marker with ID
94+
cmd_output = json.loads(self.openstack(
95+
'server list -f json --deleted --marker ' + id2
96+
))
97+
col_name = [x["Name"] for x in cmd_output]
98+
self.assertIn(name1, col_name)
99+
100+
# Test list --deleted --marker with Name
101+
try:
102+
cmd_output = json.loads(self.openstack(
103+
'server list -f json --deleted --marker ' + name2
104+
))
105+
except exceptions.CommandFailed as e:
106+
self.assertIn('marker [%s] not found (HTTP 400)' % (name2),
107+
e.stderr.decode('utf-8'))
108+
66109
def test_server_list_with_changes_before(self):
67110
"""Test server list.
68111
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
fixes:
3+
- |
4+
Fixes the "No server with a name or ID of 'id' exists" error when running
5+
``server list --deleted --marker``. The fix removes using a name for
6+
the marker when both ``--deleted`` and ``--marker`` are used. In
7+
this scenario an ID must be supplied for the marker.
8+
[Story `2006761 <https://storyboard.openstack.org/#!/story/2006761>`_]

0 commit comments

Comments
 (0)