Merge "Error handling of "router delete" command"
This commit is contained in:
commit
7cda2b2a06
@ -19,6 +19,7 @@ import logging
|
|||||||
|
|
||||||
from osc_lib.cli import parseractions
|
from osc_lib.cli import parseractions
|
||||||
from osc_lib.command import command
|
from osc_lib.command import command
|
||||||
|
from osc_lib import exceptions
|
||||||
from osc_lib import utils
|
from osc_lib import utils
|
||||||
|
|
||||||
from openstackclient.i18n import _
|
from openstackclient.i18n import _
|
||||||
@ -222,9 +223,23 @@ class DeleteRouter(command.Command):
|
|||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
client = self.app.client_manager.network
|
client = self.app.client_manager.network
|
||||||
|
result = 0
|
||||||
|
|
||||||
for router in parsed_args.router:
|
for router in parsed_args.router:
|
||||||
obj = client.find_router(router)
|
try:
|
||||||
client.delete_router(obj)
|
obj = client.find_router(router, ignore_missing=False)
|
||||||
|
client.delete_router(obj)
|
||||||
|
except Exception as e:
|
||||||
|
result += 1
|
||||||
|
LOG.error(_("Failed to delete router with "
|
||||||
|
"name or ID '%(router)s': %(e)s")
|
||||||
|
% {'router': router, 'e': e})
|
||||||
|
|
||||||
|
if result > 0:
|
||||||
|
total = len(parsed_args.router)
|
||||||
|
msg = (_("%(result)s of %(total)s routers failed "
|
||||||
|
"to delete.") % {'result': result, 'total': total})
|
||||||
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
|
|
||||||
class ListRouter(command.Lister):
|
class ListRouter(command.Lister):
|
||||||
|
@ -12,7 +12,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
|
from mock import call
|
||||||
|
|
||||||
|
from osc_lib import exceptions
|
||||||
from osc_lib import utils as osc_utils
|
from osc_lib import utils as osc_utils
|
||||||
|
|
||||||
from openstackclient.network.v2 import router
|
from openstackclient.network.v2 import router
|
||||||
@ -202,32 +204,82 @@ class TestCreateRouter(TestRouter):
|
|||||||
|
|
||||||
class TestDeleteRouter(TestRouter):
|
class TestDeleteRouter(TestRouter):
|
||||||
|
|
||||||
# The router to delete.
|
# The routers to delete.
|
||||||
_router = network_fakes.FakeRouter.create_one_router()
|
_routers = network_fakes.FakeRouter.create_routers(count=2)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestDeleteRouter, self).setUp()
|
super(TestDeleteRouter, self).setUp()
|
||||||
|
|
||||||
self.network.delete_router = mock.Mock(return_value=None)
|
self.network.delete_router = mock.Mock(return_value=None)
|
||||||
|
|
||||||
self.network.find_router = mock.Mock(return_value=self._router)
|
self.network.find_router = (
|
||||||
|
network_fakes.FakeRouter.get_routers(self._routers))
|
||||||
|
|
||||||
# Get the command object to test
|
# Get the command object to test
|
||||||
self.cmd = router.DeleteRouter(self.app, self.namespace)
|
self.cmd = router.DeleteRouter(self.app, self.namespace)
|
||||||
|
|
||||||
def test_delete(self):
|
def test_router_delete(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
self._router.name,
|
self._routers[0].name,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('router', [self._router.name]),
|
('router', [self._routers[0].name]),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
self.network.delete_router.assert_called_once_with(self._router)
|
self.network.delete_router.assert_called_once_with(self._routers[0])
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_multi_routers_delete(self):
|
||||||
|
arglist = []
|
||||||
|
verifylist = []
|
||||||
|
|
||||||
|
for r in self._routers:
|
||||||
|
arglist.append(r.name)
|
||||||
|
verifylist = [
|
||||||
|
('router', arglist),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
calls = []
|
||||||
|
for r in self._routers:
|
||||||
|
calls.append(call(r))
|
||||||
|
self.network.delete_router.assert_has_calls(calls)
|
||||||
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_multi_routers_delete_with_exception(self):
|
||||||
|
arglist = [
|
||||||
|
self._routers[0].name,
|
||||||
|
'unexist_router',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('router',
|
||||||
|
[self._routers[0].name, 'unexist_router']),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
find_mock_result = [self._routers[0], exceptions.CommandError]
|
||||||
|
self.network.find_router = (
|
||||||
|
mock.MagicMock(side_effect=find_mock_result)
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.cmd.take_action(parsed_args)
|
||||||
|
self.fail('CommandError should be raised.')
|
||||||
|
except exceptions.CommandError as e:
|
||||||
|
self.assertEqual('1 of 2 routers failed to delete.', str(e))
|
||||||
|
|
||||||
|
self.network.find_router.assert_any_call(
|
||||||
|
self._routers[0].name, ignore_missing=False)
|
||||||
|
self.network.find_router.assert_any_call(
|
||||||
|
'unexist_router', ignore_missing=False)
|
||||||
|
self.network.delete_router.assert_called_once_with(
|
||||||
|
self._routers[0]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestListRouter(TestRouter):
|
class TestListRouter(TestRouter):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user