Skip to content

Commit 728caef

Browse files
committed
Add support for nova's unpin-az microversion 104
Generated-By: Claude Opus 4.6 Depends-On: https://review.opendev.org/c/openstack/nova/+/990682 Change-Id: I5da2a6c945b2885e2fe427e3496615bf312cb8ae Signed-off-by: Dan Smith <dansmith@redhat.com>
1 parent 33dadce commit 728caef

2 files changed

Lines changed: 125 additions & 0 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4677,6 +4677,16 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
46774677
'(supported by --os-compute-api-version 2.90 or above)'
46784678
),
46794679
)
4680+
parser.add_argument(
4681+
'--pinned-availability-zone',
4682+
metavar='<availability-zone>',
4683+
help=_(
4684+
'Pin the server to the given availability zone. '
4685+
'The server must currently be in the given zone. '
4686+
'To unpin, use "server unset --pinned-availability-zone" '
4687+
'(supported by --os-compute-api-version 2.104 or above)'
4688+
),
4689+
)
46804690
return parser
46814691

46824692
@staticmethod
@@ -4723,6 +4733,14 @@ def take_action(self, parsed_args: argparse.Namespace) -> None:
47234733
)
47244734
raise exceptions.CommandError(msg)
47254735

4736+
if parsed_args.pinned_availability_zone:
4737+
if not sdk_utils.supports_microversion(compute_client, '2.104'):
4738+
msg = _(
4739+
'--os-compute-api-version 2.104 or greater is required '
4740+
'to support the --pinned-availability-zone option'
4741+
)
4742+
raise exceptions.CommandError(msg)
4743+
47264744
update_kwargs = {}
47274745

47284746
if parsed_args.name:
@@ -4734,6 +4752,11 @@ def take_action(self, parsed_args: argparse.Namespace) -> None:
47344752
if parsed_args.hostname:
47354753
update_kwargs['hostname'] = parsed_args.hostname
47364754

4755+
if parsed_args.pinned_availability_zone:
4756+
update_kwargs['pinned_availability_zone'] = (
4757+
parsed_args.pinned_availability_zone
4758+
)
4759+
47374760
if update_kwargs:
47384761
compute_client.update_server(server, **update_kwargs)
47394762

@@ -5330,6 +5353,15 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
53305353
'(supported by --os-compute-api-version 2.26 or above)'
53315354
),
53325355
)
5356+
parser.add_argument(
5357+
'--pinned-availability-zone',
5358+
dest='pinned_availability_zone',
5359+
action='store_true',
5360+
help=_(
5361+
'Unpin the server from its availability zone '
5362+
'(supported by --os-compute-api-version 2.104 or above)'
5363+
),
5364+
)
53335365
return parser
53345366

53355367
def take_action(self, parsed_args: argparse.Namespace) -> None:
@@ -5354,6 +5386,16 @@ def take_action(self, parsed_args: argparse.Namespace) -> None:
53545386

53555387
compute_client.update_server(server, description="")
53565388

5389+
if parsed_args.pinned_availability_zone:
5390+
if not sdk_utils.supports_microversion(compute_client, '2.104'):
5391+
msg = _(
5392+
'--os-compute-api-version 2.104 or greater is required '
5393+
'to support the --pinned-availability-zone option'
5394+
)
5395+
raise exceptions.CommandError(msg)
5396+
5397+
compute_client.update_server(server, pinned_availability_zone=None)
5398+
53575399
if parsed_args.tags or parsed_args.all_tags:
53585400
if not sdk_utils.supports_microversion(compute_client, '2.26'):
53595401
msg = _(

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8605,6 +8605,49 @@ def test_server_set_with_hostname_pre_v290(self):
86058605
exceptions.CommandError, self.cmd.take_action, parsed_args
86068606
)
86078607

8608+
def test_server_set_with_pinned_availability_zone(self):
8609+
self.set_compute_api_version('2.104')
8610+
8611+
arglist = [
8612+
'--pinned-availability-zone',
8613+
'az1',
8614+
self.server.id,
8615+
]
8616+
verifylist = [
8617+
('pinned_availability_zone', 'az1'),
8618+
('server', self.server.id),
8619+
]
8620+
8621+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8622+
result = self.cmd.take_action(parsed_args)
8623+
8624+
self.compute_client.update_server.assert_called_once_with(
8625+
self.server, pinned_availability_zone='az1'
8626+
)
8627+
self.compute_client.set_server_metadata.assert_not_called()
8628+
self.compute_client.reset_server_state.assert_not_called()
8629+
self.compute_client.change_server_password.assert_not_called()
8630+
self.compute_client.clear_server_password.assert_not_called()
8631+
self.compute_client.add_tag_to_server.assert_not_called()
8632+
self.assertIsNone(result)
8633+
8634+
def test_server_set_with_pinned_availability_zone_pre_v2104(self):
8635+
self.set_compute_api_version('2.103')
8636+
8637+
arglist = [
8638+
'--pinned-availability-zone',
8639+
'az1',
8640+
self.server.id,
8641+
]
8642+
verifylist = [
8643+
('pinned_availability_zone', 'az1'),
8644+
('server', self.server.id),
8645+
]
8646+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
8647+
self.assertRaises(
8648+
exceptions.CommandError, self.cmd.take_action, parsed_args
8649+
)
8650+
86088651

86098652
class TestServerShelve(TestServer):
86108653
def setUp(self):
@@ -9408,6 +9451,46 @@ def test_server_unset_with_tag_pre_v226(self):
94089451
'--os-compute-api-version 2.26 or greater is required', str(ex)
94099452
)
94109453

9454+
def test_server_unset_with_pinned_availability_zone(self):
9455+
self.set_compute_api_version('2.104')
9456+
9457+
arglist = [
9458+
'--pinned-availability-zone',
9459+
self.server.id,
9460+
]
9461+
verifylist = [
9462+
('pinned_availability_zone', True),
9463+
('server', self.server.id),
9464+
]
9465+
9466+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
9467+
result = self.cmd.take_action(parsed_args)
9468+
9469+
self.compute_client.update_server.assert_called_once_with(
9470+
self.server, pinned_availability_zone=None
9471+
)
9472+
self.assertIsNone(result)
9473+
9474+
def test_server_unset_with_pinned_availability_zone_pre_v2104(self):
9475+
self.set_compute_api_version('2.103')
9476+
9477+
arglist = [
9478+
'--pinned-availability-zone',
9479+
self.server.id,
9480+
]
9481+
verifylist = [
9482+
('pinned_availability_zone', True),
9483+
('server', self.server.id),
9484+
]
9485+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
9486+
9487+
ex = self.assertRaises(
9488+
exceptions.CommandError, self.cmd.take_action, parsed_args
9489+
)
9490+
self.assertIn(
9491+
'--os-compute-api-version 2.104 or greater is required', str(ex)
9492+
)
9493+
94119494

94129495
class TestServerUnshelve(TestServer):
94139496
def setUp(self):

0 commit comments

Comments
 (0)