)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ghanshyam Mann \u003cghanshyammann@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-12-08 23:42:29 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Move tags validation code to json scehme"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently  we have lot of validation code inside"},{"line_number":10,"context_line":"server tag controller class which can be moved to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a71b18c_e772c57b","line":7,"range":{"start_line":7,"start_character":34,"end_line":7,"end_character":40},"updated":"2016-12-09 10:36:26.000000000","message":"scheme","commit_id":"7e0847bc70763f9c121c324cb01607b70607446f"}],"nova/api/openstack/compute/server_tags.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"09532fcbf9a3bd0ddbcd008153b7832c4c2ae8e6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"},{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_a2dc7b75","line":110,"range":{"start_line":94,"start_character":0,"end_line":110,"end_character":59},"updated":"2016-12-08 06:30:49.000000000","message":"why didn\u0027t you refactor this part?","commit_id":"7b652cada02e8ee4a05c0f5a67a1b57fa2babb99"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"b9fed0c52c91bdc46bea78b2ab6bce6df827a518","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"},{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_82169f53","line":110,"range":{"start_line":94,"start_character":0,"end_line":110,"end_character":59},"in_reply_to":"3a71b18c_22c6ab16","updated":"2016-12-08 06:52:22.000000000","message":"Hmm, thats true","commit_id":"7b652cada02e8ee4a05c0f5a67a1b57fa2babb99"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e2514297dded612b26b4d29f34c9da5c892b9e9d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"},{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_22c6ab16","line":110,"range":{"start_line":94,"start_character":0,"end_line":110,"end_character":59},"in_reply_to":"3a71b18c_a2dc7b75","updated":"2016-12-08 06:46:51.000000000","message":"actually we cannot do in schema as we have to validate \u0027id\u0027 (not in body) and tags(at L103) which are dynamically fetched.","commit_id":"7b652cada02e8ee4a05c0f5a67a1b57fa2babb99"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_895e8de7","side":"PARENT","line":99,"range":{"start_line":96,"start_character":8,"end_line":99,"end_character":64},"updated":"2016-12-09 10:36:26.000000000","message":"just a little question. Why this part wasn\u0027t removed? It was removed in \u0027update_all\u0027 method but not here. Why?","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8b83602bd795837cc2d2611cf4477123ecd7e974","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_70c2beea","side":"PARENT","line":99,"range":{"start_line":96,"start_character":8,"end_line":99,"end_character":64},"in_reply_to":"3a71b18c_895e8de7","updated":"2016-12-11 06:02:28.000000000","message":"These are not in request body, its id being validated explicitly.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is too long. Maximum length of a tag \""},{"line_number":114,"context_line":"                     \"is %(length)d\") % {\u0027tag\u0027: id,"},{"line_number":115,"context_line":"                                         \u0027length\u0027: objects.tag.MAX_TAG_LENGTH})"},{"line_number":116,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":119,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_271e7d63","side":"PARENT","line":116,"updated":"2016-12-09 10:36:26.000000000","message":"see comment bellow","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                invalid_tags.append(tag)"},{"line_number":148,"context_line":"        if invalid_tags:"},{"line_number":149,"context_line":"            msg \u003d (_(\"Tags \u0027%s\u0027 are invalid. Each tag must be a string \""},{"line_number":150,"context_line":"                     \"without characters \u0027/\u0027 and \u0027,\u0027.\") % invalid_tags)"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        tag_count \u003d len(body[\u0027tags\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_158a8abf","side":"PARENT","line":150,"updated":"2016-12-09 10:36:26.000000000","message":"Here you will get a error message just about first invalid tag. if you have a several invalid tags you will have to fix first of them. Then send a request again. got error message about second invalid tag. and so on.\n\nFor example. you try to add these tags:\n [\u0027ta,g1\u0027, 1, \u0027tag/2\u0027]\n\neach tag is invalid. And you will get a brilliant message:\n\n \u0027tag,1\u0027 does not match \u0027^[^,/]*$\u0027\n\nHere information just about first invalid tag. But it is not a biggest problem. The main problem is in message \"does not match \u0027^[^,/]*$\". What these magical symbols means? I think that removed message was much clearer","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8b83602bd795837cc2d2611cf4477123ecd7e974","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                invalid_tags.append(tag)"},{"line_number":148,"context_line":"        if invalid_tags:"},{"line_number":149,"context_line":"            msg \u003d (_(\"Tags \u0027%s\u0027 are invalid. Each tag must be a string \""},{"line_number":150,"context_line":"                     \"without characters \u0027/\u0027 and \u0027,\u0027.\") % invalid_tags)"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        tag_count \u003d len(body[\u0027tags\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_b06ff6fa","side":"PARENT","line":150,"in_reply_to":"3a71b18c_158a8abf","updated":"2016-12-11 06:02:28.000000000","message":"If user adding tags they will be knowing what they adding and what is allowed. Its not so hard to find which one is not right one. They will not add lot of together.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit \""},{"line_number":156,"context_line":"                     \"%(max)d. The number of tags in request is %(count)d.\")"},{"line_number":157,"context_line":"                   % {\u0027max\u0027: objects.instance.MAX_TAG_COUNT,"},{"line_number":158,"context_line":"                      \u0027count\u0027: tag_count})"},{"line_number":159,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        long_tags \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_75681e88","side":"PARENT","line":158,"updated":"2016-12-09 10:36:26.000000000","message":"Without this handling you will got very very long message like this:\n\n\nInvalid input for field/attribute tags. Value: [\u00270\u0027, \u00271\u0027, \u00272\u0027, \n\u00273\u0027, \u00274\u0027, \u00275\u0027, \u00276\u0027, \u00277\u0027, \u00278\u0027, \u00279\u0027, \u002710\u0027, \u002711\u0027, \u002712\u0027, \u002713\u0027, \n\u002714\u0027, \u002715\u0027, \u002716\u0027, \u002717\u0027, \u002718\u0027, \u002719\u0027, \u002720\u0027, \u002721\u0027, \u002722\u0027, \u002723\u0027, \n\u002724\u0027, \u002725\u0027, \u002726\u0027, \u002727\u0027, \u002728\u0027, \u002729\u0027, \u002730\u0027, \u002731\u0027, \u002732\u0027, \u002733\u0027, \n\u002734\u0027, \u002735\u0027, \u002736\u0027, \u002737\u0027, \u002738\u0027, \u002739\u0027, \u002740\u0027, \u002741\u0027, \u002742\u0027, \u002743\u0027, \n\u002744\u0027, \u002745\u0027, \u002746\u0027, \u002747\u0027, \u002748\u0027, \u002749\u0027, \u002750\u0027]. [\u00270\u0027, \u00271\u0027, \u00272\u0027, \u00273\u0027, \n\u00274\u0027, \u00275\u0027, \u00276\u0027, \u00277\u0027, \u00278\u0027, \u00279\u0027, \u002710\u0027, \u002711\u0027, \u002712\u0027, \u002713\u0027, \u002714\u0027, \n\u002715\u0027, \u002716\u0027, \u002717\u0027, \u002718\u0027, \u002719\u0027, \u002720\u0027, \u002721\u0027, \u002722\u0027, \u002723\u0027, \u002724\u0027, \n\u002725\u0027, \u002726\u0027, \u002727\u0027, \u002728\u0027, \u002729\u0027, \u002730\u0027, \u002731\u0027, \u002732\u0027, \u002733\u0027, \u002734\u0027, \n\u002735\u0027, \u002736\u0027, \u002737\u0027, \u002738\u0027, \u002739\u0027, \u002740\u0027, \u002741\u0027, \u002742\u0027, \u002743\u0027, \u002744\u0027, \n\u002745\u0027, \u002746\u0027, \u002747\u0027, \u002748\u0027, \u002749\u0027, \u002750\u0027] is too long\n\nHere I\u0027m not pasted one message twice. It\u0027s is a original message. In this message schema validator used long tag list twice.\n\nHere to understand what is going on you must:\n1) count how much tags you tried to create. because here we have no information about it. \n2) Try to guess how much tags it should be. No information about maximum tag count.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8b83602bd795837cc2d2611cf4477123ecd7e974","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit \""},{"line_number":156,"context_line":"                     \"%(max)d. The number of tags in request is %(count)d.\")"},{"line_number":157,"context_line":"                   % {\u0027max\u0027: objects.instance.MAX_TAG_COUNT,"},{"line_number":158,"context_line":"                      \u0027count\u0027: tag_count})"},{"line_number":159,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        long_tags \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d0b1d290","side":"PARENT","line":158,"in_reply_to":"3a71b18c_75681e88","updated":"2016-12-11 06:02:28.000000000","message":"Yea that\u0027s true but this is how it shown on every other API validation. I do not thinks this error msg is so hard to read or understand.\n\nIf anyone pass lot of tags and it exceed limit then they know how much they passed in request.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"1fb16da205abdf93fb991f73e7fd3ab0d4cbac8d","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        if long_tags:"},{"line_number":164,"context_line":"            msg \u003d (_(\"Tags %(tags)s are too long. Maximum length of a tag \""},{"line_number":165,"context_line":"                     \"is %(length)d\") % {\u0027tags\u0027: long_tags,"},{"line_number":166,"context_line":"                                         \u0027length\u0027: objects.tag.MAX_TAG_LENGTH})"},{"line_number":167,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_35d94684","side":"PARENT","line":166,"updated":"2016-12-09 10:36:26.000000000","message":"If you will try to add 3 too long tags (a*100, b*100, c*100) you will got a message:\n  \u0027aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\u0027 is too long\n\nHere is no information about two other tags. just about first one.\n\nHere is no information about needed length. Just \"is too long\". Try to guess which length you need.\n\nRemoved message was much clearer","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8b83602bd795837cc2d2611cf4477123ecd7e974","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        if long_tags:"},{"line_number":164,"context_line":"            msg \u003d (_(\"Tags %(tags)s are too long. Maximum length of a tag \""},{"line_number":165,"context_line":"                     \"is %(length)d\") % {\u0027tags\u0027: long_tags,"},{"line_number":166,"context_line":"                                         \u0027length\u0027: objects.tag.MAX_TAG_LENGTH})"},{"line_number":167,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_f075eeca","side":"PARENT","line":166,"in_reply_to":"3a71b18c_35d94684","updated":"2016-12-11 06:02:28.000000000","message":"Yes, i agree but same as above.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"2f16350ac842ea8731fcc54a16fcb75b50125eec","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                invalid_tags.append(tag)"},{"line_number":148,"context_line":"        if invalid_tags:"},{"line_number":149,"context_line":"            msg \u003d (_(\"Tags \u0027%s\u0027 are invalid. Each tag must be a string \""},{"line_number":150,"context_line":"                     \"without characters \u0027/\u0027 and \u0027,\u0027.\") % invalid_tags)"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        tag_count \u003d len(body[\u0027tags\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_9dec47c9","side":"PARENT","line":150,"updated":"2016-12-13 08:11:19.000000000","message":"Of course you can merge it, but I still think that end users (operators) wouldn\u0027t be happy to see message like\n\n \"\u0027tag,1\u0027 does not match \u0027^[^,/]*$\u0027\".","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b538b75dd5a29f4e930f3f06d89159494bfa5b91","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                invalid_tags.append(tag)"},{"line_number":148,"context_line":"        if invalid_tags:"},{"line_number":149,"context_line":"            msg \u003d (_(\"Tags \u0027%s\u0027 are invalid. Each tag must be a string \""},{"line_number":150,"context_line":"                     \"without characters \u0027/\u0027 and \u0027,\u0027.\") % invalid_tags)"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        tag_count \u003d len(body[\u0027tags\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_d1f948ca","side":"PARENT","line":150,"in_reply_to":"1a6eadb0_9dec47c9","updated":"2016-12-13 09:13:46.000000000","message":"I think should be fine as you know we have those information in api-ref very clear- http://developer.openstack.org/api-ref/compute/#server-tags-servers-tags","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"2f16350ac842ea8731fcc54a16fcb75b50125eec","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit \""},{"line_number":156,"context_line":"                     \"%(max)d. The number of tags in request is %(count)d.\")"},{"line_number":157,"context_line":"                   % {\u0027max\u0027: objects.instance.MAX_TAG_COUNT,"},{"line_number":158,"context_line":"                      \u0027count\u0027: tag_count})"},{"line_number":159,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        long_tags \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_1dc2f733","side":"PARENT","line":158,"updated":"2016-12-13 08:11:19.000000000","message":"this case is rare. I think that no one will try to add 51 tags in one request. So I\u0027m ok with removing it.","commit_id":"9e0ea7a3ee0c97d9212e592c2fa141748fa08f98"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"0bf32784cd53a0324f77760117a71134ef71009e","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_0479cdfc","line":100,"range":{"start_line":94,"start_character":0,"end_line":100,"end_character":59},"updated":"2016-12-13 03:07:33.000000000","message":"humm, this part can be removed also according to parameter_types.tag.","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"35f1eb8151135a41b61bbad9f9dedbc9519a7403","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_64d601c7","line":100,"range":{"start_line":94,"start_character":0,"end_line":100,"end_character":59},"in_reply_to":"1a6eadb0_0479cdfc","updated":"2016-12-13 03:09:54.000000000","message":"actually we validate the id here which is not in request body","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e8b5b63373d23181239a2a9c5b95ab11ee1e2f6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        context.can(st_policies.POLICY_ROOT % \u0027update\u0027)"},{"line_number":92,"context_line":"        self._check_instance_in_valid_state(context, server_id, \u0027update tag\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            jsonschema.validate(id, parameter_types.tag)"},{"line_number":96,"context_line":"        except jsonschema.ValidationError as e:"},{"line_number":97,"context_line":"            msg \u003d (_(\"Tag \u0027%(tag)s\u0027 is invalid. It must be a string without \""},{"line_number":98,"context_line":"                     \"characters \u0027/\u0027 and \u0027,\u0027. Validation error message: \""},{"line_number":99,"context_line":"                     \"%(err)s\") % {\u0027tag\u0027: id, \u0027err\u0027: e.message})"},{"line_number":100,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        try:"},{"line_number":103,"context_line":"            tags \u003d objects.TagList.get_by_resource_id(context, server_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_c4e515a9","line":100,"range":{"start_line":94,"start_character":0,"end_line":100,"end_character":59},"in_reply_to":"1a6eadb0_0479cdfc","updated":"2016-12-13 03:10:02.000000000","message":"yea","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e8b5b63373d23181239a2a9c5b95ab11ee1e2f6","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_a4d819f1","line":110,"range":{"start_line":107,"start_character":8,"end_line":110,"end_character":59},"updated":"2016-12-13 03:10:02.000000000","message":"And this?","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"89a5cf60be6e510683fd204aa0db8a2eb9667a20","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_87a31f9e","line":110,"range":{"start_line":107,"start_character":8,"end_line":110,"end_character":59},"in_reply_to":"1a6eadb0_4444a573","updated":"2016-12-13 03:40:59.000000000","message":"oh, yea","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"32a2fc34c55a69ede40cc11e8c618246d1c44744","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_4444a573","line":110,"range":{"start_line":107,"start_character":8,"end_line":110,"end_character":59},"in_reply_to":"1a6eadb0_a4d819f1","updated":"2016-12-13 03:16:50.000000000","message":"I guess this case cannot be covered with json-schema because this case can happen after the previous operation is 1 less than MAX_TAG_COUNT.","commit_id":"8f618682693775bd55448c11815e22472230cc3f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"973fdbb8d79b23840c05aea80931d7fa31728b66","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":105,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if len(tags) \u003e\u003d objects.instance.MAX_TAG_COUNT:"},{"line_number":108,"context_line":"            msg \u003d (_(\"The number of tags exceeded the per-server limit %d\")"},{"line_number":109,"context_line":"                   % objects.instance.MAX_TAG_COUNT)"},{"line_number":110,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if id in _get_tags_names(tags):"},{"line_number":113,"context_line":"            # NOTE(snikitin): server already has specified tag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_e47e91ad","line":110,"range":{"start_line":107,"start_character":8,"end_line":110,"end_character":59},"in_reply_to":"1a6eadb0_a4d819f1","updated":"2016-12-13 03:15:57.000000000","message":"actually this one also cannot be moved as it validate against dynamic fetch of tags at L103","commit_id":"8f618682693775bd55448c11815e22472230cc3f"}],"nova/api/validation/parameter_types.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6ee3d6cc202170b96e8c83a7517e57ef940b3bab","unresolved":false,"context_lines":[{"line_number":399,"context_line":""},{"line_number":400,"context_line":"tag \u003d {"},{"line_number":401,"context_line":"    \"type\": \"string\","},{"line_number":402,"context_line":"    \"minLength\": 1, \"maxLength\": tag.MAX_TAG_LENGTH,"},{"line_number":403,"context_line":"    \"pattern\": \"^[^,/]*$\""},{"line_number":404,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_22feab05","line":402,"range":{"start_line":402,"start_character":4,"end_line":402,"end_character":18},"updated":"2016-12-08 06:25:22.000000000","message":"Please check this. in current code we did not checked tag with zero length(i think) but here i am adding min length as 1 which should be logically.\n\nHope this is not issue.","commit_id":"7b652cada02e8ee4a05c0f5a67a1b57fa2babb99"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0672bf709634ea7d5a36e1045d964b537e34be50","unresolved":false,"context_lines":[{"line_number":399,"context_line":""},{"line_number":400,"context_line":"tag \u003d {"},{"line_number":401,"context_line":"    \"type\": \"string\","},{"line_number":402,"context_line":"    \"minLength\": 1, \"maxLength\": tag.MAX_TAG_LENGTH,"},{"line_number":403,"context_line":"    \"pattern\": \"^[^,/]*$\""},{"line_number":404,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_19f679d7","line":402,"range":{"start_line":402,"start_character":4,"end_line":402,"end_character":18},"in_reply_to":"3a71b18c_22feab05","updated":"2016-12-08 11:11:13.000000000","message":"[root@faydevnt ~] # curl -g -i -X PUT http://9.60.18.229:8774/v2.1/78649a9e795f4c42b1975a1f1d923c64/servers/57c948ae-753a-4549-b62e-b763e775e50f/tags -H \"Accept: application/json\" -H \"User-Agent: python-novaclient\" -H \"OpenStack-API-Version: compute 2.37\" -H \"X-OpenStack-Nova-API-Version: 2.37\" -H \"X-Auth-Token: 4451f4afd5e54914984b621a2ffe2e68\" -H \"Content-Type: application/json\" -d \u0027{\"tags\": [\"\", \"\"]}\u0027\nHTTP/1.1 200 OK\nContent-Length: 14\nContent-Type: application/json\nOpenstack-Api-Version: compute 2.37\nX-Openstack-Nova-Api-Version: 2.37\nVary: OpenStack-API-Version\nVary: X-OpenStack-Nova-API-Version\nX-Compute-Request-Id: req-ae45d4fc-ba91-4863-ab35-590b287de631\nDate: Thu, 08 Dec 2016 11:12:51 GMT\n\n{\"tags\": [\"\"]}[root@nova server-tag-list 57c948ae-753a-4549-b62e-b763e775e50f\n+-----+\n| Tag |\n+-----+\n|     |\n+-----+\n\n\nseems you are right, this blank doesn\u0027t make sense, we need fix it","commit_id":"7b652cada02e8ee4a05c0f5a67a1b57fa2babb99"}]}
