Skip to content

Commit 7cda2b2

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Error handling of "router delete" command"
2 parents 8c850ca + 8b6626e commit 7cda2b2

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)