Skip to content

Commit ab0b1fe

Browse files
committed
Validate 'server group create --policy' option
We were documenting that some of these policies were only supported with specific microversions, however, we weren't actually enforcing that, leading to a poor user experience. Correct this. Change-Id: Ic3c555226a220efd9b0f27edffccf6c4c95c2747 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent 375fe31 commit ab0b1fe

2 files changed

Lines changed: 63 additions & 5 deletions

File tree

openstackclient/compute/v2/server_group.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,37 @@ def get_parser(self, prog_name):
5656
parser.add_argument(
5757
'--policy',
5858
metavar='<policy>',
59+
choices=[
60+
'affinity',
61+
'anti-affinity',
62+
'soft-affinity',
63+
'soft-anti-affinity',
64+
],
5965
default='affinity',
60-
help=_("Add a policy to <name> "
61-
"('affinity' or 'anti-affinity', "
62-
"defaults to 'affinity'). Specify --os-compute-api-version "
63-
"2.15 or higher for the 'soft-affinity' or "
64-
"'soft-anti-affinity' policy.")
66+
help=_(
67+
"Add a policy to <name> "
68+
"Specify --os-compute-api-version 2.15 or higher for the "
69+
"'soft-affinity' or 'soft-anti-affinity' policy."
70+
)
6571
)
6672
return parser
6773

6874
def take_action(self, parsed_args):
6975
compute_client = self.app.client_manager.compute
7076
info = {}
7177

78+
if parsed_args.policy in ('soft-affinity', 'soft-anti-affinity'):
79+
if compute_client.api_version < api_versions.APIVersion('2.15'):
80+
msg = _(
81+
'--os-compute-api-version 2.15 or greater is required to '
82+
'support the %s policy'
83+
)
84+
raise exceptions.CommandError(msg % parsed_args.policy)
85+
7286
policy_arg = {'policies': [parsed_args.policy]}
7387
if compute_client.api_version >= api_versions.APIVersion("2.64"):
7488
policy_arg = {'policy': parsed_args.policy}
89+
7590
server_group = compute_client.server_groups.create(
7691
name=parsed_args.name, **policy_arg)
7792

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,28 @@ def setUp(self):
9090
self.cmd = server_group.CreateServerGroup(self.app, None)
9191

9292
def test_server_group_create(self):
93+
arglist = [
94+
'--policy', 'anti-affinity',
95+
'affinity_group',
96+
]
97+
verifylist = [
98+
('policy', 'anti-affinity'),
99+
('name', 'affinity_group'),
100+
]
101+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
102+
columns, data = self.cmd.take_action(parsed_args)
103+
self.server_groups_mock.create.assert_called_once_with(
104+
name=parsed_args.name,
105+
policies=[parsed_args.policy],
106+
)
107+
108+
self.assertEqual(self.columns, columns)
109+
self.assertEqual(self.data, data)
110+
111+
def test_server_group_create_with_soft_policies(self):
112+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
113+
'2.15')
114+
93115
arglist = [
94116
'--policy', 'soft-anti-affinity',
95117
'affinity_group',
@@ -108,6 +130,27 @@ def test_server_group_create(self):
108130
self.assertEqual(self.columns, columns)
109131
self.assertEqual(self.data, data)
110132

133+
def test_server_group_create_with_soft_policies_pre_v215(self):
134+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
135+
'2.14')
136+
137+
arglist = [
138+
'--policy', 'soft-anti-affinity',
139+
'affinity_group',
140+
]
141+
verifylist = [
142+
('policy', 'soft-anti-affinity'),
143+
('name', 'affinity_group'),
144+
]
145+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
146+
ex = self.assertRaises(
147+
exceptions.CommandError,
148+
self.cmd.take_action,
149+
parsed_args)
150+
self.assertIn(
151+
'--os-compute-api-version 2.15 or greater is required',
152+
str(ex))
153+
111154
def test_server_group_create_v264(self):
112155
self.app.client_manager.compute.api_version = api_versions.APIVersion(
113156
'2.64')

0 commit comments

Comments
 (0)