Skip to content

Commit 7458c61

Browse files
committed
Add "server group delete" command
Support compute v2 "server group delete" command in OSC. Implements: blueprint nova-server-group-support Partial-Bug: #1542171 Related-Bug: #1563301 Change-Id: I7d792d669b147b24dc774844cfc9dbacd60d017b
1 parent a06bb28 commit 7458c61

4 files changed

Lines changed: 134 additions & 0 deletions

File tree

doc/source/command-objects/server-group.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,19 @@ Create a new server group
2727
.. describe:: <name>
2828

2929
New server group name
30+
31+
server group delete
32+
-------------------
33+
34+
Delete an existing server group
35+
36+
.. program:: server group delete
37+
.. code-block:: bash
38+
39+
os server group delete
40+
<server-group> [<server-group> ...]
41+
42+
.. describe:: <server-group>
43+
44+
Server group(s) to delete (name or ID)
45+
(repeat to delete multiple server groups)

openstackclient/compute/v2/server_group.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"""Compute v2 Server Group action implementations"""
1717

1818
from openstackclient.common import command
19+
from openstackclient.common import exceptions
1920
from openstackclient.common import utils
2021

2122

@@ -66,3 +67,35 @@ def take_action(self, parsed_args):
6667
data = utils.get_dict_properties(info, columns,
6768
formatters=_formatters)
6869
return columns, data
70+
71+
72+
class DeleteServerGroup(command.Command):
73+
"""Delete an existing server group."""
74+
75+
def get_parser(self, prog_name):
76+
parser = super(DeleteServerGroup, self).get_parser(prog_name)
77+
parser.add_argument(
78+
'server_group',
79+
metavar='<server-group>',
80+
nargs='+',
81+
help='server group(s) to delete (name or ID)',
82+
)
83+
return parser
84+
85+
def take_action(self, parsed_args):
86+
compute_client = self.app.client_manager.compute
87+
result = 0
88+
for group in parsed_args.server_group:
89+
try:
90+
group_obj = utils.find_resource(compute_client.server_groups,
91+
group)
92+
compute_client.server_groups.delete(group_obj.id)
93+
# Catch all exceptions in order to avoid to block the next deleting
94+
except Exception as e:
95+
result += 1
96+
self.app.log.error(e)
97+
98+
if result > 0:
99+
total = len(parsed_args.server_group)
100+
msg = "%s of %s server groups failed to delete." % (result, total)
101+
raise exceptions.CommandError(msg)

openstackclient/tests/compute/v2/test_server_group.py

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

16+
import mock
17+
18+
from openstackclient.common import exceptions
1619
from openstackclient.common import utils
1720
from openstackclient.compute.v2 import server_group
1821
from openstackclient.tests.compute.v2 import fakes as compute_fakes
@@ -106,3 +109,84 @@ def test_server_group_create_no_policy(self):
106109
self.cmd,
107110
arglist,
108111
verifylist)
112+
113+
114+
class TestServerGroupDelete(TestServerGroup):
115+
116+
def setUp(self):
117+
super(TestServerGroupDelete, self).setUp()
118+
119+
self.server_groups_mock.get.return_value = self.fake_server_group
120+
self.cmd = server_group.DeleteServerGroup(self.app, None)
121+
122+
def test_server_group_delete(self):
123+
arglist = [
124+
'affinity_group',
125+
]
126+
verifylist = [
127+
('server_group', ['affinity_group']),
128+
]
129+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
130+
result = self.cmd.take_action(parsed_args)
131+
self.server_groups_mock.get.assert_called_once_with('affinity_group')
132+
self.server_groups_mock.delete.assert_called_once_with(
133+
self.fake_server_group.id
134+
)
135+
self.assertIsNone(result)
136+
137+
def test_server_group_multiple_delete(self):
138+
arglist = [
139+
'affinity_group',
140+
'anti_affinity_group'
141+
]
142+
verifylist = [
143+
('server_group', ['affinity_group', 'anti_affinity_group']),
144+
]
145+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
146+
result = self.cmd.take_action(parsed_args)
147+
self.server_groups_mock.get.assert_any_call('affinity_group')
148+
self.server_groups_mock.get.assert_any_call('anti_affinity_group')
149+
self.server_groups_mock.delete.assert_called_with(
150+
self.fake_server_group.id
151+
)
152+
self.assertEqual(2, self.server_groups_mock.get.call_count)
153+
self.assertEqual(2, self.server_groups_mock.delete.call_count)
154+
self.assertIsNone(result)
155+
156+
def test_server_group_delete_no_input(self):
157+
arglist = []
158+
verifylist = None
159+
self.assertRaises(tests_utils.ParserException,
160+
self.check_parser,
161+
self.cmd,
162+
arglist,
163+
verifylist)
164+
165+
def test_server_group_multiple_delete_with_exception(self):
166+
arglist = [
167+
'affinity_group',
168+
'anti_affinity_group'
169+
]
170+
verifylist = [
171+
('server_group', ['affinity_group', 'anti_affinity_group']),
172+
]
173+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
174+
find_mock_result = [self.fake_server_group, exceptions.CommandError]
175+
with mock.patch.object(utils, 'find_resource',
176+
side_effect=find_mock_result) as find_mock:
177+
try:
178+
self.cmd.take_action(parsed_args)
179+
self.fail('CommandError should be raised.')
180+
except exceptions.CommandError as e:
181+
self.assertEqual('1 of 2 server groups failed to delete.',
182+
str(e))
183+
184+
find_mock.assert_any_call(self.server_groups_mock,
185+
'affinity_group')
186+
find_mock.assert_any_call(self.server_groups_mock,
187+
'anti_affinity_group')
188+
189+
self.assertEqual(2, find_mock.call_count)
190+
self.server_groups_mock.delete.assert_called_once_with(
191+
self.fake_server_group.id
192+
)

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ openstack.compute.v2 =
132132
server_unshelve = openstackclient.compute.v2.server:UnshelveServer
133133

134134
server_group_create = openstackclient.compute.v2.server_group:CreateServerGroup
135+
server_group_delete = openstackclient.compute.v2.server_group:DeleteServerGroup
135136

136137
usage_list = openstackclient.compute.v2.usage:ListUsage
137138
usage_show = openstackclient.compute.v2.usage:ShowUsage

0 commit comments

Comments
 (0)