Skip to content

Commit 4e9181a

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Switch server lock, unlock to sdk"
2 parents 55f2819 + ce8171b commit 4e9181a

3 files changed

Lines changed: 99 additions & 87 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2815,24 +2815,33 @@ def get_parser(self, prog_name):
28152815
'--reason',
28162816
metavar='<reason>',
28172817
default=None,
2818-
help=_("Reason for locking the server(s). Requires "
2819-
"``--os-compute-api-version`` 2.73 or greater.")
2818+
help=_(
2819+
'Reason for locking the server(s) '
2820+
'(supported by --os-compute-api-version 2.73 or above)'
2821+
),
28202822
)
28212823
return parser
28222824

28232825
def take_action(self, parsed_args):
2826+
compute_client = self.app.client_manager.sdk_connection.compute
2827+
2828+
kwargs = {}
2829+
if parsed_args.reason:
2830+
if not sdk_utils.supports_microversion(compute_client, '2.73'):
2831+
msg = _(
2832+
'--os-compute-api-version 2.73 or greater is required to '
2833+
'use the --reason option'
2834+
)
2835+
raise exceptions.CommandError(msg)
2836+
2837+
kwargs['locked_reason'] = parsed_args.reason
28242838

2825-
compute_client = self.app.client_manager.compute
2826-
support_reason = compute_client.api_version >= api_versions.APIVersion(
2827-
'2.73')
2828-
if not support_reason and parsed_args.reason:
2829-
msg = _('--os-compute-api-version 2.73 or greater is required to '
2830-
'use the --reason option.')
2831-
raise exceptions.CommandError(msg)
28322839
for server in parsed_args.server:
2833-
serv = utils.find_resource(compute_client.servers, server)
2834-
(serv.lock(reason=parsed_args.reason) if support_reason
2835-
else serv.lock())
2840+
server_id = compute_client.find_server(
2841+
server,
2842+
ignore_missing=False
2843+
).id
2844+
compute_client.lock_server(server_id, **kwargs)
28362845

28372846

28382847
# FIXME(dtroyer): Here is what I want, how with argparse/cliff?
@@ -4654,7 +4663,7 @@ class UnlockServer(command.Command):
46544663
_description = _("Unlock server(s)")
46554664

46564665
def get_parser(self, prog_name):
4657-
parser = super(UnlockServer, self).get_parser(prog_name)
4666+
parser = super().get_parser(prog_name)
46584667
parser.add_argument(
46594668
'server',
46604669
metavar='<server>',
@@ -4664,12 +4673,13 @@ def get_parser(self, prog_name):
46644673
return parser
46654674

46664675
def take_action(self, parsed_args):
4667-
compute_client = self.app.client_manager.compute
4676+
compute_client = self.app.client_manager.sdk_connection.compute
46684677
for server in parsed_args.server:
4669-
utils.find_resource(
4670-
compute_client.servers,
4678+
server_id = compute_client.find_server(
46714679
server,
4672-
).unlock()
4680+
ignore_missing=False,
4681+
).id
4682+
compute_client.unlock_server(server_id)
46734683

46744684

46754685
class UnpauseServer(command.Command):

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 68 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,7 @@ def run_method_with_servers(self, method_name, server_count):
196196

197197
for s in servers:
198198
method = getattr(s, method_name)
199-
if method_name == 'lock':
200-
version = self.app.client_manager.compute.api_version
201-
if version >= api_versions.APIVersion('2.73'):
202-
method.assert_called_with(reason=None)
203-
elif method_name == 'unshelve':
199+
if method_name == 'unshelve':
204200
version = self.app.client_manager.compute.api_version
205201
if version >= api_versions.APIVersion('2.91'):
206202
method.assert_called_with(availability_zone=_sentinel,
@@ -5440,87 +5436,94 @@ def test_server_list_v269_with_partial_constructs(self):
54405436
class TestServerLock(TestServer):
54415437

54425438
def setUp(self):
5443-
super(TestServerLock, self).setUp()
5439+
super().setUp()
5440+
5441+
self.server = compute_fakes.FakeServer.create_one_sdk_server()
5442+
5443+
self.app.client_manager.sdk_connection = mock.Mock()
5444+
self.app.client_manager.sdk_connection.compute = mock.Mock()
5445+
self.sdk_client = self.app.client_manager.sdk_connection.compute
5446+
5447+
self.sdk_client.find_server.return_value = self.server
5448+
self.sdk_client.lock_server.return_value = None
54445449

54455450
# Get the command object to test
54465451
self.cmd = server.LockServer(self.app, None)
54475452

5448-
# Set methods to be tested.
5449-
self.methods = {
5450-
'lock': None,
5451-
}
5452-
5453-
def test_server_lock_one_server(self):
5454-
self.run_method_with_servers('lock', 1)
5453+
@mock.patch.object(sdk_utils, 'supports_microversion')
5454+
def test_server_lock(self, sm_mock):
5455+
sm_mock.return_value = False
5456+
self.run_method_with_sdk_servers('lock_server', 1)
54555457

5456-
def test_server_lock_multi_servers(self):
5457-
self.run_method_with_servers('lock', 3)
5458+
@mock.patch.object(sdk_utils, 'supports_microversion')
5459+
def test_server_lock_multi_servers(self, sm_mock):
5460+
sm_mock.return_value = False
5461+
self.run_method_with_sdk_servers('lock_server', 3)
54585462

5459-
def test_server_lock_with_reason(self):
5460-
server = compute_fakes.FakeServer.create_one_server()
5463+
@mock.patch.object(sdk_utils, 'supports_microversion')
5464+
def test_server_lock_with_reason(self, sm_mock):
5465+
sm_mock.return_value = True
54615466
arglist = [
5462-
server.id,
5463-
'--reason', "blah",
5467+
self.server.id,
5468+
'--reason', 'blah',
54645469
]
54655470
verifylist = [
5466-
('reason', "blah"),
5467-
('server', [server.id])
5471+
('server', [self.server.id]),
5472+
('reason', 'blah'),
54685473
]
54695474
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5470-
ex = self.assertRaises(exceptions.CommandError,
5471-
self.cmd.take_action,
5472-
parsed_args)
5473-
self.assertIn(
5474-
'--os-compute-api-version 2.73 or greater is required', str(ex))
5475-
5476-
5477-
class TestServerLockV273(TestServerLock):
5478-
5479-
def setUp(self):
5480-
super(TestServerLockV273, self).setUp()
5481-
5482-
self.server = compute_fakes.FakeServer.create_one_server(
5483-
methods=self.methods)
5484-
5485-
# This is the return value for utils.find_resource()
5486-
self.servers_mock.get.return_value = self.server
5487-
5488-
self.app.client_manager.compute.api_version = \
5489-
api_versions.APIVersion('2.73')
5490-
5491-
# Get the command object to test
5492-
self.cmd = server.LockServer(self.app, None)
5475+
self.cmd.take_action(parsed_args)
5476+
self.sdk_client.find_server.assert_called_with(
5477+
self.server.id,
5478+
ignore_missing=False,
5479+
)
5480+
self.sdk_client.lock_server.assert_called_with(
5481+
self.server.id,
5482+
locked_reason="blah",
5483+
)
54935484

5494-
def test_server_lock_with_reason(self):
5485+
@mock.patch.object(sdk_utils, 'supports_microversion')
5486+
def test_server_lock_with_reason_multi_servers(self, sm_mock):
5487+
sm_mock.return_value = True
5488+
server2 = compute_fakes.FakeServer.create_one_sdk_server()
54955489
arglist = [
5496-
self.server.id,
5497-
'--reason', "blah",
5490+
self.server.id, server2.id,
5491+
'--reason', 'choo..choo',
54985492
]
54995493
verifylist = [
5500-
('reason', "blah"),
5501-
('server', [self.server.id])
5494+
('server', [self.server.id, server2.id]),
5495+
('reason', 'choo..choo'),
55025496
]
55035497
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
55045498
self.cmd.take_action(parsed_args)
5505-
self.servers_mock.get.assert_called_with(self.server.id)
5506-
self.server.lock.assert_called_with(reason="blah")
5499+
self.assertEqual(2, self.sdk_client.find_server.call_count)
5500+
self.sdk_client.lock_server.assert_called_with(
5501+
self.server.id,
5502+
locked_reason="choo..choo",
5503+
)
5504+
self.assertEqual(2, self.sdk_client.lock_server.call_count)
55075505

5508-
def test_server_lock_multi_servers_with_reason(self):
5509-
server2 = compute_fakes.FakeServer.create_one_server(
5510-
methods=self.methods)
5506+
@mock.patch.object(sdk_utils, 'supports_microversion')
5507+
def test_server_lock_with_reason_pre_v273(self, sm_mock):
5508+
sm_mock.return_value = False
5509+
server = compute_fakes.FakeServer.create_one_sdk_server()
55115510
arglist = [
5512-
self.server.id, server2.id,
5513-
'--reason', "choo..choo",
5511+
server.id,
5512+
'--reason', "blah",
55145513
]
55155514
verifylist = [
5516-
('reason', "choo..choo"),
5517-
('server', [self.server.id, server2.id])
5515+
('server', [server.id]),
5516+
('reason', "blah"),
55185517
]
55195518
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5520-
self.cmd.take_action(parsed_args)
5521-
self.assertEqual(2, self.servers_mock.get.call_count)
5522-
self.server.lock.assert_called_with(reason="choo..choo")
5523-
self.assertEqual(2, self.server.lock.call_count)
5519+
ex = self.assertRaises(
5520+
exceptions.CommandError,
5521+
self.cmd.take_action,
5522+
parsed_args,
5523+
)
5524+
self.assertIn(
5525+
'--os-compute-api-version 2.73 or greater is required', str(ex),
5526+
)
55245527

55255528

55265529
class TestServerMigrate(TestServer):
@@ -8317,21 +8320,16 @@ def test_server_suspend_multi_servers(self):
83178320
class TestServerUnlock(TestServer):
83188321

83198322
def setUp(self):
8320-
super(TestServerUnlock, self).setUp()
8323+
super().setUp()
83218324

83228325
# Get the command object to test
83238326
self.cmd = server.UnlockServer(self.app, None)
83248327

8325-
# Set methods to be tested.
8326-
self.methods = {
8327-
'unlock': None,
8328-
}
8329-
83308328
def test_server_unlock_one_server(self):
8331-
self.run_method_with_servers('unlock', 1)
8329+
self.run_method_with_sdk_servers('unlock_server', 1)
83328330

83338331
def test_server_unlock_multi_servers(self):
8334-
self.run_method_with_servers('unlock', 3)
8332+
self.run_method_with_sdk_servers('unlock_server', 3)
83358333

83368334

83378335
class TestServerUnpause(TestServer):
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
The ``server lock`` and ``server unlock`` commands now use SDK.

0 commit comments

Comments
 (0)