From 70a3957cae435c792972bccf8f0f4eddd61eefdc Mon Sep 17 00:00:00 2001 From: int32bit Date: Sat, 24 Dec 2016 01:10:13 +0800 Subject: Allow multiple tag add/delete from cli Our users always want to add/remove multiple tags easily, but currently we can only add/remove a single tag to a server via Nova CLI. This patch allows user to add or delete server tags in one hit. Change-Id: I4dc6e5cb30b99857970965cd180e116afba1fc7d --- novaclient/tests/functional/v2/test_servers.py | 11 +++++++++++ novaclient/tests/unit/v2/fakes.py | 18 ++++++++++++++++++ novaclient/tests/unit/v2/test_shell.py | 14 ++++++++++++++ novaclient/v2/shell.py | 20 ++++++++++++++------ 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/novaclient/tests/functional/v2/test_servers.py b/novaclient/tests/functional/v2/test_servers.py index 3d8c5128..31b2ae06 100644 --- a/novaclient/tests/functional/v2/test_servers.py +++ b/novaclient/tests/functional/v2/test_servers.py @@ -158,6 +158,12 @@ class TestServersTagsV226(base.ClientTestBase): self.assertEqual(["t1", "t2", "t3"], self.client.servers.tag_list(uuid)) + def test_add_many(self): + uuid = self._boot_server_with_tags() + self.nova("server-tag-add %s t3 t4" % uuid) + self.assertEqual(["t1", "t2", "t3", "t4"], + self.client.servers.tag_list(uuid)) + def test_set(self): uuid = self._boot_server_with_tags() self.nova("server-tag-set %s t3 t4" % uuid) @@ -168,6 +174,11 @@ class TestServersTagsV226(base.ClientTestBase): self.nova("server-tag-delete %s t2" % uuid) self.assertEqual(["t1"], self.client.servers.tag_list(uuid)) + def test_delete_many(self): + uuid = self._boot_server_with_tags() + self.nova("server-tag-delete %s t1 t2" % uuid) + self.assertEqual([], self.client.servers.tag_list(uuid)) + def test_delete_all(self): uuid = self._boot_server_with_tags() self.nova("server-tag-delete-all %s" % uuid) diff --git a/novaclient/tests/unit/v2/fakes.py b/novaclient/tests/unit/v2/fakes.py index f9da820c..3590acdf 100644 --- a/novaclient/tests/unit/v2/fakes.py +++ b/novaclient/tests/unit/v2/fakes.py @@ -2339,6 +2339,15 @@ class FakeSessionClient(base_client.SessionClient): def put_servers_1234_tags_tag(self, **kw): return (201, {}, None) + def put_servers_1234_tags_tag1(self, **kw): + return (201, {}, None) + + def put_servers_1234_tags_tag2(self, **kw): + return (201, {}, None) + + def put_servers_1234_tags_tag3(self, **kw): + return (201, {}, None) + def put_servers_1234_tags(self, **kw): return (201, {}, None) @@ -2348,6 +2357,15 @@ class FakeSessionClient(base_client.SessionClient): def delete_servers_1234_tags_tag(self, **kw): return (204, {}, None) + def delete_servers_1234_tags_tag1(self, **kw): + return (204, {}, None) + + def delete_servers_1234_tags_tag2(self, **kw): + return (204, {}, None) + + def delete_servers_1234_tags_tag3(self, **kw): + return (204, {}, None) + def delete_servers_1234_tags(self, **kw): return (204, {}, None) diff --git a/novaclient/tests/unit/v2/test_shell.py b/novaclient/tests/unit/v2/test_shell.py index bb01344a..45b135f5 100644 --- a/novaclient/tests/unit/v2/test_shell.py +++ b/novaclient/tests/unit/v2/test_shell.py @@ -3329,6 +3329,13 @@ class ShellTest(utils.TestCase): api_version='2.26') self.assert_called('PUT', '/servers/1234/tags/tag', None) + def test_server_tag_add_many(self): + self.run_command('server-tag-add sample-server tag1 tag2 tag3', + api_version='2.26') + self.assert_called('PUT', '/servers/1234/tags/tag1', None, pos=-3) + self.assert_called('PUT', '/servers/1234/tags/tag2', None, pos=-2) + self.assert_called('PUT', '/servers/1234/tags/tag3', None, pos=-1) + def test_server_tag_set(self): self.run_command('server-tag-set sample-server tag1 tag2', api_version='2.26') @@ -3344,6 +3351,13 @@ class ShellTest(utils.TestCase): api_version='2.26') self.assert_called('DELETE', '/servers/1234/tags/tag') + def test_server_tag_delete_many(self): + self.run_command('server-tag-delete sample-server tag1 tag2 tag3', + api_version='2.26') + self.assert_called('DELETE', '/servers/1234/tags/tag1', pos=-3) + self.assert_called('DELETE', '/servers/1234/tags/tag2', pos=-2) + self.assert_called('DELETE', '/servers/1234/tags/tag3', pos=-1) + def test_server_tag_delete_all(self): self.run_command('server-tag-delete-all sample-server', api_version='2.26') diff --git a/novaclient/v2/shell.py b/novaclient/v2/shell.py index 055559a4..1acb4dce 100644 --- a/novaclient/v2/shell.py +++ b/novaclient/v2/shell.py @@ -5283,11 +5283,15 @@ def do_server_tag_list(cs, args): @api_versions.wraps("2.26") @utils.arg('server', metavar='', help=_('Name or ID of server.')) -@utils.arg('tag', metavar='', help=_('Tag to add.')) +@utils.arg('tag', metavar='', nargs='+', help=_('Tag(s) to add.')) def do_server_tag_add(cs, args): - """Add single tag to a server.""" + """Add one or more tags to a server.""" server = _find_server(cs, args.server) - server.add_tag(args.tag) + utils.do_action_on_many( + lambda t: server.add_tag(t), + args.tag, + _("Request to add tag %s to specified server has been accepted."), + _("Unable to add tag %s to the specified server.")) @api_versions.wraps("2.26") @@ -5301,11 +5305,15 @@ def do_server_tag_set(cs, args): @api_versions.wraps("2.26") @utils.arg('server', metavar='', help=_('Name or ID of server.')) -@utils.arg('tag', metavar='', help=_('Tag to delete.')) +@utils.arg('tag', metavar='', nargs='+', help=_('Tag(s) to delete.')) def do_server_tag_delete(cs, args): - """Delete single tag from a server.""" + """Delete one or more tags from a server.""" server = _find_server(cs, args.server) - server.delete_tag(args.tag) + utils.do_action_on_many( + lambda t: server.delete_tag(t), + args.tag, + _("Request to delete tag %s from specified server has been accepted."), + _("Unable to delete tag %s from specified server.")) @api_versions.wraps("2.26") -- cgit v1.2.1