Skip to content

Commit 8b6626e

Browse files
author
Huanxuan Ao
committed
Error handling of "router delete" command
"Router delete" command supports multi deletion but no error handling. This patch add the error handling follow the rule in doc/source/command-error.rst Change-Id: I3376d957b4dc28d8282599dc909ecc5ed2b5f46a
1 parent ba825a4 commit 8b6626e

2 files changed

Lines changed: 76 additions & 9 deletions

File tree

openstackclient/network/v2/router.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from osc_lib.cli import parseractions
2121
from osc_lib.command import command
22+
from osc_lib import exceptions
2223
from osc_lib import utils
2324

2425
from openstackclient.i18n import _
@@ -222,9 +223,23 @@ def get_parser(self, prog_name):
222223

223224
def take_action(self, parsed_args):
224225
client = self.app.client_manager.network
226+
result = 0
227+
225228
for router in parsed_args.router:
226-
obj = client.find_router(router)
227-
client.delete_router(obj)
229+
try:
230+
obj = client.find_router(router, ignore_missing=False)
231+
client.delete_router(obj)
232+
except Exception as e:
233+
result += 1
234+
LOG.error(_("Failed to delete router with "
235+
"name or ID '%(router)s': %(e)s")
236+
% {'router': router, 'e': e})
237+
238+
if result > 0:
239+
total = len(parsed_args.router)
240+
msg = (_("%(result)s of %(total)s routers failed "
241+
"to delete.") % {'result': result, 'total': total})
242+
raise exceptions.CommandError(msg)
228243

229244

230245
class ListRouter(command.Lister):

openstackclient/tests/network/v2/test_router.py

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
#
1313

1414
import mock
15+
from mock import call
1516

17+
from osc_lib import exceptions
1618
from osc_lib import utils as osc_utils
1719

1820
from openstackclient.network.v2 import router
@@ -202,32 +204,82 @@ def test_create_with_AZ_hints(self):
202204

203205
class TestDeleteRouter(TestRouter):
204206

205-
# The router to delete.
206-
_router = network_fakes.FakeRouter.create_one_router()
207+
# The routers to delete.
208+
_routers = network_fakes.FakeRouter.create_routers(count=2)
207209

208210
def setUp(self):
209211
super(TestDeleteRouter, self).setUp()
210212

211213
self.network.delete_router = mock.Mock(return_value=None)
212214

213-
self.network.find_router = mock.Mock(return_value=self._router)
215+
self.network.find_router = (
216+
network_fakes.FakeRouter.get_routers(self._routers))
214217

215218
# Get the command object to test
216219
self.cmd = router.DeleteRouter(self.app, self.namespace)
217220

218-
def test_delete(self):
221+
def test_router_delete(self):
219222
arglist = [
220-
self._router.name,
223+
self._routers[0].name,
221224
]
222225
verifylist = [
223-
('router', [self._router.name]),
226+
('router', [self._routers[0].name]),
227+
]
228+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
229+
230+
result = self.cmd.take_action(parsed_args)
231+
self.network.delete_router.assert_called_once_with(self._routers[0])
232+
self.assertIsNone(result)
233+
234+
def test_multi_routers_delete(self):
235+
arglist = []
236+
verifylist = []
237+
238+
for r in self._routers:
239+
arglist.append(r.name)
240+
verifylist = [
241+
('router', arglist),
224242
]
225243
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
226244

227245
result = self.cmd.take_action(parsed_args)
228-
self.network.delete_router.assert_called_once_with(self._router)
246+
247+
calls = []
248+
for r in self._routers:
249+
calls.append(call(r))
250+
self.network.delete_router.assert_has_calls(calls)
229251
self.assertIsNone(result)
230252

253+
def test_multi_routers_delete_with_exception(self):
254+
arglist = [
255+
self._routers[0].name,
256+
'unexist_router',
257+
]
258+
verifylist = [
259+
('router',
260+
[self._routers[0].name, 'unexist_router']),
261+
]
262+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
263+
264+
find_mock_result = [self._routers[0], exceptions.CommandError]
265+
self.network.find_router = (
266+
mock.MagicMock(side_effect=find_mock_result)
267+
)
268+
269+
try:
270+
self.cmd.take_action(parsed_args)
271+
self.fail('CommandError should be raised.')
272+
except exceptions.CommandError as e:
273+
self.assertEqual('1 of 2 routers failed to delete.', str(e))
274+
275+
self.network.find_router.assert_any_call(
276+
self._routers[0].name, ignore_missing=False)
277+
self.network.find_router.assert_any_call(
278+
'unexist_router', ignore_missing=False)
279+
self.network.delete_router.assert_called_once_with(
280+
self._routers[0]
281+
)
282+
231283

232284
class TestListRouter(TestRouter):
233285

0 commit comments

Comments
 (0)