Add support for showing aggregate UUIDs (v2.41)

This adds support for the v2.41 microversion which returns
the aggregate uuid in os-aggregates responses. With this
change, CLI requests with microversion >= 2.41 will show
the aggregate UUID in the table output.

Depends-On: I4112ccd508eb85403933fec8b52efd468e866772

Part of blueprint return-uuid-from-os-aggregates-api

Change-Id: I71aeec07c7c442fe82e2bb3f75f49de6ced22e77
This commit is contained in:
Matt Riedemann 2017-01-05 22:03:34 -05:00
parent 5e5835de67
commit 75ffbaa3e6
5 changed files with 101 additions and 16 deletions

View File

@ -25,4 +25,4 @@ API_MIN_VERSION = api_versions.APIVersion("2.1")
# when client supported the max version, and bumped sequentially, otherwise
# the client may break due to server side new version may include some
# backward incompatible change.
API_MAX_VERSION = api_versions.APIVersion("2.40")
API_MAX_VERSION = api_versions.APIVersion("2.41")

View File

@ -1703,7 +1703,7 @@ class FakeSessionClient(base_client.SessionClient):
#
def get_os_aggregates(self, *kw):
return (200, {}, {"aggregates": [
response = (200, {}, {"aggregates": [
{'id': '1',
'name': 'test',
'availability_zone': 'nova1'},
@ -1714,6 +1714,13 @@ class FakeSessionClient(base_client.SessionClient):
'name': 'test3',
'metadata': {'test': "dup", "none_key": "Nine"}},
]})
# microversion >= 2.41 returns the uuid in the response
if self.api_version >= api_versions.APIVersion('2.41'):
aggregates = response[2]['aggregates']
aggregates[0]['uuid'] = '80785864-087b-45a5-a433-b20eac9b58aa'
aggregates[1]['uuid'] = '30827713-5957-4b68-8fd3-ccaddb568c24'
aggregates[2]['uuid'] = '9a651b22-ce3f-4a87-acd7-98446ef591c4'
return response
def _return_aggregate(self):
r = {'aggregate': self.get_os_aggregates()[2]['aggregates'][0]}

View File

@ -1942,15 +1942,35 @@ class ShellTest(utils.TestCase):
self.assert_called('GET', '/flavors/1', pos=-1)
def test_aggregate_list(self):
self.run_command('aggregate-list')
out, err = self.run_command('aggregate-list')
self.assert_called('GET', '/os-aggregates')
self.assertNotIn('UUID', out)
def test_aggregate_list_v2_41(self):
out, err = self.run_command('aggregate-list', api_version='2.41')
self.assert_called('GET', '/os-aggregates')
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
self.assertIn('30827713-5957-4b68-8fd3-ccaddb568c24', out)
self.assertIn('9a651b22-ce3f-4a87-acd7-98446ef591c4', out)
def test_aggregate_create(self):
self.run_command('aggregate-create test_name nova1')
out, err = self.run_command('aggregate-create test_name nova1')
body = {"aggregate": {"name": "test_name",
"availability_zone": "nova1"}}
self.assert_called('POST', '/os-aggregates', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertNotIn('UUID', out)
def test_aggregate_create_v2_41(self):
out, err = self.run_command('aggregate-create test_name nova1',
api_version='2.41')
body = {"aggregate": {"name": "test_name",
"availability_zone": "nova1"}}
self.assert_called('POST', '/os-aggregates', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
def test_aggregate_delete_by_id(self):
self.run_command('aggregate-delete 1')
@ -1961,10 +1981,20 @@ class ShellTest(utils.TestCase):
self.assert_called('DELETE', '/os-aggregates/1')
def test_aggregate_update_by_id(self):
self.run_command('aggregate-update 1 --name new_name')
out, err = self.run_command('aggregate-update 1 --name new_name')
body = {"aggregate": {"name": "new_name"}}
self.assert_called('PUT', '/os-aggregates/1', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertNotIn('UUID', out)
def test_aggregate_update_by_id_v2_41(self):
out, err = self.run_command('aggregate-update 1 --name new_name',
api_version='2.41')
body = {"aggregate": {"name": "new_name"}}
self.assert_called('PUT', '/os-aggregates/1', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
def test_aggregate_update_by_name(self):
self.run_command('aggregate-update test --name new_name ')
@ -2011,10 +2041,20 @@ class ShellTest(utils.TestCase):
self.assert_called('GET', '/os-aggregates/1', pos=-1)
def test_aggregate_set_metadata_add_by_id(self):
self.run_command('aggregate-set-metadata 3 foo=bar')
out, err = self.run_command('aggregate-set-metadata 3 foo=bar')
body = {"set_metadata": {"metadata": {"foo": "bar"}}}
self.assert_called('POST', '/os-aggregates/3/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/3', pos=-1)
self.assertNotIn('UUID', out)
def test_aggregate_set_metadata_add_by_id_v2_41(self):
out, err = self.run_command('aggregate-set-metadata 3 foo=bar',
api_version='2.41')
body = {"set_metadata": {"metadata": {"foo": "bar"}}}
self.assert_called('POST', '/os-aggregates/3/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/3', pos=-1)
self.assertIn('UUID', out)
self.assertIn('9a651b22-ce3f-4a87-acd7-98446ef591c4', out)
def test_aggregate_set_metadata_add_duplicate_by_id(self):
cmd = 'aggregate-set-metadata 3 test=dup'
@ -2037,10 +2077,20 @@ class ShellTest(utils.TestCase):
self.assert_called('GET', '/os-aggregates/1', pos=-1)
def test_aggregate_add_host_by_id(self):
self.run_command('aggregate-add-host 1 host1')
out, err = self.run_command('aggregate-add-host 1 host1')
body = {"add_host": {"host": "host1"}}
self.assert_called('POST', '/os-aggregates/1/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertNotIn('UUID', out)
def test_aggregate_add_host_by_id_v2_41(self):
out, err = self.run_command('aggregate-add-host 1 host1',
api_version='2.41')
body = {"add_host": {"host": "host1"}}
self.assert_called('POST', '/os-aggregates/1/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
def test_aggregate_add_host_by_name(self):
self.run_command('aggregate-add-host test host1')
@ -2049,10 +2099,20 @@ class ShellTest(utils.TestCase):
self.assert_called('GET', '/os-aggregates/1', pos=-1)
def test_aggregate_remove_host_by_id(self):
self.run_command('aggregate-remove-host 1 host1')
out, err = self.run_command('aggregate-remove-host 1 host1')
body = {"remove_host": {"host": "host1"}}
self.assert_called('POST', '/os-aggregates/1/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertNotIn('UUID', out)
def test_aggregate_remove_host_by_id_v2_41(self):
out, err = self.run_command('aggregate-remove-host 1 host1',
api_version='2.41')
body = {"remove_host": {"host": "host1"}}
self.assert_called('POST', '/os-aggregates/1/action', body, pos=-2)
self.assert_called('GET', '/os-aggregates/1', pos=-1)
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
def test_aggregate_remove_host_by_name(self):
self.run_command('aggregate-remove-host test host1')
@ -2061,8 +2121,15 @@ class ShellTest(utils.TestCase):
self.assert_called('GET', '/os-aggregates/1', pos=-1)
def test_aggregate_show_by_id(self):
self.run_command('aggregate-show 1')
out, err = self.run_command('aggregate-show 1')
self.assert_called('GET', '/os-aggregates/1')
self.assertNotIn('UUID', out)
def test_aggregate_show_by_id_v2_41(self):
out, err = self.run_command('aggregate-show 1', api_version='2.41')
self.assert_called('GET', '/os-aggregates/1')
self.assertIn('UUID', out)
self.assertIn('80785864-087b-45a5-a433-b20eac9b58aa', out)
def test_aggregate_show_by_name(self):
self.run_command('aggregate-show test')
@ -3234,6 +3301,7 @@ class ShellTest(utils.TestCase):
37, # There are no versioned wrapped shell method changes for this
38, # doesn't require any changes in novaclient
39, # There are no versioned wrapped shell method changes for this
41, # There are no version-wrapped shell method changes for this.
])
versions_supported = set(range(0,
novaclient.API_MAX_VERSION.ver_minor + 1))

View File

@ -3737,6 +3737,8 @@ def do_aggregate_list(cs, args):
"""Print a list of all aggregates."""
aggregates = cs.aggregates.list()
columns = ['Id', 'Name', 'Availability Zone']
if cs.api_version >= api_versions.APIVersion('2.41'):
columns.append('UUID')
utils.print_list(aggregates, columns)
@ -3750,7 +3752,7 @@ def do_aggregate_list(cs, args):
def do_aggregate_create(cs, args):
"""Create a new aggregate with the specified details."""
aggregate = cs.aggregates.create(args.name, args.availability_zone)
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
@utils.arg(
@ -3804,7 +3806,7 @@ def do_aggregate_update(cs, args):
aggregate = cs.aggregates.update(aggregate.id, updates)
print(_("Aggregate %s has been successfully updated.") % aggregate.id)
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
@utils.arg(
@ -3833,7 +3835,7 @@ def do_aggregate_set_metadata(cs, args):
aggregate = cs.aggregates.set_metadata(aggregate.id, metadata)
print(_("Metadata has been successfully updated for aggregate %s.") %
aggregate.id)
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
@utils.arg(
@ -3849,7 +3851,7 @@ def do_aggregate_add_host(cs, args):
print(_("Host %(host)s has been successfully added for aggregate "
"%(aggregate_id)s ") % {'host': args.host,
'aggregate_id': aggregate.id})
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
@utils.arg(
@ -3865,7 +3867,7 @@ def do_aggregate_remove_host(cs, args):
print(_("Host %(host)s has been successfully removed from aggregate "
"%(aggregate_id)s ") % {'host': args.host,
'aggregate_id': aggregate.id})
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
@utils.arg(
@ -3874,11 +3876,13 @@ def do_aggregate_remove_host(cs, args):
def do_aggregate_show(cs, args):
"""Show details of the specified aggregate."""
aggregate = _find_aggregate(cs, args.aggregate)
_print_aggregate_details(aggregate)
_print_aggregate_details(cs, aggregate)
def _print_aggregate_details(aggregate):
def _print_aggregate_details(cs, aggregate):
columns = ['Id', 'Name', 'Availability Zone', 'Hosts', 'Metadata']
if cs.api_version >= api_versions.APIVersion('2.41'):
columns.append('UUID')
def parser_metadata(fields):
return utils.pretty_choice_dict(getattr(fields, 'metadata', {}) or {})

View File

@ -0,0 +1,6 @@
---
features:
- |
Added support for microversion 2.41 which shows the aggregate UUID in CLI
output when listing, creating, showing, updating, setting metadata, and
adding or removing hosts from an aggregate.