Skip to content

Commit 93db7f5

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Support multiple argument for compute agent delete command"
2 parents 1c097b7 + 909bab1 commit 93db7f5

4 files changed

Lines changed: 81 additions & 11 deletions

File tree

doc/source/command-objects/compute-agent.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,17 @@ Create compute agent
4444
compute agent delete
4545
--------------------
4646

47-
Delete compute agent command
47+
Delete compute agent(s)
4848

4949
.. program:: compute agent delete
5050
.. code:: bash
5151
52-
os compute agent delete <id>
52+
os compute agent delete <id> [<id> ...]
5353
5454
.. _compute_agent-delete:
5555
.. describe:: <id>
5656

57-
ID of agent to delete
57+
ID of agent(s) to delete
5858

5959
compute agent list
6060
------------------

openstackclient/compute/v2/agent.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import six
1919

2020
from openstackclient.common import command
21+
from openstackclient.common import exceptions
2122
from openstackclient.common import utils
2223
from openstackclient.i18n import _
2324

@@ -75,20 +76,35 @@ def take_action(self, parsed_args):
7576

7677

7778
class DeleteAgent(command.Command):
78-
"""Delete compute agent command"""
79+
"""Delete compute agent(s)"""
7980

8081
def get_parser(self, prog_name):
8182
parser = super(DeleteAgent, self).get_parser(prog_name)
8283
parser.add_argument(
8384
"id",
8485
metavar="<id>",
85-
help=_("ID of agent to delete")
86+
nargs='+',
87+
help=_("ID of agent(s) to delete")
8688
)
8789
return parser
8890

8991
def take_action(self, parsed_args):
9092
compute_client = self.app.client_manager.compute
91-
compute_client.agents.delete(parsed_args.id)
93+
result = 0
94+
for id in parsed_args.id:
95+
try:
96+
compute_client.agents.delete(id)
97+
except Exception as e:
98+
result += 1
99+
self.app.log.error(_("Failed to delete agent with "
100+
"ID '%(id)s': %(e)s")
101+
% {'id': id, 'e': e})
102+
103+
if result > 0:
104+
total = len(parsed_args.id)
105+
msg = (_("%(result)s of %(total)s agents failed "
106+
"to delete.") % {'result': result, 'total': total})
107+
raise exceptions.CommandError(msg)
92108

93109

94110
class ListAgent(command.Lister):

openstackclient/tests/compute/v2/test_agent.py

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
# under the License.
1414
#
1515

16+
import mock
17+
18+
from mock import call
19+
from openstackclient.common import exceptions
1620
from openstackclient.compute.v2 import agent
1721
from openstackclient.tests.compute.v2 import fakes as compute_fakes
1822

@@ -89,26 +93,73 @@ def test_agent_create(self):
8993

9094
class TestAgentDelete(TestAgent):
9195

96+
fake_agents = compute_fakes.FakeAgent.create_agents(count=2)
97+
9298
def setUp(self):
9399
super(TestAgentDelete, self).setUp()
94100

95-
self.agents_mock.get.return_value = self.fake_agent
101+
self.agents_mock.get.return_value = self.fake_agents
96102
self.cmd = agent.DeleteAgent(self.app, None)
97103

98-
def test_one_agent_delete(self):
104+
def test_delete_one_agent(self):
99105
arglist = [
100-
'test'
106+
self.fake_agents[0].agent_id
101107
]
102108

103109
verifylist = [
104-
('id', 'test'),
110+
('id', [self.fake_agents[0].agent_id]),
105111
]
106112

107113
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
108114
result = self.cmd.take_action(parsed_args)
109-
self.agents_mock.delete.assert_called_with(parsed_args.id)
115+
self.agents_mock.delete.assert_called_with(
116+
self.fake_agents[0].agent_id)
117+
self.assertIsNone(result)
118+
119+
def test_delete_multiple_agents(self):
120+
arglist = []
121+
for n in self.fake_agents:
122+
arglist.append(n.agent_id)
123+
verifylist = [
124+
('id', arglist),
125+
]
126+
127+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
128+
result = self.cmd.take_action(parsed_args)
129+
130+
calls = []
131+
for n in self.fake_agents:
132+
calls.append(call(n.agent_id))
133+
self.agents_mock.delete.assert_has_calls(calls)
110134
self.assertIsNone(result)
111135

136+
def test_delete_multiple_agents_exception(self):
137+
arglist = [
138+
self.fake_agents[0].agent_id,
139+
self.fake_agents[1].agent_id,
140+
'x-y-z',
141+
]
142+
verifylist = [
143+
('id', arglist),
144+
]
145+
146+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
147+
148+
ret_delete = [
149+
None,
150+
None,
151+
exceptions.NotFound('404')
152+
]
153+
self.agents_mock.delete = mock.Mock(side_effect=ret_delete)
154+
155+
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
156+
parsed_args)
157+
calls = [
158+
call(self.fake_agents[0].agent_id),
159+
call(self.fake_agents[1].agent_id),
160+
]
161+
self.agents_mock.delete.assert_has_calls(calls)
162+
112163

113164
class TestAgentList(TestAgent):
114165

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
upgrade:
3+
- Command ``compute agent delete`` now supports deleting multiple agents.

0 commit comments

Comments
 (0)