Skip to content

Commit a9f8133

Browse files
committed
Migrate server_groups to the new API
Moved the server_groups to the new API. Change-Id: Ied7bd6f56e277f0c5efcd5ba028765f9be65050f
1 parent 60dd6e6 commit a9f8133

4 files changed

Lines changed: 229 additions & 278 deletions

File tree

openstackclient/compute/v2/server_group.py

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import logging
1919

20-
from novaclient import api_versions
20+
from openstack import utils as sdk_utils
2121
from osc_lib.cli import format_columns
2222
from osc_lib.cli import parseractions
2323
from osc_lib.command import command
@@ -31,19 +31,24 @@
3131

3232

3333
_formatters = {
34-
'members': format_columns.ListColumn,
34+
'member_ids': format_columns.ListColumn,
3535
'policies': format_columns.ListColumn,
3636
'rules': format_columns.DictColumn,
3737
}
3838

3939

40-
def _get_columns(info):
41-
columns = list(info.keys())
42-
if 'metadata' in columns:
43-
# NOTE(RuiChen): The metadata of server group is always empty since API
44-
# compatible, so hide it in order to avoid confusion.
45-
columns.remove('metadata')
46-
return tuple(sorted(columns))
40+
def _get_server_group_columns(item, client):
41+
column_map = {'member_ids': 'members'}
42+
hidden_columns = ['metadata', 'location']
43+
44+
if sdk_utils.supports_microversion(client, '2.64'):
45+
hidden_columns.append('policies')
46+
else:
47+
hidden_columns.append('policy')
48+
hidden_columns.append('rules')
49+
50+
return utils.get_osc_show_columns_for_sdk_resource(
51+
item, column_map, hidden_columns)
4752

4853

4954
class CreateServerGroup(command.ShowOne):
@@ -54,7 +59,7 @@ def get_parser(self, prog_name):
5459
parser.add_argument(
5560
'name',
5661
metavar='<name>',
57-
help=_("New server group name")
62+
help=_("New server group name"),
5863
)
5964
parser.add_argument(
6065
'--policy',
@@ -87,42 +92,50 @@ def get_parser(self, prog_name):
8792
return parser
8893

8994
def take_action(self, parsed_args):
90-
compute_client = self.app.client_manager.compute
91-
info = {}
95+
compute_client = self.app.client_manager.sdk_connection.compute
9296

9397
if parsed_args.policy in ('soft-affinity', 'soft-anti-affinity'):
94-
if compute_client.api_version < api_versions.APIVersion('2.15'):
98+
if not sdk_utils.supports_microversion(compute_client, '2.15'):
9599
msg = _(
96100
'--os-compute-api-version 2.15 or greater is required to '
97101
'support the %s policy'
98102
)
99103
raise exceptions.CommandError(msg % parsed_args.policy)
100104

101105
if parsed_args.rules:
102-
if compute_client.api_version < api_versions.APIVersion('2.64'):
106+
if not sdk_utils.supports_microversion(compute_client, '2.64'):
103107
msg = _(
104108
'--os-compute-api-version 2.64 or greater is required to '
105109
'support the --rule option'
106110
)
107111
raise exceptions.CommandError(msg)
108112

109-
if compute_client.api_version < api_versions.APIVersion('2.64'):
110-
kwargs = {'policies': [parsed_args.policy]}
113+
if not sdk_utils.supports_microversion(compute_client, '2.64'):
114+
kwargs = {
115+
'name': parsed_args.name,
116+
'policies': [parsed_args.policy],
117+
}
111118
else:
112119
kwargs = {
120+
'name': parsed_args.name,
113121
'policy': parsed_args.policy,
114-
'rules': parsed_args.rules or None,
115122
}
116123

117-
server_group = compute_client.server_groups.create(
118-
name=parsed_args.name, **kwargs)
124+
if parsed_args.rules:
125+
kwargs['rules'] = parsed_args.rules
119126

120-
info.update(server_group._info)
127+
server_group = compute_client.create_server_group(**kwargs)
121128

122-
columns = _get_columns(info)
123-
data = utils.get_dict_properties(
124-
info, columns, formatters=_formatters)
125-
return columns, data
129+
display_columns, columns = _get_server_group_columns(
130+
server_group,
131+
compute_client,
132+
)
133+
data = utils.get_item_properties(
134+
server_group,
135+
columns,
136+
formatters=_formatters,
137+
)
138+
return display_columns, data
126139

127140

128141
class DeleteServerGroup(command.Command):
@@ -134,18 +147,17 @@ def get_parser(self, prog_name):
134147
'server_group',
135148
metavar='<server-group>',
136149
nargs='+',
137-
help=_("server group(s) to delete (name or ID)")
150+
help=_("server group(s) to delete (name or ID)"),
138151
)
139152
return parser
140153

141154
def take_action(self, parsed_args):
142-
compute_client = self.app.client_manager.compute
155+
compute_client = self.app.client_manager.sdk_connection.compute
143156
result = 0
144157
for group in parsed_args.server_group:
145158
try:
146-
group_obj = utils.find_resource(compute_client.server_groups,
147-
group)
148-
compute_client.server_groups.delete(group_obj.id)
159+
group_obj = compute_client.find_server_group(group)
160+
compute_client.delete_server_group(group_obj.id)
149161
# Catch all exceptions in order to avoid to block the next deleting
150162
except Exception as e:
151163
result += 1
@@ -169,13 +181,13 @@ def get_parser(self, prog_name):
169181
'--all-projects',
170182
action='store_true',
171183
default=False,
172-
help=_("Display information from all projects (admin only)")
184+
help=_("Display information from all projects (admin only)"),
173185
)
174186
parser.add_argument(
175187
'--long',
176188
action='store_true',
177189
default=False,
178-
help=_("List additional fields in output")
190+
help=_("List additional fields in output"),
179191
)
180192
# TODO(stephenfin): This should really be a --marker option, but alas
181193
# the API doesn't support that for some reason
@@ -204,7 +216,7 @@ def get_parser(self, prog_name):
204216
return parser
205217

206218
def take_action(self, parsed_args):
207-
compute_client = self.app.client_manager.compute
219+
compute_client = self.app.client_manager.sdk_connection.compute
208220

209221
kwargs = {}
210222

@@ -217,10 +229,10 @@ def take_action(self, parsed_args):
217229
if parsed_args.limit:
218230
kwargs['limit'] = parsed_args.limit
219231

220-
data = compute_client.server_groups.list(**kwargs)
232+
data = compute_client.server_groups(**kwargs)
221233

222234
policy_key = 'Policies'
223-
if compute_client.api_version >= api_versions.APIVersion("2.64"):
235+
if sdk_utils.supports_microversion(compute_client, '2.64'):
224236
policy_key = 'Policy'
225237

226238
columns = (
@@ -235,7 +247,7 @@ def take_action(self, parsed_args):
235247
)
236248
if parsed_args.long:
237249
columns += (
238-
'members',
250+
'member_ids',
239251
'project_id',
240252
'user_id',
241253
)
@@ -263,17 +275,18 @@ def get_parser(self, prog_name):
263275
parser.add_argument(
264276
'server_group',
265277
metavar='<server-group>',
266-
help=_("server group to display (name or ID)")
278+
help=_("server group to display (name or ID)"),
267279
)
268280
return parser
269281

270282
def take_action(self, parsed_args):
271-
compute_client = self.app.client_manager.compute
272-
group = utils.find_resource(compute_client.server_groups,
273-
parsed_args.server_group)
274-
info = {}
275-
info.update(group._info)
276-
columns = _get_columns(info)
277-
data = utils.get_dict_properties(
278-
info, columns, formatters=_formatters)
279-
return columns, data
283+
compute_client = self.app.client_manager.sdk_connection.compute
284+
group = compute_client.find_server_group(parsed_args.server_group)
285+
display_columns, columns = _get_server_group_columns(
286+
group,
287+
compute_client,
288+
)
289+
data = utils.get_item_properties(
290+
group, columns, formatters=_formatters
291+
)
292+
return display_columns, data

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def test_server_group_delete(self):
3333
cmd_output['name']
3434
)
3535
self.assertEqual(
36-
['affinity'],
37-
cmd_output['policies']
36+
'affinity',
37+
cmd_output['policy']
3838
)
3939

4040
cmd_output = json.loads(self.openstack(
@@ -47,8 +47,8 @@ def test_server_group_delete(self):
4747
cmd_output['name']
4848
)
4949
self.assertEqual(
50-
['anti-affinity'],
51-
cmd_output['policies']
50+
'anti-affinity',
51+
cmd_output['policy']
5252
)
5353

5454
del_output = self.openstack(
@@ -60,7 +60,7 @@ def test_server_group_show_and_list(self):
6060
name1 = uuid.uuid4().hex
6161
name2 = uuid.uuid4().hex
6262

63-
# test server gorup show
63+
# test server group show
6464
cmd_output = json.loads(self.openstack(
6565
'server group create -f json ' +
6666
'--policy affinity ' +
@@ -74,8 +74,8 @@ def test_server_group_show_and_list(self):
7474
cmd_output['name']
7575
)
7676
self.assertEqual(
77-
['affinity'],
78-
cmd_output['policies']
77+
'affinity',
78+
cmd_output['policy']
7979
)
8080

8181
cmd_output = json.loads(self.openstack(
@@ -91,8 +91,8 @@ def test_server_group_show_and_list(self):
9191
cmd_output['name']
9292
)
9393
self.assertEqual(
94-
['anti-affinity'],
95-
cmd_output['policies']
94+
'anti-affinity',
95+
cmd_output['policy']
9696
)
9797

9898
# test server group list
@@ -101,6 +101,6 @@ def test_server_group_show_and_list(self):
101101
names = [x["Name"] for x in cmd_output]
102102
self.assertIn(name1, names)
103103
self.assertIn(name2, names)
104-
policies = [x["Policies"] for x in cmd_output]
105-
self.assertIn(['affinity'], policies)
106-
self.assertIn(['anti-affinity'], policies)
104+
policies = [x["Policy"] for x in cmd_output]
105+
self.assertIn('affinity', policies)
106+
self.assertIn('anti-affinity', policies)

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

Lines changed: 29 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from novaclient import api_versions
2222
from openstack.compute.v2 import flavor as _flavor
2323
from openstack.compute.v2 import server
24+
from openstack.compute.v2 import server_group as _server_group
2425
from openstack.compute.v2 import server_interface as _server_interface
2526
from openstack.compute.v2 import service
2627
from openstack.compute.v2 import volume_attachment
@@ -1290,72 +1291,6 @@ def create_one_host(attrs=None):
12901291
return host_info
12911292

12921293

1293-
class FakeServerGroup(object):
1294-
"""Fake one server group"""
1295-
1296-
@staticmethod
1297-
def _create_one_server_group(attrs=None):
1298-
"""Create a fake server group
1299-
1300-
:param dict attrs:
1301-
A dictionary with all attributes
1302-
:return:
1303-
A FakeResource object, with id and other attributes
1304-
"""
1305-
if attrs is None:
1306-
attrs = {}
1307-
1308-
# Set default attributes.
1309-
server_group_info = {
1310-
'id': 'server-group-id-' + uuid.uuid4().hex,
1311-
'members': [],
1312-
'metadata': {},
1313-
'name': 'server-group-name-' + uuid.uuid4().hex,
1314-
'project_id': 'server-group-project-id-' + uuid.uuid4().hex,
1315-
'user_id': 'server-group-user-id-' + uuid.uuid4().hex,
1316-
}
1317-
1318-
# Overwrite default attributes.
1319-
server_group_info.update(attrs)
1320-
1321-
server_group = fakes.FakeResource(
1322-
info=copy.deepcopy(server_group_info),
1323-
loaded=True)
1324-
return server_group
1325-
1326-
@staticmethod
1327-
def create_one_server_group(attrs=None):
1328-
"""Create a fake server group
1329-
1330-
:param dict attrs:
1331-
A dictionary with all attributes
1332-
:return:
1333-
A FakeResource object, with id and other attributes
1334-
"""
1335-
if attrs is None:
1336-
attrs = {}
1337-
attrs.setdefault('policies', ['policy1', 'policy2'])
1338-
return FakeServerGroup._create_one_server_group(attrs)
1339-
1340-
1341-
class FakeServerGroupV264(object):
1342-
"""Fake one server group for API >= 2.64"""
1343-
1344-
@staticmethod
1345-
def create_one_server_group(attrs=None):
1346-
"""Create a fake server group
1347-
1348-
:param dict attrs:
1349-
A dictionary with all attributes
1350-
:return:
1351-
A FakeResource object, with id and other attributes
1352-
"""
1353-
if attrs is None:
1354-
attrs = {}
1355-
attrs.setdefault('policy', 'policy1')
1356-
return FakeServerGroup._create_one_server_group(attrs)
1357-
1358-
13591294
class FakeUsage(object):
13601295
"""Fake one or more usage."""
13611296

@@ -1860,6 +1795,34 @@ def create_sdk_volume_attachments(attrs=None, methods=None, count=2):
18601795
return volume_attachments
18611796

18621797

1798+
def create_one_server_group(attrs=None):
1799+
"""Create a fake server group
1800+
1801+
:param dict attrs:
1802+
A dictionary with all attributes
1803+
:return:
1804+
A fake ServerGroup object, with id and other attributes
1805+
"""
1806+
if attrs is None:
1807+
attrs = {}
1808+
1809+
# Set default attributes.
1810+
server_group_info = {
1811+
'id': 'server-group-id-' + uuid.uuid4().hex,
1812+
'member_ids': '',
1813+
'metadata': {},
1814+
'name': 'server-group-name-' + uuid.uuid4().hex,
1815+
'project_id': 'server-group-project-id-' + uuid.uuid4().hex,
1816+
'user_id': 'server-group-user-id-' + uuid.uuid4().hex,
1817+
}
1818+
1819+
# Overwrite default attributes.
1820+
server_group_info.update(attrs)
1821+
1822+
server_group = _server_group.ServerGroup(**server_group_info)
1823+
return server_group
1824+
1825+
18631826
def create_one_server_interface(attrs=None):
18641827
"""Create a fake SDK ServerInterface.
18651828

0 commit comments

Comments
 (0)