Support multiple argument for compute agent delete command
Change-Id: I3b19e4914d475b86d7e8aa8d76e62a2ac811272f Partially-Implements: blueprint multi-argument-compute
This commit is contained in:
parent
48ffd8cf4b
commit
909bab1e07
@ -44,17 +44,17 @@ Create compute agent
|
|||||||
compute agent delete
|
compute agent delete
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
Delete compute agent command
|
Delete compute agent(s)
|
||||||
|
|
||||||
.. program:: compute agent delete
|
.. program:: compute agent delete
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
|
||||||
os compute agent delete <id>
|
os compute agent delete <id> [<id> ...]
|
||||||
|
|
||||||
.. _compute_agent-delete:
|
.. _compute_agent-delete:
|
||||||
.. describe:: <id>
|
.. describe:: <id>
|
||||||
|
|
||||||
ID of agent to delete
|
ID of agent(s) to delete
|
||||||
|
|
||||||
compute agent list
|
compute agent list
|
||||||
------------------
|
------------------
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
import six
|
import six
|
||||||
|
|
||||||
from openstackclient.common import command
|
from openstackclient.common import command
|
||||||
|
from openstackclient.common import exceptions
|
||||||
from openstackclient.common import utils
|
from openstackclient.common import utils
|
||||||
from openstackclient.i18n import _
|
from openstackclient.i18n import _
|
||||||
|
|
||||||
@ -75,20 +76,35 @@ class CreateAgent(command.ShowOne):
|
|||||||
|
|
||||||
|
|
||||||
class DeleteAgent(command.Command):
|
class DeleteAgent(command.Command):
|
||||||
"""Delete compute agent command"""
|
"""Delete compute agent(s)"""
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(DeleteAgent, self).get_parser(prog_name)
|
parser = super(DeleteAgent, self).get_parser(prog_name)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"id",
|
"id",
|
||||||
metavar="<id>",
|
metavar="<id>",
|
||||||
help=_("ID of agent to delete")
|
nargs='+',
|
||||||
|
help=_("ID of agent(s) to delete")
|
||||||
)
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
compute_client = self.app.client_manager.compute
|
compute_client = self.app.client_manager.compute
|
||||||
compute_client.agents.delete(parsed_args.id)
|
result = 0
|
||||||
|
for id in parsed_args.id:
|
||||||
|
try:
|
||||||
|
compute_client.agents.delete(id)
|
||||||
|
except Exception as e:
|
||||||
|
result += 1
|
||||||
|
self.app.log.error(_("Failed to delete agent with "
|
||||||
|
"ID '%(id)s': %(e)s")
|
||||||
|
% {'id': id, 'e': e})
|
||||||
|
|
||||||
|
if result > 0:
|
||||||
|
total = len(parsed_args.id)
|
||||||
|
msg = (_("%(result)s of %(total)s agents failed "
|
||||||
|
"to delete.") % {'result': result, 'total': total})
|
||||||
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
|
|
||||||
class ListAgent(command.Lister):
|
class ListAgent(command.Lister):
|
||||||
|
@ -13,6 +13,10 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
import mock
|
||||||
|
|
||||||
|
from mock import call
|
||||||
|
from openstackclient.common import exceptions
|
||||||
from openstackclient.compute.v2 import agent
|
from openstackclient.compute.v2 import agent
|
||||||
from openstackclient.tests.compute.v2 import fakes as compute_fakes
|
from openstackclient.tests.compute.v2 import fakes as compute_fakes
|
||||||
|
|
||||||
@ -89,26 +93,73 @@ class TestAgentCreate(TestAgent):
|
|||||||
|
|
||||||
class TestAgentDelete(TestAgent):
|
class TestAgentDelete(TestAgent):
|
||||||
|
|
||||||
|
fake_agents = compute_fakes.FakeAgent.create_agents(count=2)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestAgentDelete, self).setUp()
|
super(TestAgentDelete, self).setUp()
|
||||||
|
|
||||||
self.agents_mock.get.return_value = self.fake_agent
|
self.agents_mock.get.return_value = self.fake_agents
|
||||||
self.cmd = agent.DeleteAgent(self.app, None)
|
self.cmd = agent.DeleteAgent(self.app, None)
|
||||||
|
|
||||||
def test_one_agent_delete(self):
|
def test_delete_one_agent(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'test'
|
self.fake_agents[0].agent_id
|
||||||
]
|
]
|
||||||
|
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('id', 'test'),
|
('id', [self.fake_agents[0].agent_id]),
|
||||||
]
|
]
|
||||||
|
|
||||||
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.agents_mock.delete.assert_called_with(parsed_args.id)
|
self.agents_mock.delete.assert_called_with(
|
||||||
|
self.fake_agents[0].agent_id)
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_delete_multiple_agents(self):
|
||||||
|
arglist = []
|
||||||
|
for n in self.fake_agents:
|
||||||
|
arglist.append(n.agent_id)
|
||||||
|
verifylist = [
|
||||||
|
('id', arglist),
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
calls = []
|
||||||
|
for n in self.fake_agents:
|
||||||
|
calls.append(call(n.agent_id))
|
||||||
|
self.agents_mock.delete.assert_has_calls(calls)
|
||||||
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
def test_delete_multiple_agents_exception(self):
|
||||||
|
arglist = [
|
||||||
|
self.fake_agents[0].agent_id,
|
||||||
|
self.fake_agents[1].agent_id,
|
||||||
|
'x-y-z',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('id', arglist),
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
ret_delete = [
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
exceptions.NotFound('404')
|
||||||
|
]
|
||||||
|
self.agents_mock.delete = mock.Mock(side_effect=ret_delete)
|
||||||
|
|
||||||
|
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
|
||||||
|
parsed_args)
|
||||||
|
calls = [
|
||||||
|
call(self.fake_agents[0].agent_id),
|
||||||
|
call(self.fake_agents[1].agent_id),
|
||||||
|
]
|
||||||
|
self.agents_mock.delete.assert_has_calls(calls)
|
||||||
|
|
||||||
|
|
||||||
class TestAgentList(TestAgent):
|
class TestAgentList(TestAgent):
|
||||||
|
|
||||||
|
3
releasenotes/notes/compute-agent-deff48988e81b30e.yaml
Normal file
3
releasenotes/notes/compute-agent-deff48988e81b30e.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- Command ``compute agent delete`` now supports deleting multiple agents.
|
Loading…
Reference in New Issue
Block a user