Skip to content

Commit a5c6470

Browse files
committed
compute: Add 'server group create --rule' option
This closes the remaining gap with the 2.64 compute API microversion. Change-Id: Ia42b23d813b7af6ddb1a41f4e9bdc8a6160b908c Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent bf834f6 commit a5c6470

3 files changed

Lines changed: 82 additions & 23 deletions

File tree

openstackclient/compute/v2/server_group.py

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from novaclient import api_versions
2121
from osc_lib.cli import format_columns
22+
from osc_lib.cli import parseractions
2223
from osc_lib.command import command
2324
from osc_lib import exceptions
2425
from osc_lib import utils
@@ -30,8 +31,9 @@
3031

3132

3233
_formatters = {
33-
'policies': format_columns.ListColumn,
3434
'members': format_columns.ListColumn,
35+
'policies': format_columns.ListColumn,
36+
'rules': format_columns.DictColumn,
3537
}
3638

3739

@@ -68,7 +70,19 @@ def get_parser(self, prog_name):
6870
"Add a policy to <name> "
6971
"Specify --os-compute-api-version 2.15 or higher for the "
7072
"'soft-affinity' or 'soft-anti-affinity' policy."
71-
)
73+
),
74+
)
75+
parser.add_argument(
76+
'--rule',
77+
metavar='<key=value>',
78+
action=parseractions.KeyValueAction,
79+
default={},
80+
dest='rules',
81+
help=_(
82+
"A rule for the policy. Currently, only the "
83+
"'max_server_per_host' rule is supported for the "
84+
"'anti-affinity' policy."
85+
),
7286
)
7387
return parser
7488

@@ -84,12 +98,24 @@ def take_action(self, parsed_args):
8498
)
8599
raise exceptions.CommandError(msg % parsed_args.policy)
86100

87-
policy_arg = {'policies': [parsed_args.policy]}
88-
if compute_client.api_version >= api_versions.APIVersion("2.64"):
89-
policy_arg = {'policy': parsed_args.policy}
101+
if parsed_args.rules:
102+
if compute_client.api_version < api_versions.APIVersion('2.64'):
103+
msg = _(
104+
'--os-compute-api-version 2.64 or greater is required to '
105+
'support the --rule option'
106+
)
107+
raise exceptions.CommandError(msg)
108+
109+
if compute_client.api_version < api_versions.APIVersion('2.64'):
110+
kwargs = {'policies': [parsed_args.policy]}
111+
else:
112+
kwargs = {
113+
'policy': parsed_args.policy,
114+
'rules': parsed_args.rules or None,
115+
}
90116

91117
server_group = compute_client.server_groups.create(
92-
name=parsed_args.name, **policy_arg)
118+
name=parsed_args.name, **kwargs)
93119

94120
info.update(server_group._info)
95121

@@ -161,31 +187,33 @@ def take_action(self, parsed_args):
161187
if compute_client.api_version >= api_versions.APIVersion("2.64"):
162188
policy_key = 'Policy'
163189

190+
columns = (
191+
'id',
192+
'name',
193+
policy_key.lower(),
194+
)
195+
column_headers = (
196+
'ID',
197+
'Name',
198+
policy_key,
199+
)
164200
if parsed_args.long:
165-
column_headers = columns = (
166-
'ID',
167-
'Name',
168-
policy_key,
201+
columns += (
202+
'members',
203+
'project_id',
204+
'user_id',
205+
)
206+
column_headers += (
169207
'Members',
170208
'Project Id',
171209
'User Id',
172210
)
173-
else:
174-
column_headers = columns = (
175-
'ID',
176-
'Name',
177-
policy_key,
178-
)
179211

180212
return (
181213
column_headers,
182214
(
183215
utils.get_item_properties(
184-
s, columns,
185-
formatters={
186-
'Policies': format_columns.ListColumn,
187-
'Members': format_columns.ListColumn,
188-
}
216+
s, columns, formatters=_formatters,
189217
) for s in data
190218
),
191219
)

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,28 +152,55 @@ def test_server_group_create_with_soft_policies_pre_v215(self):
152152
'--os-compute-api-version 2.15 or greater is required',
153153
str(ex))
154154

155-
def test_server_group_create_v264(self):
155+
def test_server_group_create_with_rules(self):
156156
self.app.client_manager.compute.api_version = api_versions.APIVersion(
157157
'2.64')
158158

159159
arglist = [
160160
'--policy', 'soft-anti-affinity',
161+
'--rule', 'max_server_per_host=2',
161162
'affinity_group',
162163
]
163164
verifylist = [
164165
('policy', 'soft-anti-affinity'),
166+
('rules', {'max_server_per_host': '2'}),
165167
('name', 'affinity_group'),
166168
]
167169
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
168170
columns, data = self.cmd.take_action(parsed_args)
169171
self.server_groups_mock.create.assert_called_once_with(
170172
name=parsed_args.name,
171-
policy=parsed_args.policy,
173+
policy=parsed_args.policy, # should be 'policy', not 'policies'
174+
rules=parsed_args.rules,
172175
)
173176

174177
self.assertCountEqual(self.columns, columns)
175178
self.assertCountEqual(self.data, data)
176179

180+
def test_server_group_create_with_rules_pre_v264(self):
181+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
182+
'2.63')
183+
184+
arglist = [
185+
'--policy', 'soft-anti-affinity',
186+
'--rule', 'max_server_per_host=2',
187+
'affinity_group',
188+
]
189+
verifylist = [
190+
('policy', 'soft-anti-affinity'),
191+
('rules', {'max_server_per_host': '2'}),
192+
('name', 'affinity_group'),
193+
]
194+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
195+
196+
ex = self.assertRaises(
197+
exceptions.CommandError,
198+
self.cmd.take_action,
199+
parsed_args)
200+
self.assertIn(
201+
'--os-compute-api-version 2.64 or greater is required',
202+
str(ex))
203+
177204

178205
class TestServerGroupDelete(TestServerGroup):
179206

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
Add support for ``--rule`` option for ``server group create``.

0 commit comments

Comments
 (0)