Skip to content

Commit 86d7490

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add changes-before attribute to server list"
2 parents 95626f1 + ef1fd38 commit 86d7490

4 files changed

Lines changed: 175 additions & 2 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,13 +1143,22 @@ def get_parser(self, prog_name):
11431143
default=False,
11441144
help=_('Only display deleted servers (Admin only).')
11451145
)
1146+
parser.add_argument(
1147+
'--changes-before',
1148+
metavar='<changes-before>',
1149+
default=None,
1150+
help=_("List only servers changed before a certain point of time. "
1151+
"The provided time should be an ISO 8061 formatted time "
1152+
"(e.g., 2016-03-05T06:27:59Z). "
1153+
"(Supported by API versions '2.66' - '2.latest')")
1154+
)
11461155
parser.add_argument(
11471156
'--changes-since',
11481157
metavar='<changes-since>',
11491158
default=None,
11501159
help=_("List only servers changed after a certain point of time."
1151-
" The provided time should be an ISO 8061 formatted time."
1152-
" ex 2016-03-04T06:27:59Z .")
1160+
" The provided time should be an ISO 8061 formatted time"
1161+
" (e.g., 2016-03-04T06:27:59Z).")
11531162
)
11541163
return parser
11551164

@@ -1203,10 +1212,24 @@ def take_action(self, parsed_args):
12031212
'all_tenants': parsed_args.all_projects,
12041213
'user_id': user_id,
12051214
'deleted': parsed_args.deleted,
1215+
'changes-before': parsed_args.changes_before,
12061216
'changes-since': parsed_args.changes_since,
12071217
}
12081218
LOG.debug('search options: %s', search_opts)
12091219

1220+
if search_opts['changes-before']:
1221+
if compute_client.api_version < api_versions.APIVersion('2.66'):
1222+
msg = _('--os-compute-api-version 2.66 or later is required')
1223+
raise exceptions.CommandError(msg)
1224+
1225+
try:
1226+
timeutils.parse_isotime(search_opts['changes-before'])
1227+
except ValueError:
1228+
raise exceptions.CommandError(
1229+
_('Invalid changes-before value: %s') %
1230+
search_opts['changes-before']
1231+
)
1232+
12101233
if search_opts['changes-since']:
12111234
try:
12121235
timeutils.parse_isotime(search_opts['changes-since'])

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

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

66+
def test_server_list_with_changes_before(self):
67+
"""Test server list.
68+
69+
Getting the servers list with updated_at time equal or
70+
before than changes-before.
71+
"""
72+
cmd_output = self.server_create()
73+
server_name1 = cmd_output['name']
74+
75+
cmd_output = self.server_create()
76+
server_name2 = cmd_output['name']
77+
updated_at2 = cmd_output['updated']
78+
79+
cmd_output = self.server_create()
80+
server_name3 = cmd_output['name']
81+
82+
cmd_output = json.loads(self.openstack(
83+
'--os-compute-api-version 2.66 ' +
84+
'server list -f json '
85+
'--changes-before ' + updated_at2
86+
))
87+
88+
col_updated = [server["Name"] for server in cmd_output]
89+
self.assertIn(server_name1, col_updated)
90+
self.assertIn(server_name2, col_updated)
91+
self.assertNotIn(server_name3, col_updated)
92+
93+
def test_server_list_with_changes_since(self):
94+
"""Test server list.
95+
96+
Getting the servers list with updated_at time equal or
97+
later than changes-since.
98+
"""
99+
cmd_output = self.server_create()
100+
server_name1 = cmd_output['name']
101+
cmd_output = self.server_create()
102+
server_name2 = cmd_output['name']
103+
updated_at2 = cmd_output['updated']
104+
cmd_output = self.server_create()
105+
server_name3 = cmd_output['name']
106+
107+
cmd_output = json.loads(self.openstack(
108+
'server list -f json '
109+
'--changes-since ' + updated_at2
110+
))
111+
112+
col_updated = [server["Name"] for server in cmd_output]
113+
self.assertNotIn(server_name1, col_updated)
114+
self.assertIn(server_name2, col_updated)
115+
self.assertIn(server_name3, col_updated)
116+
117+
def test_server_list_with_changes_before_and_changes_since(self):
118+
"""Test server list.
119+
120+
Getting the servers list with updated_at time equal or before than
121+
changes-before and equal or later than changes-since.
122+
"""
123+
cmd_output = self.server_create()
124+
server_name1 = cmd_output['name']
125+
cmd_output = self.server_create()
126+
server_name2 = cmd_output['name']
127+
updated_at2 = cmd_output['updated']
128+
cmd_output = self.server_create()
129+
server_name3 = cmd_output['name']
130+
updated_at3 = cmd_output['updated']
131+
132+
cmd_output = json.loads(self.openstack(
133+
'--os-compute-api-version 2.66 ' +
134+
'server list -f json ' +
135+
'--changes-since ' + updated_at2 +
136+
' --changes-before ' + updated_at3
137+
))
138+
139+
col_updated = [server["Name"] for server in cmd_output]
140+
self.assertNotIn(server_name1, col_updated)
141+
self.assertIn(server_name2, col_updated)
142+
self.assertIn(server_name3, col_updated)
143+
66144
def test_server_set(self):
67145
"""Test server create, delete, set, show"""
68146
cmd_output = self.server_create()

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,6 +2075,7 @@ def setUp(self):
20752075
'user_id': None,
20762076
'deleted': False,
20772077
'changes-since': None,
2078+
'changes-before': None,
20782079
}
20792080

20802081
# Default params of the core function of the command in the case of no
@@ -2356,6 +2357,71 @@ def test_server_list_with_invalid_changes_since(self, mock_parse_isotime):
23562357
'Invalid time value'
23572358
)
23582359

2360+
def test_server_list_v266_with_changes_before(self):
2361+
self.app.client_manager.compute.api_version = (
2362+
api_versions.APIVersion('2.66'))
2363+
arglist = [
2364+
'--changes-before', '2016-03-05T06:27:59Z',
2365+
'--deleted'
2366+
]
2367+
verifylist = [
2368+
('changes_before', '2016-03-05T06:27:59Z'),
2369+
('deleted', True),
2370+
]
2371+
2372+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2373+
columns, data = self.cmd.take_action(parsed_args)
2374+
2375+
self.search_opts['changes-before'] = '2016-03-05T06:27:59Z'
2376+
self.search_opts['deleted'] = True
2377+
self.servers_mock.list.assert_called_with(**self.kwargs)
2378+
2379+
self.assertEqual(self.columns, columns)
2380+
self.assertEqual(tuple(self.data), tuple(data))
2381+
2382+
@mock.patch.object(timeutils, 'parse_isotime', side_effect=ValueError)
2383+
def test_server_list_v266_with_invalid_changes_before(
2384+
self, mock_parse_isotime):
2385+
self.app.client_manager.compute.api_version = (
2386+
api_versions.APIVersion('2.66'))
2387+
2388+
arglist = [
2389+
'--changes-before', 'Invalid time value',
2390+
]
2391+
verifylist = [
2392+
('changes_before', 'Invalid time value'),
2393+
]
2394+
2395+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2396+
try:
2397+
self.cmd.take_action(parsed_args)
2398+
self.fail('CommandError should be raised.')
2399+
except exceptions.CommandError as e:
2400+
self.assertEqual('Invalid changes-before value: Invalid time '
2401+
'value', str(e))
2402+
mock_parse_isotime.assert_called_once_with(
2403+
'Invalid time value'
2404+
)
2405+
2406+
def test_server_with_changes_before_older_version(self):
2407+
self.app.client_manager.compute.api_version = (
2408+
api_versions.APIVersion('2.65'))
2409+
2410+
arglist = [
2411+
'--changes-before', '2016-03-05T06:27:59Z',
2412+
'--deleted'
2413+
]
2414+
verifylist = [
2415+
('changes_before', '2016-03-05T06:27:59Z'),
2416+
('deleted', True),
2417+
]
2418+
2419+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2420+
2421+
self.assertRaises(exceptions.CommandError,
2422+
self.cmd.take_action,
2423+
parsed_args)
2424+
23592425
def test_server_list_v269_with_partial_constructs(self):
23602426
self.app.client_manager.compute.api_version = \
23612427
api_versions.APIVersion('2.69')
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``--changes-before`` option to the ``server list`` command.
5+
This requires Compute API version '2.66' or later.
6+
[:lpbug: `1827844`]

0 commit comments

Comments
 (0)