From 19ff19e1b8e632e03aff50621d200a258b2014b2 Mon Sep 17 00:00:00 2001
From: Sergey Nikitin <snikitin@mirantis.com>
Date: Fri, 10 Jun 2016 12:54:55 +0300
Subject: [PATCH] Added functional tests for server tags (microverison 2.26)

Also fixed wrong shell output in 'server-tag-list'
and removes 'server-tag-show' command.

Change-Id: Icfd73e50108c7b1226e51307c0afc3f8f54ff2d6
---
 novaclient/tests/functional/base.py           | 32 ++++++++++++++
 .../tests/functional/v2/test_servers.py       | 44 +++++++++++++++++++
 novaclient/tests/unit/v2/test_servers.py      |  6 ---
 novaclient/tests/unit/v2/test_shell.py        |  5 ---
 novaclient/v2/servers.py                      | 15 -------
 novaclient/v2/shell.py                        | 12 +----
 6 files changed, 78 insertions(+), 36 deletions(-)

diff --git a/novaclient/tests/functional/base.py b/novaclient/tests/functional/base.py
index 095d5ce70..2422033f6 100644
--- a/novaclient/tests/functional/base.py
+++ b/novaclient/tests/functional/base.py
@@ -344,6 +344,38 @@ class ClientTestBase(testtools.TestCase):
 
         raise ValueError("Unable to find value for column '%s'." % column)
 
+    def _get_list_of_values_from_single_column_table(self, table, column):
+        """Get the list of values for the column in the single-column table
+
+        Example table:
+
+        +------+
+        | Tags |
+        +------+
+        | tag1 |
+        | tag2 |
+        +------+
+
+        :param table: newline-separated table with |-separated cells
+        :param column: name of the column to look for
+        :raises: ValueError if the single column has some other name
+        """
+        lines = table.split("\n")
+        column_name = None
+        values = []
+        for line in lines:
+            if "|" in line:
+                if not column_name:
+                    column_name = line.split("|")[1].strip()
+                    if column_name != column:
+                        raise ValueError(
+                            "The table has no column %(expected)s "
+                            "but has column %(actual)s." % {
+                                'expected': column, 'actual': column_name})
+                else:
+                    values.append(line.split("|")[1].strip())
+        return values
+
     def _create_server(self, name=None, with_network=True, add_cleanup=True,
                        **kwargs):
         name = name or self.name_generate(prefix='server')
diff --git a/novaclient/tests/functional/v2/test_servers.py b/novaclient/tests/functional/v2/test_servers.py
index 642cfed34..1eadf066a 100644
--- a/novaclient/tests/functional/v2/test_servers.py
+++ b/novaclient/tests/functional/v2/test_servers.py
@@ -127,3 +127,47 @@ class TestServersDescription(base.ClientTestBase):
         self.assertIn("\nERROR (BadRequest): Invalid input for field/attribute"
                       " description. Value: %s. u\'%s\' is too long (HTTP 400)"
                       % (descr, descr), output)
+
+
+class TestServersTagsV226(base.ClientTestBase):
+
+    COMPUTE_API_VERSION = "2.26"
+
+    def _boot_server_with_tags(self):
+        uuid = self._create_server().id
+        self.client.servers.set_tags(uuid, ["t1", "t2"])
+        return uuid
+
+    def test_show(self):
+        uuid = self._boot_server_with_tags()
+        output = self.nova("show %s" % uuid)
+        self.assertEqual('["t1", "t2"]', self._get_value_from_the_table(
+            output, "tags"))
+
+    def test_list(self):
+        uuid = self._boot_server_with_tags()
+        output = self.nova("server-tag-list %s" % uuid)
+        tags = self._get_list_of_values_from_single_column_table(
+            output, "Tag")
+        self.assertEqual(["t1", "t2"], tags)
+
+    def test_add(self):
+        uuid = self._boot_server_with_tags()
+        self.nova("server-tag-add %s t3" % uuid)
+        self.assertEqual(["t1", "t2", "t3"],
+                         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)
+        self.assertEqual(["t3", "t4"], self.client.servers.tag_list(uuid))
+
+    def test_delete(self):
+        uuid = self._boot_server_with_tags()
+        self.nova("server-tag-delete %s t2" % uuid)
+        self.assertEqual(["t1"], 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)
+        self.assertEqual([], self.client.servers.tag_list(uuid))
diff --git a/novaclient/tests/unit/v2/test_servers.py b/novaclient/tests/unit/v2/test_servers.py
index 51e35731b..b97ffca90 100644
--- a/novaclient/tests/unit/v2/test_servers.py
+++ b/novaclient/tests/unit/v2/test_servers.py
@@ -1184,9 +1184,3 @@ class ServersV226Test(ServersV225Test):
         ret = s.set_tags(['tag1', 'tag2'])
         self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
         self.assert_called('PUT', '/servers/1234/tags')
-
-    def test_tag_exists(self):
-        s = self.cs.servers.get(1234)
-        ret = s.tag_exists('tag')
-        self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
-        self.assert_called('GET', '/servers/1234/tags/tag')
diff --git a/novaclient/tests/unit/v2/test_shell.py b/novaclient/tests/unit/v2/test_shell.py
index 4d936ede8..a36ab82fe 100644
--- a/novaclient/tests/unit/v2/test_shell.py
+++ b/novaclient/tests/unit/v2/test_shell.py
@@ -2840,11 +2840,6 @@ class ShellTest(utils.TestCase):
                          api_version='2.26')
         self.assert_called('DELETE', '/servers/1234/tags')
 
-    def test_server_tag_exists(self):
-        self.run_command('server-tag-exists sample-server tag',
-                         api_version='2.26')
-        self.assert_called('GET', '/servers/1234/tags/tag')
-
     def test_list_v2_26_tags(self):
         self.run_command('list --tags tag1,tag2', api_version='2.26')
         self.assert_called('GET', '/servers/detail?tags=tag1%2Ctag2')
diff --git a/novaclient/v2/servers.py b/novaclient/v2/servers.py
index 51aef7776..929e32435 100644
--- a/novaclient/v2/servers.py
+++ b/novaclient/v2/servers.py
@@ -556,12 +556,6 @@ class Server(base.Resource):
         """
         return self.manager.add_tag(self, tag)
 
-    def tag_exists(self, tag):
-        """
-        Check if an instance has specified tag.
-        """
-        return self.manager.tag_exists(self, tag)
-
 
 class NetworkInterface(base.Resource):
     @property
@@ -1784,12 +1778,3 @@ class ServerManager(base.BootingManagerWithFind):
         """
         return self._update(
             "/servers/%s/tags/%s" % (base.getid(server), tag), None)
-
-    @api_versions.wraps('2.26')
-    def tag_exists(self, server, tag):
-        """
-        Check if an instance has specified tag.
-        """
-        resp, body = self.api.client.get(
-            "/servers/%s/tags/%s" % (base.getid(server), tag))
-        return self.convert_into_with_meta(body, resp)
diff --git a/novaclient/v2/shell.py b/novaclient/v2/shell.py
index 1dc06ac2a..042b35435 100644
--- a/novaclient/v2/shell.py
+++ b/novaclient/v2/shell.py
@@ -5029,7 +5029,8 @@ def do_server_tag_list(cs, args):
     """Get list of tags from a server."""
     server = _find_server(cs, args.server)
     tags = server.tag_list()
-    utils.print_list(tags, 'name')
+    formatters = {'Tag': lambda o: o}
+    utils.print_list(tags, ['Tag'], formatters=formatters)
 
 
 @api_versions.wraps("2.26")
@@ -5065,12 +5066,3 @@ def do_server_tag_delete_all(cs, args):
     """Delete all tags from a server."""
     server = _find_server(cs, args.server)
     server.delete_all_tags()
-
-
-@api_versions.wraps("2.26")
-@utils.arg('server', metavar='<server>', help=_('Name or ID of server.'))
-@utils.arg('tag', metavar='<tag>', help=_('Tag to check if it exists or not.'))
-def do_server_tag_exists(cs, args):
-    """Check if a server has specified tag."""
-    server = _find_server(cs, args.server)
-    server.tag_exists(args.tag)