Skip to content

Commit c128ae1

Browse files
committed
trivial: Don't ignore missing resources
An openstacksdk 'find_foo' proxy method will return None by default if a resource is not found. You can change this behavior by setting 'ignore_missing=False'. We were doing this in most, but not all cases: correct the issue. In the event of calling 'image delete' with multiple images, it will no longer fail on the first missing image and will instead attempt to delete remaining images before failing. Change-Id: I1e01d3c096dcaab731c28e496a182dd911229227 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 99c7f58 commit c128ae1

12 files changed

Lines changed: 82 additions & 43 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,10 +2555,9 @@ def take_action(self, parsed_args):
25552555
# flavor name is given, map it to ID.
25562556
flavor_id = None
25572557
if parsed_args.flavor:
2558-
flavor = compute_client.find_flavor(parsed_args.flavor)
2559-
if flavor is None:
2560-
msg = _('Unable to find flavor: %s') % parsed_args.flavor
2561-
raise exceptions.CommandError(msg)
2558+
flavor = compute_client.find_flavor(
2559+
parsed_args.flavor, ignore_missing=False
2560+
)
25622561
flavor_id = flavor.id
25632562

25642563
# Nova only supports list servers searching by image ID. So if a
@@ -2811,7 +2810,9 @@ def take_action(self, parsed_args):
28112810
if parsed_args.deleted:
28122811
marker_id = parsed_args.marker
28132812
else:
2814-
marker_id = compute_client.find_server(parsed_args.marker).id
2813+
marker_id = compute_client.find_server(
2814+
parsed_args.marker, ignore_missing=False
2815+
).id
28152816
search_opts['marker'] = marker_id
28162817

28172818
data = list(compute_client.servers(**search_opts))
@@ -2871,7 +2872,9 @@ def take_action(self, parsed_args):
28712872
# "Flavor Name" is not crucial, so we swallow any
28722873
# exceptions
28732874
try:
2874-
flavors[f_id] = compute_client.find_flavor(f_id)
2875+
flavors[f_id] = compute_client.find_flavor(
2876+
f_id, ignore_missing=False
2877+
)
28752878
except Exception:
28762879
pass
28772880
else:
@@ -4039,7 +4042,9 @@ def take_action(self, parsed_args):
40394042

40404043
image = None
40414044
if parsed_args.image:
4042-
image = image_client.find_image(parsed_args.image)
4045+
image = image_client.find_image(
4046+
parsed_args.image, ignore_missing=False
4047+
)
40434048

40444049
utils.find_resource(
40454050
compute_client.servers,

openstackclient/compute/v2/server_backup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ def _show_progress(progress):
7373

7474
compute_client = self.app.client_manager.sdk_connection.compute
7575

76-
server = compute_client.find_server(parsed_args.server)
76+
server = compute_client.find_server(
77+
parsed_args.server, ignore_missing=False
78+
)
7779

7880
# Set sane defaults as this API wants all mouths to be fed
7981
if parsed_args.name is None:

openstackclient/compute/v2/server_group.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,9 @@ def take_action(self, parsed_args):
157157
result = 0
158158
for group in parsed_args.server_group:
159159
try:
160-
group_obj = compute_client.find_server_group(group)
160+
group_obj = compute_client.find_server_group(
161+
group, ignore_missing=False
162+
)
161163
compute_client.delete_server_group(group_obj.id)
162164
# Catch all exceptions in order to avoid to block the next deleting
163165
except Exception as e:
@@ -263,7 +265,9 @@ def get_parser(self, prog_name):
263265

264266
def take_action(self, parsed_args):
265267
compute_client = self.app.client_manager.sdk_connection.compute
266-
group = compute_client.find_server_group(parsed_args.server_group)
268+
group = compute_client.find_server_group(
269+
parsed_args.server_group, ignore_missing=False
270+
)
267271
display_columns, columns = _get_server_group_columns(
268272
group,
269273
compute_client,

openstackclient/compute/v2/server_migration.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,9 @@ def take_action(self, parsed_args):
166166
search_opts['status'] = parsed_args.status
167167

168168
if parsed_args.server:
169-
server = compute_client.find_server(parsed_args.server)
170-
if server is None:
171-
msg = _('Unable to find server: %s') % parsed_args.server
172-
raise exceptions.CommandError(msg)
169+
server = compute_client.find_server(
170+
parsed_args.server, ignore_missing=False
171+
)
173172
search_opts['instance_uuid'] = server.id
174173

175174
if parsed_args.type:

openstackclient/image/v1/image.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from osc_lib.cli import format_columns
2727
from osc_lib.cli import parseractions
2828
from osc_lib.command import command
29+
from osc_lib import exceptions
2930
from osc_lib import utils
3031

3132
from openstackclient.i18n import _
@@ -372,10 +373,30 @@ def get_parser(self, prog_name):
372373
return parser
373374

374375
def take_action(self, parsed_args):
376+
result = 0
375377
image_client = self.app.client_manager.image
376378
for image in parsed_args.images:
377-
image_obj = image_client.find_image(image)
378-
image_client.delete_image(image_obj.id)
379+
try:
380+
image_obj = image_client.find_image(
381+
image,
382+
ignore_missing=False,
383+
)
384+
image_client.delete_image(image_obj.id)
385+
except Exception as e:
386+
result += 1
387+
msg = _(
388+
"Failed to delete image with name or "
389+
"ID '%(image)s': %(e)s"
390+
)
391+
LOG.error(msg, {'image': image, 'e': e})
392+
393+
total = len(parsed_args.images)
394+
if result > 0:
395+
msg = _("Failed to delete %(result)s of %(total)s images.") % {
396+
'result': result,
397+
'total': total,
398+
}
399+
raise exceptions.CommandError(msg)
379400

380401

381402
class ListImage(command.Lister):
@@ -528,7 +549,9 @@ def get_parser(self, prog_name):
528549

529550
def take_action(self, parsed_args):
530551
image_client = self.app.client_manager.image
531-
image = image_client.find_image(parsed_args.image)
552+
image = image_client.find_image(
553+
parsed_args.image, ignore_missing=False
554+
)
532555

533556
output_file = parsed_args.file
534557
if output_file is None:
@@ -719,7 +742,9 @@ def take_action(self, parsed_args):
719742

720743
# Wrap the call to catch exceptions in order to close files
721744
try:
722-
image = image_client.find_image(parsed_args.image)
745+
image = image_client.find_image(
746+
parsed_args.image, ignore_missing=False
747+
)
723748

724749
if not parsed_args.location and not parsed_args.copy_from:
725750
if parsed_args.volume:
@@ -800,7 +825,9 @@ def get_parser(self, prog_name):
800825

801826
def take_action(self, parsed_args):
802827
image_client = self.app.client_manager.image
803-
image = image_client.find_image(parsed_args.image)
828+
image = image_client.find_image(
829+
parsed_args.image, ignore_missing=False
830+
)
804831

805832
if parsed_args.human_readable:
806833
_formatters['size'] = HumanReadableSizeColumn

openstackclient/image/v2/image.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -683,18 +683,14 @@ def get_parser(self, prog_name):
683683
return parser
684684

685685
def take_action(self, parsed_args):
686-
del_result = 0
686+
result = 0
687687
image_client = self.app.client_manager.image
688688
for image in parsed_args.images:
689689
try:
690690
image_obj = image_client.find_image(
691691
image,
692692
ignore_missing=False,
693693
)
694-
except sdk_exceptions.ResourceNotFound as e:
695-
msg = _("Unable to process request: %(e)s") % {'e': e}
696-
raise exceptions.CommandError(msg)
697-
try:
698694
image_client.delete_image(
699695
image_obj.id,
700696
store=parsed_args.store,
@@ -704,17 +700,17 @@ def take_action(self, parsed_args):
704700
msg = _("Multi Backend support not enabled.")
705701
raise exceptions.CommandError(msg)
706702
except Exception as e:
707-
del_result += 1
703+
result += 1
708704
msg = _(
709705
"Failed to delete image with name or "
710706
"ID '%(image)s': %(e)s"
711707
)
712708
LOG.error(msg, {'image': image, 'e': e})
713709

714710
total = len(parsed_args.images)
715-
if del_result > 0:
716-
msg = _("Failed to delete %(dresult)s of %(total)s images.") % {
717-
'dresult': del_result,
711+
if result > 0:
712+
msg = _("Failed to delete %(result)s of %(total)s images.") % {
713+
'result': result,
718714
'total': total,
719715
}
720716
raise exceptions.CommandError(msg)
@@ -1797,7 +1793,9 @@ def take_action(self, parsed_args):
17971793
)
17981794
raise exceptions.CommandError(msg)
17991795

1800-
image = image_client.find_image(parsed_args.image)
1796+
image = image_client.find_image(
1797+
parsed_args.image, ignore_missing=False
1798+
)
18011799

18021800
if not image.container_format and not image.disk_format:
18031801
msg = _(

openstackclient/network/v2/network_flavor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def take_action(self, parsed_args):
175175
)
176176
if result > 0:
177177
total = len(parsed_args.flavor)
178-
msg = _("%(result)s of %(total)s flavors failed " "to delete.") % {
178+
msg = _("%(result)s of %(total)s flavors failed to delete.") % {
179179
"result": result,
180180
"total": total,
181181
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4965,7 +4965,7 @@ def test_server_list_with_flavor(self):
49654965
columns, data = self.cmd.take_action(parsed_args)
49664966

49674967
self.compute_sdk_client.find_flavor.assert_has_calls(
4968-
[mock.call(self.flavor.id)]
4968+
[mock.call(self.flavor.id, ignore_missing=False)]
49694969
)
49704970

49714971
self.kwargs['flavor'] = self.flavor.id
@@ -7119,7 +7119,9 @@ def test_rescue_with_new_image(self):
71197119
self.cmd.take_action(parsed_args)
71207120

71217121
self.servers_mock.get.assert_called_with(self.server.id)
7122-
self.image_client.find_image.assert_called_with(new_image.id)
7122+
self.image_client.find_image.assert_called_with(
7123+
new_image.id, ignore_missing=False
7124+
)
71237125
self.server.rescue.assert_called_with(image=new_image, password=None)
71247126

71257127
def test_rescue_with_current_image_and_password(self):

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def test_server_group_delete(self):
188188
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
189189
result = self.cmd.take_action(parsed_args)
190190
self.compute_sdk_client.find_server_group.assert_called_once_with(
191-
'affinity_group'
191+
'affinity_group', ignore_missing=False
192192
)
193193
self.compute_sdk_client.delete_server_group.assert_called_once_with(
194194
self.fake_server_group.id
@@ -203,10 +203,10 @@ def test_server_group_multiple_delete(self):
203203
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
204204
result = self.cmd.take_action(parsed_args)
205205
self.compute_sdk_client.find_server_group.assert_any_call(
206-
'affinity_group'
206+
'affinity_group', ignore_missing=False
207207
)
208208
self.compute_sdk_client.find_server_group.assert_any_call(
209-
'anti_affinity_group'
209+
'anti_affinity_group', ignore_missing=False
210210
)
211211
self.compute_sdk_client.delete_server_group.assert_called_with(
212212
self.fake_server_group.id
@@ -248,10 +248,10 @@ def test_server_group_multiple_delete_with_exception(self):
248248
self.assertEqual('1 of 2 server groups failed to delete.', str(e))
249249

250250
self.compute_sdk_client.find_server_group.assert_any_call(
251-
'affinity_group'
251+
'affinity_group', ignore_missing=False
252252
)
253253
self.compute_sdk_client.find_server_group.assert_any_call(
254-
'anti_affinity_group'
254+
'anti_affinity_group', ignore_missing=False
255255
)
256256
self.assertEqual(
257257
2, self.compute_sdk_client.find_server_group.call_count

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ def test_server_migration_list(self):
141141
'migration_type': 'migration',
142142
}
143143

144-
self.compute_sdk_client.find_server.assert_called_with('server1')
144+
self.compute_sdk_client.find_server.assert_called_with(
145+
'server1', ignore_missing=False
146+
)
145147
self.compute_sdk_client.migrations.assert_called_with(**kwargs)
146148

147149
self.assertEqual(self.MIGRATION_COLUMNS, columns)

0 commit comments

Comments
 (0)