)]}'
{"novaclient/tests/functional/v2/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a6d4842244513d432ce6baae5a7d5c7d954807a4","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                      % (descr, descr), output)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class TestServersTagsV226(base.ClientTestBase):"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    COMPUTE_API_VERSION \u003d \"2.26\""},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_f7ebb910","line":132,"updated":"2016-06-15 15:31:31.000000000","message":"You don\u0027t have a test in here for server-tag-exists.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"}],"novaclient/tests/unit/v2/test_servers.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"80ff3401817ac64fbe28b2707c62c5147b621a2b","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_fde6c5e6","line":1191,"updated":"2016-06-10 14:54:07.000000000","message":"Why remove the assert_request_id()?  Shouldn\u0027t that remain, whether or not we test if \u0027ret\u0027 is True?","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8d5aaaae5e7a59222949b81ff70c1bf4258b530","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_7c0e9033","line":1191,"in_reply_to":"7aa08908_30c107e5","updated":"2016-06-15 15:17:15.000000000","message":"We haven\u0027t yet released novaclient with the 2.26 tags support so I think we can fudge this one a bit, and returning True/False from an exists API method makes more sense to me than a request ID.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"7044668951f6163fa4200dac51a633197fa79aef","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_fcb8c0c9","line":1191,"in_reply_to":"7aa08908_7c0e9033","updated":"2016-06-15 15:21:59.000000000","message":"I figured that that might be the case, which is why I didn\u0027t immediately vote -1 :)  And I agree that having exists return True/False makes the most sense, I\u0027m just wondering if we can also stuff the request ID in there so the API can remain consistent on that front.  If not, or if it\u0027s agreed that it\u0027s not valuable enough (which TBH it\u0027s probably not), then fine…","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e12a32a8b2884040cb8d4fb15c71138c7c3facef","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_1cdb0c23","line":1191,"in_reply_to":"7aa08908_7c0e9033","updated":"2016-06-15 15:24:12.000000000","message":"Without this change I\u0027m seeing this in the CLI:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-exists 586c9385-1fd4-4169-823b-8fb0f7a5f7c6 t1\nERROR (NotFound): Server 586c9385-1fd4-4169-823b-8fb0f7a5f7c6 has no tag \u0027t1\u0027 (HTTP 404) (Request-ID: req-900a893e-51ed-4a80-9d9b-dd59d28307c0)\nstack@glancev2:/opt/stack/python-novaclient$ echo $?\n1","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"093cfcb91e7ce076a73bdcedc874ef57b146dc95","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_30c107e5","line":1191,"in_reply_to":"7aa08908_df0ed639","updated":"2016-06-14 15:43:14.000000000","message":"In other words, we\u0027re now losing the request ID output for this request and changing the return value.  Doesn\u0027t that represent a breaking interface change?","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"32e0c524b64f56953adeb16fb223b47564e2f999","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    def test_tag_exists(self):"},{"line_number":1189,"context_line":"        s \u003d self.cs.servers.get(1234)"},{"line_number":1190,"context_line":"        ret \u003d s.tag_exists(\u0027tag\u0027)"},{"line_number":1191,"context_line":"        self.assertTrue(ret)"},{"line_number":1192,"context_line":"        self.assert_called(\u0027GET\u0027, \u0027/servers/1234/tags/tag\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_df0ed639","line":1191,"in_reply_to":"7aa08908_fde6c5e6","updated":"2016-06-14 15:07:21.000000000","message":"because now tag_exists() returns just true of false\n\nhttps://review.openstack.org/#/c/328211/3/novaclient/v2/servers.py","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"}],"novaclient/v2/shell.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"80ff3401817ac64fbe28b2707c62c5147b621a2b","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_bd78bdf9","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"updated":"2016-06-10 14:54:07.000000000","message":"I\u0027m having a little trouble understanding what this formatter is intended to do; it doesn\u0027t appear to be doing anything at all.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"7044668951f6163fa4200dac51a633197fa79aef","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_dcd98424","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_3ce088fa","updated":"2016-06-15 15:21:59.000000000","message":"Heh :)  And if we used my suggestion of six.text_type?","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"093cfcb91e7ce076a73bdcedc874ef57b146dc95","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_9a3c59c9","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_7fdec23e","updated":"2016-06-14 15:43:14.000000000","message":"OK.  Would it make sense to make this \"six.text_type\" then?  Just a thought, not an objection…","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8d5aaaae5e7a59222949b81ff70c1bf4258b530","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_fc4f2068","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_9a3c59c9","updated":"2016-06-15 15:17:15.000000000","message":"It would be useful to know what this looks like before and after this change since it\u0027s not obvious to me.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"32e0c524b64f56953adeb16fb223b47564e2f999","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_7fdec23e","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_bd78bdf9","updated":"2016-06-14 15:07:21.000000000","message":"Here we have one problem. If you want to use utils.print_list() you need to have some object with some fields. Because these fields will be used to eject a data from the object. \n\nHere we have only the list of strings. So this a little hack, because if you have a formatter the data will be ejected by the different way.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"550977110bb9d424f7de92db8041706db6b3fc3a","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_5cb47481","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_dcd98424","updated":"2016-06-15 15:26:18.000000000","message":"I don\u0027t know, I didn\u0027t follow that.\n\nAfter this fix is applied I get this:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-list 586c9385-1fd4-4169-823b-8fb0f7a5f7c6\n\n +-----+\n | Tag |\n +-----+\n | t1  |\n +-----+","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7b8873c53718266d8661e92f8819918ed43b6a7c","unresolved":false,"context_lines":[{"line_number":5026,"context_line":"    \"\"\"Get list of tags from a server.\"\"\""},{"line_number":5027,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5028,"context_line":"    tags \u003d server.tag_list()"},{"line_number":5029,"context_line":"    formatters \u003d {\u0027Tag\u0027: lambda o: o}"},{"line_number":5030,"context_line":"    utils.print_list(tags, [\u0027Tag\u0027], formatters\u003dformatters)"},{"line_number":5031,"context_line":""},{"line_number":5032,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_3ce088fa","line":5029,"range":{"start_line":5029,"start_character":25,"end_line":5029,"end_character":36},"in_reply_to":"7aa08908_fc4f2068","updated":"2016-06-15 15:19:01.000000000","message":"This is what I see without the change:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-list 586c9385-1fd4-4169-823b-8fb0f7a5f7c6\n\n +---+---+---+---+\n | n | a | m | e |\n +---+---+---+---+\n +---+---+---+---+","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed24fee384481ced24f1670242e23c85dc2e5bdb","unresolved":false,"context_lines":[{"line_number":5068,"context_line":"@api_versions.wraps(\"2.26\")"},{"line_number":5069,"context_line":"@utils.arg(\u0027server\u0027, metavar\u003d\u0027\u003cserver\u003e\u0027, help\u003d_(\u0027Name or ID of server.\u0027))"},{"line_number":5070,"context_line":"@utils.arg(\u0027tag\u0027, metavar\u003d\u0027\u003ctag\u003e\u0027, help\u003d_(\u0027Tag to check if it exists or not.\u0027))"},{"line_number":5071,"context_line":"def do_server_tag_exists(cs, args):"},{"line_number":5072,"context_line":"    \"\"\"Check if a server has specified tag.\"\"\""},{"line_number":5073,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_179925d1","line":5071,"updated":"2016-06-15 15:30:44.000000000","message":"With the changes here I now get this:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-exists 586c9385-1fd4-4169-823b-8fb0f7a5f7c6 t2\nThe server does not have this tag.\nstack@glancev2:/opt/stack/python-novaclient$ echo $?\n0\n\n\nThis CLI is kind of weird to begin with. I could just use server-tag-list and check the results for the tag I care about.\n\nThe real problem with the change here is if the tag doesn\u0027t exist, I get a 0 return code back - which from a CLI perspective is really what I should care about checking, not the actual text that\u0027s dumped.\n\nSo -1 on this because if we\u0027re going to have this kind of command, if the tag doesn\u0027t exist I think we should return a non-0 return code for it to use for scripting.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b41a9fe99b353fced44ae489ae2389edef2c2773","unresolved":false,"context_lines":[{"line_number":5068,"context_line":"@api_versions.wraps(\"2.26\")"},{"line_number":5069,"context_line":"@utils.arg(\u0027server\u0027, metavar\u003d\u0027\u003cserver\u003e\u0027, help\u003d_(\u0027Name or ID of server.\u0027))"},{"line_number":5070,"context_line":"@utils.arg(\u0027tag\u0027, metavar\u003d\u0027\u003ctag\u003e\u0027, help\u003d_(\u0027Tag to check if it exists or not.\u0027))"},{"line_number":5071,"context_line":"def do_server_tag_exists(cs, args):"},{"line_number":5072,"context_line":"    \"\"\"Check if a server has specified tag.\"\"\""},{"line_number":5073,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_cdef0ce8","line":5071,"in_reply_to":"7aa08908_179925d1","updated":"2016-06-15 16:04:59.000000000","message":"Given that adding the same tag to the same server doesn\u0027t result in a 400 or 409:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-add 1aa9c8f7-7514-4305-8e38-155d9869f7fb t1\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-list 1aa9c8f7-7514-4305-8e38-155d9869f7fb\n+-----+\n| Tag |\n+-----+\n| t1  |\n+-----+\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-add 1aa9c8f7-7514-4305-8e38-155d9869f7fb t1\nstack@glancev2:/opt/stack/python-novaclient$ echo $?\n0\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-list 1aa9c8f7-7514-4305-8e38-155d9869f7fb\n+-----+\n| Tag |\n+-----+\n| t1  |\n+-----+\n\n\nI\u0027m inclined to say we should just remove this CLI, since I\u0027m not sure why someone would use it - at least where they couldn\u0027t just use the server-tag-list CLI and parse the output.\n\nAlternatively, we could keep the CLI but drop the output and just make it a command that can be used to check the exit code (0 for exists, 1 for doesn\u0027t exist).","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"609da13c5d8dd9eb48457b8602f8008118b77fdb","unresolved":false,"context_lines":[{"line_number":5068,"context_line":"@api_versions.wraps(\"2.26\")"},{"line_number":5069,"context_line":"@utils.arg(\u0027server\u0027, metavar\u003d\u0027\u003cserver\u003e\u0027, help\u003d_(\u0027Name or ID of server.\u0027))"},{"line_number":5070,"context_line":"@utils.arg(\u0027tag\u0027, metavar\u003d\u0027\u003ctag\u003e\u0027, help\u003d_(\u0027Tag to check if it exists or not.\u0027))"},{"line_number":5071,"context_line":"def do_server_tag_exists(cs, args):"},{"line_number":5072,"context_line":"    \"\"\"Check if a server has specified tag.\"\"\""},{"line_number":5073,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_ed65a81d","line":5071,"in_reply_to":"7aa08908_cdef0ce8","updated":"2016-06-15 16:13:27.000000000","message":"After talking with melwitt and andreykurilin in IRC, I think we\u0027re in agreement that we should change this to a server-tag-show command, where we show the output as normal if it exists, and fail with the CommandError 404 like it does today if it doesn\u0027t exist.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e12a32a8b2884040cb8d4fb15c71138c7c3facef","unresolved":false,"context_lines":[{"line_number":5072,"context_line":"    \"\"\"Check if a server has specified tag.\"\"\""},{"line_number":5073,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"},{"line_number":5075,"context_line":"        print(_(\"The server has the tag.\"))"},{"line_number":5076,"context_line":"    else:"},{"line_number":5077,"context_line":"        print(_(\"The server does not have this tag.\"))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_1c5e6c79","line":5075,"range":{"start_line":5075,"start_character":17,"end_line":5075,"end_character":40},"updated":"2016-06-15 15:24:12.000000000","message":"Before this change if the tag exists you get no output:\n\nstack@glancev2:/opt/stack/python-novaclient$ nova server-tag-exists 586c9385-1fd4-4169-823b-8fb0f7a5f7c6 t1\nstack@glancev2:/opt/stack/python-novaclient$ echo $?\n0\n\nIt might be better to word this as:\n\n\"Server \u003cuuid\u003e has tag \u0027\u003ctag\u003e\u0027\"","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e12a32a8b2884040cb8d4fb15c71138c7c3facef","unresolved":false,"context_lines":[{"line_number":5071,"context_line":"def do_server_tag_exists(cs, args):"},{"line_number":5072,"context_line":"    \"\"\"Check if a server has specified tag.\"\"\""},{"line_number":5073,"context_line":"    server \u003d _find_server(cs, args.server)"},{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"},{"line_number":5075,"context_line":"        print(_(\"The server has the tag.\"))"},{"line_number":5076,"context_line":"    else:"},{"line_number":5077,"context_line":"        print(_(\"The server does not have this tag.\"))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_3cb368eb","line":5077,"range":{"start_line":5074,"start_character":4,"end_line":5077,"end_character":54},"updated":"2016-06-15 15:24:12.000000000","message":"I almost wonder if printing this out should be triggered by a verbose flag, else let return codes give the result.","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e12a32a8b2884040cb8d4fb15c71138c7c3facef","unresolved":false,"context_lines":[{"line_number":5074,"context_line":"    if server.tag_exists(args.tag):"},{"line_number":5075,"context_line":"        print(_(\"The server has the tag.\"))"},{"line_number":5076,"context_line":"    else:"},{"line_number":5077,"context_line":"        print(_(\"The server does not have this tag.\"))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_5cfc7472","line":5077,"range":{"start_line":5077,"start_character":17,"end_line":5077,"end_character":51},"updated":"2016-06-15 15:24:12.000000000","message":"It might make more sense to re-use what the REST API gives you for a message, e.g.:\n\n\"Server 586c9385-1fd4-4169-823b-8fb0f7a5f7c6 has no tag \u0027t1\u0027\"","commit_id":"0f122ad4581138ccf58abf1e1e136a7409832dfb"}]}
