Skip to content

Commit ef1fd38

Browse files
committed
Add changes-before attribute to server list
Closes-Bug: #1827844 Part of bp support-to-query-nova-resources-filter-by-changes-before Change-Id: I4f28168188973730247bcbcb70ba0e70eb81e3be
1 parent 91bc0f3 commit ef1fd38

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
@@ -1128,13 +1128,22 @@ def get_parser(self, prog_name):
11281128
default=False,
11291129
help=_('Only display deleted servers (Admin only).')
11301130
)
1131+
parser.add_argument(
1132+
'--changes-before',
1133+
metavar='<changes-before>',
1134+
default=None,
1135+
help=_("List only servers changed before a certain point of time. "
1136+
"The provided time should be an ISO 8061 formatted time "
1137+
"(e.g., 2016-03-05T06:27:59Z). "
1138+
"(Supported by API versions '2.66' - '2.latest')")
1139+
)
11311140
parser.add_argument(
11321141
'--changes-since',
11331142
metavar='<changes-since>',
11341143
default=None,
11351144
help=_("List only servers changed after a certain point of time."
1136-
" The provided time should be an ISO 8061 formatted time."
1137-
" ex 2016-03-04T06:27:59Z .")
1145+
" The provided time should be an ISO 8061 formatted time"
1146+
" (e.g., 2016-03-04T06:27:59Z).")
11381147
)
11391148
return parser
11401149

@@ -1188,10 +1197,24 @@ def take_action(self, parsed_args):
11881197
'all_tenants': parsed_args.all_projects,
11891198
'user_id': user_id,
11901199
'deleted': parsed_args.deleted,
1200+
'changes-before': parsed_args.changes_before,
11911201
'changes-since': parsed_args.changes_since,
11921202
}
11931203
LOG.debug('search options: %s', search_opts)
11941204

1205+
if search_opts['changes-before']:
1206+
if compute_client.api_version < api_versions.APIVersion('2.66'):
1207+
msg = _('--os-compute-api-version 2.66 or later is required')
1208+
raise exceptions.CommandError(msg)
1209+
1210+
try:
1211+
timeutils.parse_isotime(search_opts['changes-before'])
1212+
except ValueError:
1213+
raise exceptions.CommandError(
1214+
_('Invalid changes-before value: %s') %
1215+
search_opts['changes-before']
1216+
)
1217+
11951218
if search_opts['changes-since']:
11961219
try:
11971220
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
@@ -1991,6 +1991,7 @@ def setUp(self):
19911991
'user_id': None,
19921992
'deleted': False,
19931993
'changes-since': None,
1994+
'changes-before': None,
19941995
}
19951996

19961997
# Default params of the core function of the command in the case of no
@@ -2272,6 +2273,71 @@ def test_server_list_with_invalid_changes_since(self, mock_parse_isotime):
22722273
'Invalid time value'
22732274
)
22742275

2276+
def test_server_list_v266_with_changes_before(self):
2277+
self.app.client_manager.compute.api_version = (
2278+
api_versions.APIVersion('2.66'))
2279+
arglist = [
2280+
'--changes-before', '2016-03-05T06:27:59Z',
2281+
'--deleted'
2282+
]
2283+
verifylist = [
2284+
('changes_before', '2016-03-05T06:27:59Z'),
2285+
('deleted', True),
2286+
]
2287+
2288+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2289+
columns, data = self.cmd.take_action(parsed_args)
2290+
2291+
self.search_opts['changes-before'] = '2016-03-05T06:27:59Z'
2292+
self.search_opts['deleted'] = True
2293+
self.servers_mock.list.assert_called_with(**self.kwargs)
2294+
2295+
self.assertEqual(self.columns, columns)
2296+
self.assertEqual(tuple(self.data), tuple(data))
2297+
2298+
@mock.patch.object(timeutils, 'parse_isotime', side_effect=ValueError)
2299+
def test_server_list_v266_with_invalid_changes_before(
2300+
self, mock_parse_isotime):
2301+
self.app.client_manager.compute.api_version = (
2302+
api_versions.APIVersion('2.66'))
2303+
2304+
arglist = [
2305+
'--changes-before', 'Invalid time value',
2306+
]
2307+
verifylist = [
2308+
('changes_before', 'Invalid time value'),
2309+
]
2310+
2311+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2312+
try:
2313+
self.cmd.take_action(parsed_args)
2314+
self.fail('CommandError should be raised.')
2315+
except exceptions.CommandError as e:
2316+
self.assertEqual('Invalid changes-before value: Invalid time '
2317+
'value', str(e))
2318+
mock_parse_isotime.assert_called_once_with(
2319+
'Invalid time value'
2320+
)
2321+
2322+
def test_server_with_changes_before_older_version(self):
2323+
self.app.client_manager.compute.api_version = (
2324+
api_versions.APIVersion('2.65'))
2325+
2326+
arglist = [
2327+
'--changes-before', '2016-03-05T06:27:59Z',
2328+
'--deleted'
2329+
]
2330+
verifylist = [
2331+
('changes_before', '2016-03-05T06:27:59Z'),
2332+
('deleted', True),
2333+
]
2334+
2335+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2336+
2337+
self.assertRaises(exceptions.CommandError,
2338+
self.cmd.take_action,
2339+
parsed_args)
2340+
22752341
def test_server_list_v269_with_partial_constructs(self):
22762342
self.app.client_manager.compute.api_version = \
22772343
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)