Skip to content

Commit f200799

Browse files
yongli-hestephenfin
authored andcommitted
compute: Add 'server show --topology' option
Add support for compute microversion 2.78 by adding a '--topology' option to 'openstack server show' command that retrieves server NUMA information. Change-Id: Ie22979df2ea9082ca64a4d43b571bd4025684825
1 parent a5c6470 commit f200799

4 files changed

Lines changed: 92 additions & 9 deletions

File tree

doc/source/cli/data/nova.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ start,server start,Start the server(s).
121121
stop,server stop,Stop the server(s).
122122
suspend,server suspend,Suspend a server.
123123
trigger-crash-dump,server dump create,Trigger crash dump in an instance.
124+
topology,openstack server show --topology,Retrieve server NUMA topology.
124125
unlock,server unlock,Unlock a server.
125126
unpause,server unpause,Unpause a server.
126127
unrescue,server unrescue,Restart the server from normal boot disk again.

openstackclient/compute/v2/server.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,7 +3383,8 @@ def take_action(self, parsed_args):
33833383
class ShowServer(command.ShowOne):
33843384
_description = _(
33853385
"Show server details. Specify ``--os-compute-api-version 2.47`` "
3386-
"or higher to see the embedded flavor information for the server.")
3386+
"or higher to see the embedded flavor information for the server."
3387+
)
33873388

33883389
def get_parser(self, prog_name):
33893390
parser = super(ShowServer, self).get_parser(prog_name)
@@ -3392,18 +3393,29 @@ def get_parser(self, prog_name):
33923393
metavar='<server>',
33933394
help=_('Server (name or ID)'),
33943395
)
3395-
parser.add_argument(
3396+
# TODO(stephenfin): This should be a separate command, not a flag
3397+
diagnostics_group = parser.add_mutually_exclusive_group()
3398+
diagnostics_group.add_argument(
33963399
'--diagnostics',
33973400
action='store_true',
33983401
default=False,
33993402
help=_('Display server diagnostics information'),
34003403
)
3404+
diagnostics_group.add_argument(
3405+
'--topology',
3406+
action='store_true',
3407+
default=False,
3408+
help=_(
3409+
'Include topology information in the output '
3410+
'(supported by --os-compute-api-version 2.78 or above)'
3411+
),
3412+
)
34013413
return parser
34023414

34033415
def take_action(self, parsed_args):
34043416
compute_client = self.app.client_manager.compute
3405-
server = utils.find_resource(compute_client.servers,
3406-
parsed_args.server)
3417+
server = utils.find_resource(
3418+
compute_client.servers, parsed_args.server)
34073419

34083420
if parsed_args.diagnostics:
34093421
(resp, data) = server.diagnostics()
@@ -3412,10 +3424,26 @@ def take_action(self, parsed_args):
34123424
"Error retrieving diagnostics data\n"
34133425
))
34143426
return ({}, {})
3415-
else:
3416-
data = _prep_server_detail(compute_client,
3417-
self.app.client_manager.image, server,
3418-
refresh=False)
3427+
return zip(*sorted(data.items()))
3428+
3429+
topology = None
3430+
if parsed_args.topology:
3431+
if compute_client.api_version < api_versions.APIVersion('2.78'):
3432+
msg = _(
3433+
'--os-compute-api-version 2.78 or greater is required to '
3434+
'support the --topology option'
3435+
)
3436+
raise exceptions.CommandError(msg)
3437+
3438+
topology = server.topology()
3439+
3440+
data = _prep_server_detail(
3441+
compute_client, self.app.client_manager.image, server,
3442+
refresh=False)
3443+
3444+
if topology:
3445+
data['topology'] = format_columns.DictColumn(topology)
3446+
34193447
return zip(*sorted(data.items()))
34203448

34213449

@@ -3731,7 +3759,7 @@ def get_parser(self, prog_name):
37313759
help=_(
37323760
'Tag to remove from the server. '
37333761
'Specify multiple times to remove multiple tags. '
3734-
'(supported by --os-compute-api-version 2.26 or later'
3762+
'(supported by --os-compute-api-version 2.26 or above)'
37353763
),
37363764
)
37373765
return parser

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6285,6 +6285,10 @@ def setUp(self):
62856285

62866286
self.image = image_fakes.FakeImage.create_one_image()
62876287
self.flavor = compute_fakes.FakeFlavor.create_one_flavor()
6288+
self.topology = {
6289+
'nodes': [{'vcpu_set': [0, 1]}, {'vcpu_set': [2, 3]}],
6290+
'pagesize_kb': None,
6291+
}
62886292
server_info = {
62896293
'image': {'id': self.image.id},
62906294
'flavor': {'id': self.flavor.id},
@@ -6298,6 +6302,7 @@ def setUp(self):
62986302
resp.status_code = 200
62996303
server_method = {
63006304
'diagnostics': (resp, {'test': 'test'}),
6305+
'topology': self.topology,
63016306
}
63026307
self.server = compute_fakes.FakeServer.create_one_server(
63036308
attrs=server_info, methods=server_method)
@@ -6348,6 +6353,7 @@ def test_show(self):
63486353
]
63496354
verifylist = [
63506355
('diagnostics', False),
6356+
('topology', False),
63516357
('server', self.server.name),
63526358
]
63536359
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -6365,6 +6371,7 @@ def test_show_embedded_flavor(self):
63656371
]
63666372
verifylist = [
63676373
('diagnostics', False),
6374+
('topology', False),
63686375
('server', self.server.name),
63696376
]
63706377
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -6391,6 +6398,7 @@ def test_show_diagnostics(self):
63916398
]
63926399
verifylist = [
63936400
('diagnostics', True),
6401+
('topology', False),
63946402
('server', self.server.name),
63956403
]
63966404
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -6400,6 +6408,47 @@ def test_show_diagnostics(self):
64006408
self.assertEqual(('test',), columns)
64016409
self.assertEqual(('test',), data)
64026410

6411+
def test_show_topology(self):
6412+
self.app.client_manager.compute.api_version = \
6413+
api_versions.APIVersion('2.78')
6414+
6415+
arglist = [
6416+
'--topology',
6417+
self.server.name,
6418+
]
6419+
verifylist = [
6420+
('diagnostics', False),
6421+
('topology', True),
6422+
('server', self.server.name),
6423+
]
6424+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6425+
6426+
self.columns += ('topology',)
6427+
self.data += (format_columns.DictColumn(self.topology),)
6428+
6429+
columns, data = self.cmd.take_action(parsed_args)
6430+
6431+
self.assertCountEqual(self.columns, columns)
6432+
self.assertCountEqual(self.data, data)
6433+
6434+
def test_show_topology_pre_v278(self):
6435+
self.app.client_manager.compute.api_version = \
6436+
api_versions.APIVersion('2.77')
6437+
6438+
arglist = [
6439+
'--topology',
6440+
self.server.name,
6441+
]
6442+
verifylist = [
6443+
('diagnostics', False),
6444+
('topology', True),
6445+
('server', self.server.name),
6446+
]
6447+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6448+
6449+
self.assertRaises(
6450+
exceptions.CommandError, self.cmd.take_action, parsed_args)
6451+
64036452

64046453
class TestServerStart(TestServer):
64056454

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add support for ``openstack server show --topology`` flag, which will
5+
include NUMA topology information in the output.

0 commit comments

Comments
 (0)