Skip to content

Commit ce8171b

Browse files
suneethravi25stephenfin
authored andcommitted
Switch server lock, unlock to sdk
Switch server lock commands from novaclient to SDK. Change-Id: I042db99c9d7a0d8d207f8cdf69d786bd4fe904e7 Depends-On: https://review.opendev.org/c/openstack/openstacksdk/+/867890
1 parent b2c9a4c commit ce8171b

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?
@@ -4660,7 +4669,7 @@ class UnlockServer(command.Command):
46604669
_description = _("Unlock server(s)")
46614670

46624671
def get_parser(self, prog_name):
4663-
parser = super(UnlockServer, self).get_parser(prog_name)
4672+
parser = super().get_parser(prog_name)
46644673
parser.add_argument(
46654674
'server',
46664675
metavar='<server>',
@@ -4670,12 +4679,13 @@ def get_parser(self, prog_name):
46704679
return parser
46714680

46724681
def take_action(self, parsed_args):
4673-
compute_client = self.app.client_manager.compute
4682+
compute_client = self.app.client_manager.sdk_connection.compute
46744683
for server in parsed_args.server:
4675-
utils.find_resource(
4676-
compute_client.servers,
4684+
server_id = compute_client.find_server(
46774685
server,
4678-
).unlock()
4686+
ignore_missing=False,
4687+
).id
4688+
compute_client.unlock_server(server_id)
46794689

46804690

46814691
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,
@@ -5441,87 +5437,94 @@ def test_server_list_v269_with_partial_constructs(self):
54415437
class TestServerLock(TestServer):
54425438

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

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

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

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

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

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

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

55265529

55275530
class TestServerMigrate(TestServer):
@@ -8318,21 +8321,16 @@ def test_server_suspend_multi_servers(self):
83188321
class TestServerUnlock(TestServer):
83198322

83208323
def setUp(self):
8321-
super(TestServerUnlock, self).setUp()
8324+
super().setUp()
83228325

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

8326-
# Set methods to be tested.
8327-
self.methods = {
8328-
'unlock': None,
8329-
}
8330-
83318329
def test_server_unlock_one_server(self):
8332-
self.run_method_with_servers('unlock', 1)
8330+
self.run_method_with_sdk_servers('unlock_server', 1)
83338331

83348332
def test_server_unlock_multi_servers(self):
8335-
self.run_method_with_servers('unlock', 3)
8333+
self.run_method_with_sdk_servers('unlock_server', 3)
83368334

83378335

83388336
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)