Skip to content

Commit 82170be

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "volume: Add v3-specific volume service module"
2 parents e3bd9a4 + 1ee3ef3 commit 82170be

File tree

3 files changed

+230
-3
lines changed

3 files changed

+230
-3
lines changed

openstackclient/tests/unit/volume/v3/test_service.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#
1414

1515
from cinderclient import api_versions
16+
from osc_lib import exceptions
1617

1718
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
1819
from openstackclient.volume.v3 import service
@@ -269,3 +270,151 @@ def test_service_list_with_backend_state(self):
269270
# checking if prohibited columns are present in output
270271
self.assertNotIn("Disabled Reason", columns)
271272
self.assertNotIn(backend_service.disabled_reason, tuple(data))
273+
274+
275+
class TestServiceSet(TestService):
276+
service = volume_fakes.create_one_service()
277+
278+
def setUp(self):
279+
super().setUp()
280+
281+
self.service_mock.enable.return_value = self.service
282+
self.service_mock.disable.return_value = self.service
283+
self.service_mock.disable_log_reason.return_value = self.service
284+
285+
self.cmd = service.SetService(self.app, None)
286+
287+
def test_service_set_nothing(self):
288+
arglist = [
289+
self.service.host,
290+
self.service.binary,
291+
]
292+
verifylist = [
293+
('host', self.service.host),
294+
('service', self.service.binary),
295+
]
296+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
297+
result = self.cmd.take_action(parsed_args)
298+
299+
self.service_mock.enable.assert_not_called()
300+
self.service_mock.disable.assert_not_called()
301+
self.service_mock.disable_log_reason.assert_not_called()
302+
self.assertIsNone(result)
303+
304+
def test_service_set_enable(self):
305+
arglist = [
306+
'--enable',
307+
self.service.host,
308+
self.service.binary,
309+
]
310+
verifylist = [
311+
('enable', True),
312+
('host', self.service.host),
313+
('service', self.service.binary),
314+
]
315+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
316+
317+
result = self.cmd.take_action(parsed_args)
318+
319+
self.service_mock.enable.assert_called_with(
320+
self.service.host, self.service.binary
321+
)
322+
self.service_mock.disable.assert_not_called()
323+
self.service_mock.disable_log_reason.assert_not_called()
324+
self.assertIsNone(result)
325+
326+
def test_service_set_disable(self):
327+
arglist = [
328+
'--disable',
329+
self.service.host,
330+
self.service.binary,
331+
]
332+
verifylist = [
333+
('disable', True),
334+
('host', self.service.host),
335+
('service', self.service.binary),
336+
]
337+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
338+
339+
result = self.cmd.take_action(parsed_args)
340+
341+
self.service_mock.disable.assert_called_with(
342+
self.service.host, self.service.binary
343+
)
344+
self.service_mock.enable.assert_not_called()
345+
self.service_mock.disable_log_reason.assert_not_called()
346+
self.assertIsNone(result)
347+
348+
def test_service_set_disable_with_reason(self):
349+
reason = 'earthquake'
350+
arglist = [
351+
'--disable',
352+
'--disable-reason',
353+
reason,
354+
self.service.host,
355+
self.service.binary,
356+
]
357+
verifylist = [
358+
('disable', True),
359+
('disable_reason', reason),
360+
('host', self.service.host),
361+
('service', self.service.binary),
362+
]
363+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
364+
365+
result = self.cmd.take_action(parsed_args)
366+
367+
self.service_mock.disable_log_reason.assert_called_with(
368+
self.service.host, self.service.binary, reason
369+
)
370+
self.assertIsNone(result)
371+
372+
def test_service_set_only_with_disable_reason(self):
373+
reason = 'earthquake'
374+
arglist = [
375+
'--disable-reason',
376+
reason,
377+
self.service.host,
378+
self.service.binary,
379+
]
380+
verifylist = [
381+
('disable_reason', reason),
382+
('host', self.service.host),
383+
('service', self.service.binary),
384+
]
385+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
386+
try:
387+
self.cmd.take_action(parsed_args)
388+
self.fail("CommandError should be raised.")
389+
except exceptions.CommandError as e:
390+
self.assertEqual(
391+
"Cannot specify option --disable-reason without "
392+
"--disable specified.",
393+
str(e),
394+
)
395+
396+
def test_service_set_enable_with_disable_reason(self):
397+
reason = 'earthquake'
398+
arglist = [
399+
'--enable',
400+
'--disable-reason',
401+
reason,
402+
self.service.host,
403+
self.service.binary,
404+
]
405+
verifylist = [
406+
('enable', True),
407+
('disable_reason', reason),
408+
('host', self.service.host),
409+
('service', self.service.binary),
410+
]
411+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
412+
try:
413+
self.cmd.take_action(parsed_args)
414+
self.fail("CommandError should be raised.")
415+
except exceptions.CommandError as e:
416+
self.assertEqual(
417+
"Cannot specify option --disable-reason without "
418+
"--disable specified.",
419+
str(e),
420+
)

openstackclient/volume/v3/service.py

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,36 @@
1515
"""Service action implementations"""
1616

1717
from cinderclient import api_versions
18+
from osc_lib.command import command
19+
from osc_lib import exceptions
1820
from osc_lib import utils
1921

20-
from openstackclient.volume.v2 import service as service_v2
22+
from openstackclient.i18n import _
2123

2224

23-
class ListService(service_v2.ListService):
25+
class ListService(command.Lister):
26+
_description = _("List service command")
27+
28+
def get_parser(self, prog_name):
29+
parser = super().get_parser(prog_name)
30+
parser.add_argument(
31+
"--host",
32+
metavar="<host>",
33+
help=_("List services on specified host (name only)"),
34+
)
35+
parser.add_argument(
36+
"--service",
37+
metavar="<service>",
38+
help=_("List only specified service (name only)"),
39+
)
40+
parser.add_argument(
41+
"--long",
42+
action="store_true",
43+
default=False,
44+
help=_("List additional fields in output"),
45+
)
46+
return parser
47+
2448
def take_action(self, parsed_args):
2549
service_client = self.app.client_manager.volume
2650

@@ -53,3 +77,57 @@ def take_action(self, parsed_args):
5377
for s in data
5478
),
5579
)
80+
81+
82+
class SetService(command.Command):
83+
_description = _("Set volume service properties")
84+
85+
def get_parser(self, prog_name):
86+
parser = super().get_parser(prog_name)
87+
parser.add_argument("host", metavar="<host>", help=_("Name of host"))
88+
parser.add_argument(
89+
"service",
90+
metavar="<service>",
91+
help=_("Name of service (Binary name)"),
92+
)
93+
enabled_group = parser.add_mutually_exclusive_group()
94+
enabled_group.add_argument(
95+
"--enable", action="store_true", help=_("Enable volume service")
96+
)
97+
enabled_group.add_argument(
98+
"--disable", action="store_true", help=_("Disable volume service")
99+
)
100+
parser.add_argument(
101+
"--disable-reason",
102+
metavar="<reason>",
103+
help=_(
104+
"Reason for disabling the service "
105+
"(should be used with --disable option)"
106+
),
107+
)
108+
return parser
109+
110+
def take_action(self, parsed_args):
111+
if parsed_args.disable_reason and not parsed_args.disable:
112+
msg = _(
113+
"Cannot specify option --disable-reason without "
114+
"--disable specified."
115+
)
116+
raise exceptions.CommandError(msg)
117+
118+
service_client = self.app.client_manager.volume
119+
if parsed_args.enable:
120+
service_client.services.enable(
121+
parsed_args.host, parsed_args.service
122+
)
123+
if parsed_args.disable:
124+
if parsed_args.disable_reason:
125+
service_client.services.disable_log_reason(
126+
parsed_args.host,
127+
parsed_args.service,
128+
parsed_args.disable_reason,
129+
)
130+
else:
131+
service_client.services.disable(
132+
parsed_args.host, parsed_args.service
133+
)

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ openstack.volume.v3 =
804804
volume_qos_unset = openstackclient.volume.v2.qos_specs:UnsetQos
805805

806806
volume_service_list = openstackclient.volume.v3.service:ListService
807-
volume_service_set = openstackclient.volume.v2.service:SetService
807+
volume_service_set = openstackclient.volume.v3.service:SetService
808808

809809
volume_transfer_request_accept = openstackclient.volume.v3.volume_transfer_request:AcceptTransferRequest
810810
volume_transfer_request_create = openstackclient.volume.v3.volume_transfer_request:CreateTransferRequest

0 commit comments

Comments
 (0)