)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2012-11-13 13:12:10 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"the patch introduces an API extension for LBaaS service"},{"line_number":8,"context_line":"according to lbaas-restapi-tenant blueprint"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Change-Id: Ic2fd4debc4969389b395ce7352ab208c6854018b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAMH%2F%2F%2Bf4%3D","line":8,"updated":"2012-11-13 14:24:10.000000000","message":"According to the convention of git commit message, 1st line is a summary line, 2nd is a blank line, and the detail description should be 3rd line or after.\n\nIf you move the blueprint name after the keyword \"blueprint\" like \"blueprint lbaas-restapi-tenant\" we can get a link to the blueprint on launchpad automatically.","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2012-11-13 13:12:10 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"the patch introduces an API extension for LBaaS service"},{"line_number":8,"context_line":"according to lbaas-restapi-tenant blueprint"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Change-Id: Ic2fd4debc4969389b395ce7352ab208c6854018b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAMH%2F%2F%2BYI%3D","line":8,"in_reply_to":"AAAAMH%2F%2F%2Bf4%3D","updated":"2012-11-13 15:03:50.000000000","message":"Will update the commit message. Thank you.","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Oleg Bondarev \u003cobondarev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2012-11-13 20:59:43 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"the patch introduces an API extension for LBaaS service according to the blueprint lbaas-restapi-tenant"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- API extension"},{"line_number":10,"context_line":"- abstract base class for plugin"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAMH%2F%2F9Xw%3D","line":7,"updated":"2012-11-14 05:54:32.000000000","message":"I think blueprint should be in an independent line at least. Some one prefers to have it just before change-Id.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Oleg Bondarev \u003cobondarev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2012-11-13 20:59:43 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"the patch introduces an API extension for LBaaS service according to the blueprint lbaas-restapi-tenant"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- API extension"},{"line_number":10,"context_line":"- abstract base class for plugin"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAMH%2F%2F8%2FA%3D","line":7,"in_reply_to":"AAAAMH%2F%2F9Xw%3D","updated":"2012-11-14 14:35:38.000000000","message":"Done","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"}],"quantum/api/v2/attributes.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":257,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":258,"context_line":"    if isinstance(data, list):"},{"line_number":259,"context_line":"        for item in data:"},{"line_number":260,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":261,"context_line":"            if msg:"},{"line_number":262,"context_line":"                return msg"},{"line_number":263,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BhE%3D","line":260,"updated":"2012-11-13 12:04:19.000000000","message":"maybe you should also check that the uuid is not repeated in the list more than once.","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":257,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":258,"context_line":"    if isinstance(data, list):"},{"line_number":259,"context_line":"        for item in data:"},{"line_number":260,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":261,"context_line":"            if msg:"},{"line_number":262,"context_line":"                return msg"},{"line_number":263,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bd8%3D","line":260,"in_reply_to":"AAAAMH%2F%2F%2BhE%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":261,"context_line":"            if msg:"},{"line_number":262,"context_line":"                return msg"},{"line_number":263,"context_line":"            return"},{"line_number":264,"context_line":"    else:"},{"line_number":265,"context_line":"        msg \u003d _(\"%s is not a list\") % data"},{"line_number":266,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bic%3D","line":263,"updated":"2012-11-13 12:04:19.000000000","message":"you do not need the return","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":261,"context_line":"            if msg:"},{"line_number":262,"context_line":"                return msg"},{"line_number":263,"context_line":"            return"},{"line_number":264,"context_line":"    else:"},{"line_number":265,"context_line":"        msg \u003d _(\"%s is not a list\") % data"},{"line_number":266,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bd4%3D","line":263,"in_reply_to":"AAAAMH%2F%2F%2Bic%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    if isinstance(data, list):"},{"line_number":253,"context_line":"        for item in data:"},{"line_number":254,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":255,"context_line":"            if msg:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDw%3D","line":252,"updated":"2012-11-13 18:14:19.000000000","message":"Consider:\n\ndef _validate_uuid_list(data, valid_values\u003dNone):\n    if not isinstance(data, list):\n        msg \u003d _(\"%s is not a list\") % data\n    elif len(set(data)) !\u003d len(data):\n        dups \u003d [x for x in data if x in set(data)]\n        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(dups))\n    else:\n        for item in data:\n            msg \u003d _validate_uuid(item)\n            if msg:\n                break\n\n    if msg:\n        LOG.debug(\"validate_uuid_list: %s\", msg)\n    return msg","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    if isinstance(data, list):"},{"line_number":253,"context_line":"        for item in data:"},{"line_number":254,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":255,"context_line":"            if msg:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9rw%3D","line":252,"in_reply_to":"AAAAMH%2F%2F%2BDw%3D","updated":"2012-11-14 00:21:17.000000000","message":"Mark, do you intent do get only the duplicated items?\nIf so, I think the check dups part should be:\n\n import collections\n\n ...\n\n elif len(set(data)) !\u003d len(data):\n     dups \u003d [x for x, y in collections.Counter(a).items() if y \u003e 1]\n     msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(dups))\n\nbecause dups \u003d [x for x in data if x in set(data)] is the same as data according to my test","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    if isinstance(data, list):"},{"line_number":253,"context_line":"        for item in data:"},{"line_number":254,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":255,"context_line":"            if msg:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9SY%3D","line":252,"in_reply_to":"AAAAMH%2F%2F9ns%3D","updated":"2012-11-14 14:32:40.000000000","message":"I think that check for duplication should be the last one so that checking such data: \n[\u003cuuid\u003e, 2, \u003canother_uuid\u003e, 2] \nwould first return \"\u00272\u0027 is not a valid UUID\" \nrather than \"Duplicate items in the list: \u003cuuid\u003e, 2, \u003canother_uuid\u003e, 2\"\nWill redesign the func.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    if isinstance(data, list):"},{"line_number":253,"context_line":"        for item in data:"},{"line_number":254,"context_line":"            msg \u003d _validate_uuid(item)"},{"line_number":255,"context_line":"            if msg:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9ns%3D","line":252,"in_reply_to":"AAAAMH%2F%2F9rw%3D","updated":"2012-11-14 00:28:31.000000000","message":"I think it\u0027s best to just print out:\n\n msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))\n\nand let the user figure out the duplicated items","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        return msg"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def _validate_int(data, valid_values\u003dNone):"},{"line_number":268,"context_line":"    if isinstance(data, int):"},{"line_number":269,"context_line":"        return"},{"line_number":270,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDk%3D","line":267,"updated":"2012-11-13 18:14:19.000000000","message":"If you\u0027re using the conversion function, you will always get an int.  Seems unnecessary to add this validator.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        return msg"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def _validate_int(data, valid_values\u003dNone):"},{"line_number":268,"context_line":"    if isinstance(data, int):"},{"line_number":269,"context_line":"        return"},{"line_number":270,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Nc%3D","line":267,"in_reply_to":"AAAAMH%2F%2F%2BDk%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree, will use only conversion as in patch set 1. Was a bit confused by some previous comments that int validation is needed.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":276,"context_line":"def _validate_int_or_none(data, valid_values\u003dNone):"},{"line_number":277,"context_line":"    if data is None:"},{"line_number":278,"context_line":"        return"},{"line_number":279,"context_line":"    return _validate_int(data, valid_values)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"def _validate_dict(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9oo%3D","line":279,"updated":"2012-11-14 00:21:17.000000000","message":"bool is inherited from int. If you need strict validation, consider a one-liner:\n\n return data is None or (isinstance(data, int) and not isinstance(data, bool))","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":276,"context_line":"def _validate_int_or_none(data, valid_values\u003dNone):"},{"line_number":277,"context_line":"    if data is None:"},{"line_number":278,"context_line":"        return"},{"line_number":279,"context_line":"    return _validate_int(data, valid_values)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"def _validate_dict(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9NM%3D","line":279,"in_reply_to":"AAAAMH%2F%2F9oo%3D","updated":"2012-11-14 14:32:40.000000000","message":"The func will be removed","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":279,"context_line":"    return _validate_int(data, valid_values)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":283,"context_line":"    if isinstance(data, dict):"},{"line_number":284,"context_line":"        return"},{"line_number":285,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9RE%3D","line":282,"updated":"2012-11-14 08:27:59.000000000","message":"This function is useless since you would have to first convert your input to a dict first","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":279,"context_line":"    return _validate_int(data, valid_values)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":283,"context_line":"    if isinstance(data, dict):"},{"line_number":284,"context_line":"        return"},{"line_number":285,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Lk%3D","line":282,"in_reply_to":"AAAAMH%2F%2F9RE%3D","updated":"2012-11-14 14:32:40.000000000","message":"Convert from what? What if an input should be a dict, like\n\"session_persistence\" : {\"type\":\"APP_COOKIE\",\"cookie_name\":\"jsessionid\"}","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"    else:"},{"line_number":286,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":287,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":288,"context_line":"        return msg"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"def convert_to_boolean(data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9oE%3D","line":288,"updated":"2012-11-14 00:21:17.000000000","message":"if not isinstance(data, dict):\n     msg \u003d  _(\"\u0027%s\u0027 is not a dictionary\") % data\n     LOG.debug(\"validate_dict: %s\", msg)\n     return msg","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"    else:"},{"line_number":286,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":287,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":288,"context_line":"        return msg"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"def convert_to_boolean(data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9SI%3D","line":288,"in_reply_to":"AAAAMH%2F%2F9oE%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":373,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":374,"context_line":"              \u0027type:int\u0027: _validate_int,"},{"line_number":375,"context_line":"              \u0027type:int_or_none\u0027: _validate_int_or_none,"},{"line_number":376,"context_line":"              \u0027type:dict\u0027: _validate_dict}"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"# Note: a default of ATTR_NOT_SPECIFIED indicates that an"},{"line_number":379,"context_line":"# attribute is not required, but will be generated by the plugin"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9ro%3D","line":376,"updated":"2012-11-14 00:21:17.000000000","message":"reorder alphabetically?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":373,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":374,"context_line":"              \u0027type:int\u0027: _validate_int,"},{"line_number":375,"context_line":"              \u0027type:int_or_none\u0027: _validate_int_or_none,"},{"line_number":376,"context_line":"              \u0027type:dict\u0027: _validate_dict}"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"# Note: a default of ATTR_NOT_SPECIFIED indicates that an"},{"line_number":379,"context_line":"# attribute is not required, but will be generated by the plugin"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9SA%3D","line":376,"in_reply_to":"AAAAMH%2F%2F9ro%3D","updated":"2012-11-14 14:32:40.000000000","message":"Yes, sure","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"        return msg"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    msg \u003d None"},{"line_number":253,"context_line":"    if not isinstance(data, list):"},{"line_number":254,"context_line":"        msg \u003d _(\"%s is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fu7E%3D","line":251,"updated":"2012-11-28 03:28:58.000000000","message":"Although I prefer this version, maybe this should be fixed for the coding style to be consistent with other functions.\n\n def _validate_uuid_list(data, valid_values\u003dNone):\n     if not isinstance(data, list):\n         msg \u003d _(\"\u0027%s\u0027 is not a list\") % data\n         LOG.debug(\"validate_uuid_list: %s\", msg)\n         return msg\n\n     for item in data:\n         msg \u003d _validate_uuid(item)\n         if msg:\n             LOG.debug(\"validate_uuid_list: %s\", msg)\n             return msg\n\n     if len(set(data)) !\u003d len(data):\n         msg \u003d _(\"Duplicate items in the list: %s\") % \u0027,\u0027.join(data)\n         LOG.debug(\"validate_uuid_list: %s\", msg)\n         return msg","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"        return msg"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    msg \u003d None"},{"line_number":253,"context_line":"    if not isinstance(data, list):"},{"line_number":254,"context_line":"        msg \u003d _(\"%s is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FuqY%3D","line":251,"in_reply_to":"AAAAMH%2F%2Fu7E%3D","updated":"2012-11-28 13:42:39.000000000","message":"My experience is that the \u0027preferred approach\u0027 would be to  optimistically assume the object is iterable (not a list, an iterable is what you need), and deal with it in an exception if not (TypeError I believe).\n\nwidespread use of isinstance is not recommended. I learned that at my own expenses a while ago :)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"        return msg"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    msg \u003d None"},{"line_number":253,"context_line":"    if not isinstance(data, list):"},{"line_number":254,"context_line":"        msg \u003d _(\"%s is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtOQ%3D","line":251,"in_reply_to":"AAAAMH%2F%2FuqY%3D","updated":"2012-11-29 15:17:08.000000000","message":"Imagine if somebody specify a valid uuid \u0027e5069610-744b-42a7-8bd8-ceac1a229cd4\u0027 here instead of list of uuids - then the validator will start to iterate through string and finally will return message \"\u0027e\u0027 is not a valid uuid\" which may be misleading. I think we should have list validation here.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    msg \u003d None"},{"line_number":253,"context_line":"    if not isinstance(data, list):"},{"line_number":254,"context_line":"        msg \u003d _(\"%s is not a list\") % data"},{"line_number":255,"context_line":"    else:"},{"line_number":256,"context_line":"        for item in data:"},{"line_number":257,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0pU%3D","line":254,"updated":"2012-11-21 10:18:20.000000000","message":"Just for consistency can you please consider \"\u0027%s\u0027...","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":252,"context_line":"    msg \u003d None"},{"line_number":253,"context_line":"    if not isinstance(data, list):"},{"line_number":254,"context_line":"        msg \u003d _(\"%s is not a list\") % data"},{"line_number":255,"context_line":"    else:"},{"line_number":256,"context_line":"        for item in data:"},{"line_number":257,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0ow%3D","line":254,"in_reply_to":"AAAAMH%2F%2F0pU%3D","updated":"2012-11-21 11:35:45.000000000","message":"Sure","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"def _validate_uuid_or_none(data, valid_values\u003dNone):"},{"line_number":237,"context_line":"    if data:"},{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7%2Fs%3D","line":237,"updated":"2012-12-06 01:22:24.000000000","message":"What if data is \"\" or {} or []?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"def _validate_uuid_or_none(data, valid_values\u003dNone):"},{"line_number":237,"context_line":"    if data:"},{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7xw%3D","line":237,"in_reply_to":"AAAAMX%2F%2F7%2Fs%3D","updated":"2012-12-06 11:38:03.000000000","message":"then _validate_uuid() returns error message. Actually the logic hasn\u0027t changed from what was in l3 extension (from where it was replaced)","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"def _validate_uuid_or_none(data, valid_values\u003dNone):"},{"line_number":237,"context_line":"    if data:"},{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7nU%3D","line":237,"in_reply_to":"AAAAMX%2F%2F7xw%3D","updated":"2012-12-06 12:46:15.000000000","message":"Sorry, I got your point. Should be \"if data is not None:\" here","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7%2Fg%3D","line":241,"updated":"2012-12-06 01:22:24.000000000","message":"Although I prefer this version, maybe this should be fixed for the coding style to be consistent with other functions.\n\n def _validate_uuid_list(data, valid_values\u003dNone):\n     if not isinstance(data, list):\n         msg \u003d _(\"\u0027%s\u0027 is not a list\") % data\n         LOG.debug(\"validate_uuid_list: %s\", msg)\n         return msg\n\n     for item in data:\n         msg \u003d _validate_uuid(item)\n         if msg:\n             LOG.debug(\"validate_uuid_list: %s\", msg)\n             return msg\n\n     if len(set(data)) !\u003d len(data):\n         msg \u003d _(\"Duplicate items in the list: %s\") % \u0027,\u0027.join(data)\n         LOG.debug(\"validate_uuid_list: %s\", msg)\n         return msg","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7ws%3D","line":241,"in_reply_to":"AAAAMX%2F%2F7%2Fg%3D","updated":"2012-12-06 11:38:03.000000000","message":"What is the reason of having such consistency here? Do you see any issues in avoiding code duplication?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7k4%3D","line":241,"in_reply_to":"AAAAMX%2F%2F7mE%3D","updated":"2012-12-06 14:06:08.000000000","message":"Agree but this is actually not an optimization, it\u0027s kind of refactoring. Could you please clarify what is the convention here?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return _validate_uuid(data)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7mE%3D","line":241,"in_reply_to":"AAAAMX%2F%2F7ws%3D","updated":"2012-12-06 13:19:04.000000000","message":"I also do prefer to avoid code duplication. However, convention should always come before optimization.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":245,"context_line":"    else:"},{"line_number":246,"context_line":"        for item in data:"},{"line_number":247,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uY%3D","line":244,"updated":"2012-12-05 14:45:27.000000000","message":"this message\u0027s locale decided by client side. So we needn\u0027t wrapped by _()","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":245,"context_line":"    else:"},{"line_number":246,"context_line":"        for item in data:"},{"line_number":247,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7xk%3D","line":244,"in_reply_to":"AAAAMX%2F%2F78o%3D","updated":"2012-12-06 11:38:03.000000000","message":"prefer to use same approach for messages as in all other places in this module.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":245,"context_line":"    else:"},{"line_number":246,"context_line":"        for item in data:"},{"line_number":247,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F78o%3D","line":244,"in_reply_to":"AAAAMX%2F%2F8aI%3D","updated":"2012-12-06 02:31:52.000000000","message":"I didn\u0027t describe clear. I means it should depend the http request header \u0027accept-language\u0027. Thanks. Alex.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":241,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":242,"context_line":"    msg \u003d None"},{"line_number":243,"context_line":"    if not isinstance(data, list):"},{"line_number":244,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"},{"line_number":245,"context_line":"    else:"},{"line_number":246,"context_line":"        for item in data:"},{"line_number":247,"context_line":"            msg \u003d _validate_uuid(item)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8aI%3D","line":244,"in_reply_to":"AAAAMX%2F%2F8uY%3D","updated":"2012-12-05 19:51:01.000000000","message":"Not true.  If a client is using their own library, this message should be localized.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"            if msg:"},{"line_number":249,"context_line":"                break"},{"line_number":250,"context_line":"    if not msg and len(set(data)) !\u003d len(data):"},{"line_number":251,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if msg:"},{"line_number":254,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uQ%3D","line":251,"updated":"2012-12-05 14:45:27.000000000","message":"same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"            if msg:"},{"line_number":249,"context_line":"                break"},{"line_number":250,"context_line":"    if not msg and len(set(data)) !\u003d len(data):"},{"line_number":251,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if msg:"},{"line_number":254,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7xg%3D","line":251,"in_reply_to":"AAAAMX%2F%2F8aE%3D","updated":"2012-12-06 11:38:03.000000000","message":"Done","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"            if msg:"},{"line_number":249,"context_line":"                break"},{"line_number":250,"context_line":"    if not msg and len(set(data)) !\u003d len(data):"},{"line_number":251,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if msg:"},{"line_number":254,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8aE%3D","line":251,"in_reply_to":"AAAAMX%2F%2F8uQ%3D","updated":"2012-12-05 19:51:01.000000000","message":"this should be:\n\nmsg \u003d _(\"Duplicate items in the list: %s\") % \u0027, \u0027.join(data)","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if msg:"},{"line_number":254,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"},{"line_number":255,"context_line":"        return msg"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uU%3D","line":254,"updated":"2012-12-05 14:45:27.000000000","message":"log message need wrapped by _()","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027,\u0027.join(data))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if msg:"},{"line_number":254,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"},{"line_number":255,"context_line":"        return msg"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7xU%3D","line":254,"in_reply_to":"AAAAMX%2F%2F8uU%3D","updated":"2012-12-06 11:38:03.000000000","message":"again the same approach as all over the module","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":259,"context_line":"    if not isinstance(data, dict):"},{"line_number":260,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":261,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":262,"context_line":"        return msg"},{"line_number":263,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uM%3D","line":260,"updated":"2012-12-05 14:45:27.000000000","message":"same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":259,"context_line":"    if not isinstance(data, dict):"},{"line_number":260,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":261,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":262,"context_line":"        return msg"},{"line_number":263,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8aA%3D","line":260,"in_reply_to":"AAAAMX%2F%2F8uM%3D","updated":"2012-12-05 19:51:01.000000000","message":"This is correct and consistent with rest of the file.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":258,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":259,"context_line":"    if not isinstance(data, dict):"},{"line_number":260,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":261,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":262,"context_line":"        return msg"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uI%3D","line":261,"updated":"2012-12-05 14:45:27.000000000","message":"same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":258,"context_line":"def _validate_dict(data, valid_values\u003dNone):"},{"line_number":259,"context_line":"    if not isinstance(data, dict):"},{"line_number":260,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % data"},{"line_number":261,"context_line":"        LOG.debug(\"validate_dict: %s\", msg)"},{"line_number":262,"context_line":"        return msg"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7xM%3D","line":261,"in_reply_to":"AAAAMX%2F%2F8uI%3D","updated":"2012-12-06 11:38:03.000000000","message":"the same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7%2F0%3D","line":266,"updated":"2012-12-06 01:22:24.000000000","message":"No need for this line. Conversion is done at quantum/extensions/loadbalancer.py line 157","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7w0%3D","line":266,"in_reply_to":"AAAAMX%2F%2F7%2F0%3D","updated":"2012-12-06 11:38:03.000000000","message":"I believe loadbalancer is not the only place where this validation may be used. What if conversion field is missed in resource attribute declaration for some reason?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7kw%3D","line":266,"in_reply_to":"AAAAMX%2F%2F7mo%3D","updated":"2012-12-06 14:06:08.000000000","message":"Well, I think that validator should handle common case rather than rely that convertion were done beforehand","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7mo%3D","line":266,"in_reply_to":"AAAAMX%2F%2F7w0%3D","updated":"2012-12-06 13:19:04.000000000","message":"Then that would be due to lack of tests and sloppy reviews I assume.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"},{"line_number":270,"context_line":"        return msg"},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uE%3D","line":268,"updated":"2012-12-05 14:45:27.000000000","message":"same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":265,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"},{"line_number":270,"context_line":"        return msg"},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Z8%3D","line":268,"in_reply_to":"AAAAMX%2F%2F8uE%3D","updated":"2012-12-05 19:51:01.000000000","message":"This is correct and consistent with rest of the file.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":266,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":267,"context_line":"    if data \u003c 0:"},{"line_number":268,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":269,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"},{"line_number":270,"context_line":"        return msg"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8t8%3D","line":269,"updated":"2012-12-05 14:45:27.000000000","message":"same","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return _validate_uuid(data)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":243,"context_line":"    msg \u003d None"},{"line_number":244,"context_line":"    if not isinstance(data, list):"},{"line_number":245,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F69g%3D","line":242,"updated":"2012-12-06 22:03:11.000000000","message":"This is a patch I submitted before to remove all duplicate code as you did.\n\n https://review.openstack.org/#/c/16183/1/quantum/api/v2/attributes.py\n\nYou can see that reviewers do not like use of \"break\"s. Then wouldn\u0027t it be better to have the same coding style through out this module?","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return _validate_uuid(data)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"def _validate_uuid_list(data, valid_values\u003dNone):"},{"line_number":243,"context_line":"    msg \u003d None"},{"line_number":244,"context_line":"    if not isinstance(data, list):"},{"line_number":245,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a list\") % data"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6q8%3D","line":242,"in_reply_to":"AAAAMX%2F%2F69g%3D","updated":"2012-12-07 07:46:06.000000000","message":"Agree, let\u0027s do it like in the rest of the module","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":267,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":268,"context_line":"    if data \u003c 0:"},{"line_number":269,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":270,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F68s%3D","line":267,"updated":"2012-12-06 22:03:11.000000000","message":"You said \"I think that validator should handle common case rather than rely that convertion were done beforehand\".\n\nCan you explain why you want to violate the current convention?","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":267,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":268,"context_line":"    if data \u003c 0:"},{"line_number":269,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":270,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6qg%3D","line":267,"in_reply_to":"AAAAMX%2F%2F68s%3D","updated":"2012-12-07 07:46:06.000000000","message":"Does the convention say we should assume that data passed is a valid integer? Do you really think this check here is an overkill?","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import collections"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from quantum.common import exceptions as q_exc"},{"line_number":23,"context_line":"from quantum.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5Vw%3D","line":20,"updated":"2012-12-10 04:09:29.000000000","message":"This line should be placed between lines 17 and 18","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import collections"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from quantum.common import exceptions as q_exc"},{"line_number":23,"context_line":"from quantum.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5UU%3D","line":20,"in_reply_to":"AAAAMX%2F%2F5Vw%3D","updated":"2012-12-10 05:59:31.000000000","message":"Done","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":268,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":269,"context_line":"    if data \u003c 0:"},{"line_number":270,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":271,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F6Po%3D","line":268,"updated":"2012-12-07 17:56:51.000000000","message":"The fact that you are doing conversion in this line implies that data could not be an int type.\n\nThen what would happen if data fails to convert to an int? In this case \u0027data\u0027 will be an error string returned from convert_to_int. Therefore \"if data \u003c 0\" would be always False and this function will return None.\n\nWhat if data is int? Then why would we need conversion in the first place?\n\nI do not think this line is a overkill. Its just that logically this line doesn\u0027t make sense if conversion is done like this. This line needs at least a check if \u0027data\u0027 is a str or not if you are concerned about cases when \u0027data\u0027 is not given as an int.","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def _validate_non_negative(data, valid_values\u003dNone):"},{"line_number":268,"context_line":"    data \u003d convert_to_int(data)"},{"line_number":269,"context_line":"    if data \u003c 0:"},{"line_number":270,"context_line":"        msg \u003d _(\"\u0027%s\u0027 should be non-negative\") % data"},{"line_number":271,"context_line":"        LOG.debug(\"validate_non_negative: %s\", msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5Ts%3D","line":268,"in_reply_to":"AAAAMX%2F%2F6Po%3D","updated":"2012-12-10 05:59:31.000000000","message":"Actually convert_to_int() doesn\u0027t return string in case data cannot be converted  - it raises error instead. However this is not what other validators usually do as they are supposed to return messages. I\u0027ll leave this check but with returning error message rather than raising an error.","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":334,"context_line":"        return []"},{"line_number":335,"context_line":"    elif isinstance(data, basestring):"},{"line_number":336,"context_line":"        return [data]"},{"line_number":337,"context_line":"    elif isinstance(data, collections.Iterable):"},{"line_number":338,"context_line":"        return list(data)"},{"line_number":339,"context_line":"    else:"},{"line_number":340,"context_line":"        return [data]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5V8%3D","line":337,"updated":"2012-12-10 04:09:29.000000000","message":"How about \"hasattr(data, \u0027__iter__\u0027)\"? Then \"elif isinstance(data, basestring):\" above wouldn\u0027t be necessary and be handled together with \"else:\".","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":334,"context_line":"        return []"},{"line_number":335,"context_line":"    elif isinstance(data, basestring):"},{"line_number":336,"context_line":"        return [data]"},{"line_number":337,"context_line":"    elif isinstance(data, collections.Iterable):"},{"line_number":338,"context_line":"        return list(data)"},{"line_number":339,"context_line":"    else:"},{"line_number":340,"context_line":"        return [data]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5UQ%3D","line":337,"in_reply_to":"AAAAMX%2F%2F5V8%3D","updated":"2012-12-10 05:59:31.000000000","message":"Done","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import collections"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"import re"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMX%2F%2F5TA%3D","line":18,"updated":"2012-12-10 06:15:25.000000000","message":"I guess this is not needed anymore?","commit_id":"6b12ac5496e1e3ef328170f5f1c52b21a684b6ee"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import collections"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"import re"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAMX%2F%2F5SQ%3D","line":18,"in_reply_to":"AAAAMX%2F%2F5TA%3D","updated":"2012-12-10 06:28:19.000000000","message":"Yep, thanks for noticing!","commit_id":"6b12ac5496e1e3ef328170f5f1c52b21a684b6ee"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":267,"context_line":"    try:"},{"line_number":268,"context_line":"        data \u003d int(data)"},{"line_number":269,"context_line":"    except (ValueError, TypeError):"},{"line_number":270,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not an integer\") % data"},{"line_number":271,"context_line":"        return msg"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    if data \u003c 0:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5QA%3D","line":270,"updated":"2012-12-10 07:27:48.000000000","message":"Do we need LOG.debug(\"validate_non_negative: %s\", msg)?","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":267,"context_line":"    try:"},{"line_number":268,"context_line":"        data \u003d int(data)"},{"line_number":269,"context_line":"    except (ValueError, TypeError):"},{"line_number":270,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not an integer\") % data"},{"line_number":271,"context_line":"        return msg"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    if data \u003c 0:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5Kg%3D","line":270,"in_reply_to":"AAAAMX%2F%2F5QA%3D","updated":"2012-12-10 10:14:30.000000000","message":"yes of course, thanks","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"            return msg"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":254,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027, \u0027.join(data))"},{"line_number":255,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"},{"line_number":256,"context_line":"        return msg"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1ro%3D","line":254,"updated":"2012-12-13 06:32:09.000000000","message":"this should be \u0027msg \u003d _(\"Duplicate items in the list: %s\" % \u0027), \u0027.join(data)\u0027","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":251,"context_line":"            return msg"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    if len(set(data)) !\u003d len(data):"},{"line_number":254,"context_line":"        msg \u003d _(\"Duplicate items in the list: %s\" % \u0027, \u0027.join(data))"},{"line_number":255,"context_line":"        LOG.debug(\"validate_uuid_list: %s\", msg)"},{"line_number":256,"context_line":"        return msg"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1oM%3D","line":254,"in_reply_to":"AAAAMX%2F%2F1ro%3D","updated":"2012-12-13 12:01:34.000000000","message":"Yeah, see that bracket is in the wrong place, but I believe it should rather be like this:\n\nmsg \u003d _(\"Duplicate items in the list: %s\") % \u0027, \u0027.join(data)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":363,"context_line":"              \u0027type:fixed_ips\u0027: _validate_fixed_ips,"},{"line_number":364,"context_line":"              \u0027type:hostroutes\u0027: _validate_hostroutes,"},{"line_number":365,"context_line":"              \u0027type:ip_address\u0027: _validate_ip_address,"},{"line_number":366,"context_line":"              \u0027type:ip_address_or_none\u0027: _validate_ip_address_or_none,"},{"line_number":367,"context_line":"              \u0027type:ip_pools\u0027: _validate_ip_pools,"},{"line_number":368,"context_line":"              \u0027type:mac_address\u0027: _validate_mac_address,"},{"line_number":369,"context_line":"              \u0027type:nameservers\u0027: _validate_nameservers,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1rA%3D","line":366,"updated":"2012-12-13 06:32:09.000000000","message":"This is same as _validate_uuid_or_none\u0027s suggestion as below","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":366,"context_line":"              \u0027type:ip_address_or_none\u0027: _validate_ip_address_or_none,"},{"line_number":367,"context_line":"              \u0027type:ip_pools\u0027: _validate_ip_pools,"},{"line_number":368,"context_line":"              \u0027type:mac_address\u0027: _validate_mac_address,"},{"line_number":369,"context_line":"              \u0027type:nameservers\u0027: _validate_nameservers,"},{"line_number":370,"context_line":"              \u0027type:non_negative\u0027: _validate_non_negative,"},{"line_number":371,"context_line":"              \u0027type:range\u0027: _validate_range,"},{"line_number":372,"context_line":"              \u0027type:regex\u0027: _validate_regex,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1q4%3D","line":369,"updated":"2012-12-13 06:32:09.000000000","message":"This is same as _validate_uuid_list\u0027s suggestion:\nfunctools.partial(_validate_list, _validate_nameserver)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":367,"context_line":"              \u0027type:ip_pools\u0027: _validate_ip_pools,"},{"line_number":368,"context_line":"              \u0027type:mac_address\u0027: _validate_mac_address,"},{"line_number":369,"context_line":"              \u0027type:nameservers\u0027: _validate_nameservers,"},{"line_number":370,"context_line":"              \u0027type:non_negative\u0027: _validate_non_negative,"},{"line_number":371,"context_line":"              \u0027type:range\u0027: _validate_range,"},{"line_number":372,"context_line":"              \u0027type:regex\u0027: _validate_regex,"},{"line_number":373,"context_line":"              \u0027type:string\u0027: _validate_string,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1rI%3D","line":370,"updated":"2012-12-13 06:32:09.000000000","message":"This can be:\n_validate_integer(rules, data)\n\nuse it as:\n\nfunctools.partial(_validate_integer, lambda: x: x \u003e 0)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":367,"context_line":"              \u0027type:ip_pools\u0027: _validate_ip_pools,"},{"line_number":368,"context_line":"              \u0027type:mac_address\u0027: _validate_mac_address,"},{"line_number":369,"context_line":"              \u0027type:nameservers\u0027: _validate_nameservers,"},{"line_number":370,"context_line":"              \u0027type:non_negative\u0027: _validate_non_negative,"},{"line_number":371,"context_line":"              \u0027type:range\u0027: _validate_range,"},{"line_number":372,"context_line":"              \u0027type:regex\u0027: _validate_regex,"},{"line_number":373,"context_line":"              \u0027type:string\u0027: _validate_string,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1iQ%3D","line":370,"in_reply_to":"AAAAMX%2F%2F1rI%3D","updated":"2012-12-13 12:01:34.000000000","message":"I don\u0027t expect many rules in integer validation, so I think this may be an overkill. validate_non_negative seems more obvious and useful from my point of view.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":373,"context_line":"              \u0027type:string\u0027: _validate_string,"},{"line_number":374,"context_line":"              \u0027type:subnet\u0027: _validate_subnet,"},{"line_number":375,"context_line":"              \u0027type:uuid\u0027: _validate_uuid,"},{"line_number":376,"context_line":"              \u0027type:uuid_or_none\u0027: _validate_uuid_or_none,"},{"line_number":377,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":378,"context_line":"              \u0027type:values\u0027: _validate_values}"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1rU%3D","line":376,"updated":"2012-12-13 06:32:09.000000000","message":"How about:\ndefine _validate_or(validate1, validate2, data)\n\nuse it as:\n\nfunctools.partial(_validate_or, _validate_none, _validate_uuid)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":373,"context_line":"              \u0027type:string\u0027: _validate_string,"},{"line_number":374,"context_line":"              \u0027type:subnet\u0027: _validate_subnet,"},{"line_number":375,"context_line":"              \u0027type:uuid\u0027: _validate_uuid,"},{"line_number":376,"context_line":"              \u0027type:uuid_or_none\u0027: _validate_uuid_or_none,"},{"line_number":377,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":378,"context_line":"              \u0027type:values\u0027: _validate_values}"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1dg%3D","line":376,"in_reply_to":"AAAAMX%2F%2F1rU%3D","updated":"2012-12-13 12:01:34.000000000","message":"Well, current patch is about adding an API extension for LBaaS - since such refactoring will touch functions that were not introduced within this patch I think it is better to have a separate bug in the wishlist for it. I can do that. What do you think?","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":374,"context_line":"              \u0027type:subnet\u0027: _validate_subnet,"},{"line_number":375,"context_line":"              \u0027type:uuid\u0027: _validate_uuid,"},{"line_number":376,"context_line":"              \u0027type:uuid_or_none\u0027: _validate_uuid_or_none,"},{"line_number":377,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":378,"context_line":"              \u0027type:values\u0027: _validate_values}"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"# Note: a default of ATTR_NOT_SPECIFIED indicates that an"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1rc%3D","line":377,"updated":"2012-12-13 06:32:09.000000000","message":"How about this:\nDefine as :\ndef _validate_list(data, element_validate\u003dNone):\n     if not isinstance(data, list):\n           ....\n     if element_validate:\n          for e in data:\n               element_validate(e)\nUse it as:\nfunctools.partial(_validate_list, _validate_uuid)\n\nThen we can reuse more validate in future?","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":374,"context_line":"              \u0027type:subnet\u0027: _validate_subnet,"},{"line_number":375,"context_line":"              \u0027type:uuid\u0027: _validate_uuid,"},{"line_number":376,"context_line":"              \u0027type:uuid_or_none\u0027: _validate_uuid_or_none,"},{"line_number":377,"context_line":"              \u0027type:uuid_list\u0027: _validate_uuid_list,"},{"line_number":378,"context_line":"              \u0027type:values\u0027: _validate_values}"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"# Note: a default of ATTR_NOT_SPECIFIED indicates that an"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1dc%3D","line":377,"in_reply_to":"AAAAMX%2F%2F1rc%3D","updated":"2012-12-13 12:01:34.000000000","message":"Following functions should be refactored after this: _validate_ip_pools, _validate_fixed_ips, _validate_nameservers, _validate_hostroutes, _validate_uuid_list - so I still think we need a separate bug for it. Thoughts?","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"}],"quantum/api/v2/base.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def __getattr__(self, name):"},{"line_number":162,"context_line":"        if name in self._member_actions:"},{"line_number":163,"context_line":"            def _handle_action(request, id, body\u003dNone):"},{"line_number":164,"context_line":"                if self._member_actions[name] \u003d\u003d \u0027GET\u0027:"},{"line_number":165,"context_line":"                    return getattr(self._plugin, name)(request.context, id)"},{"line_number":166,"context_line":"                else:"},{"line_number":167,"context_line":"                    return getattr(self._plugin, name)(request.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0pM%3D","line":164,"updated":"2012-11-21 10:18:20.000000000","message":"Can you please explain why you have added this.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def __getattr__(self, name):"},{"line_number":162,"context_line":"        if name in self._member_actions:"},{"line_number":163,"context_line":"            def _handle_action(request, id, body\u003dNone):"},{"line_number":164,"context_line":"                if self._member_actions[name] \u003d\u003d \u0027GET\u0027:"},{"line_number":165,"context_line":"                    return getattr(self._plugin, name)(request.context, id)"},{"line_number":166,"context_line":"                else:"},{"line_number":167,"context_line":"                    return getattr(self._plugin, name)(request.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fupk%3D","line":164,"in_reply_to":"AAAAMH%2F%2F0aA%3D","updated":"2012-11-28 13:42:39.000000000","message":"Not a bad point.\nThis __get_attr__ method was introduce with the l3 extensions, but seems it\u0027s neglecting methods implementing member actions often do not have the same signature. I have a suspect the API layer only calls it for custom member actions, such as add_router_interface.\n\nBut in theory it could be invoked for everything (GET, PUT, and so on). It has to be looked at. This solution however it\u0027s unlikely to solve the issue... the DELETE for instance is body-less too!","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def __getattr__(self, name):"},{"line_number":162,"context_line":"        if name in self._member_actions:"},{"line_number":163,"context_line":"            def _handle_action(request, id, body\u003dNone):"},{"line_number":164,"context_line":"                if self._member_actions[name] \u003d\u003d \u0027GET\u0027:"},{"line_number":165,"context_line":"                    return getattr(self._plugin, name)(request.context, id)"},{"line_number":166,"context_line":"                else:"},{"line_number":167,"context_line":"                    return getattr(self._plugin, name)(request.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0aA%3D","line":164,"in_reply_to":"AAAAMH%2F%2F0nE%3D","updated":"2012-11-21 14:43:36.000000000","message":"Thanks for the explanation. I am not really sure. Maybe Dan, Salvatore or Mark may have a answer.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def __getattr__(self, name):"},{"line_number":162,"context_line":"        if name in self._member_actions:"},{"line_number":163,"context_line":"            def _handle_action(request, id, body\u003dNone):"},{"line_number":164,"context_line":"                if self._member_actions[name] \u003d\u003d \u0027GET\u0027:"},{"line_number":165,"context_line":"                    return getattr(self._plugin, name)(request.context, id)"},{"line_number":166,"context_line":"                else:"},{"line_number":167,"context_line":"                    return getattr(self._plugin, name)(request.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0nE%3D","line":164,"in_reply_to":"AAAAMH%2F%2F0pM%3D","updated":"2012-11-21 11:35:45.000000000","message":"Sure. I added this to handle member actions that are supposed only to return additional data of a resource and do not need body - just to avoid redundant body parameter in plugin\u0027s handler. For example:\n\nget_stats(self, context, pool_id, body)\n   ...\nhere body is redundant.\nBut given that some \u0027GET\u0027 actions may require additional parameters I think this may be reconsidered. \nOne option is to use \u0027inspect\u0027 to know whether body parameter is required by the handler. \nDo you think it\u0027s ok to use inspect here?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def __getattr__(self, name):"},{"line_number":162,"context_line":"        if name in self._member_actions:"},{"line_number":163,"context_line":"            def _handle_action(request, id, body\u003dNone):"},{"line_number":164,"context_line":"                if self._member_actions[name] \u003d\u003d \u0027GET\u0027:"},{"line_number":165,"context_line":"                    return getattr(self._plugin, name)(request.context, id)"},{"line_number":166,"context_line":"                else:"},{"line_number":167,"context_line":"                    return getattr(self._plugin, name)(request.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Ftas%3D","line":164,"in_reply_to":"AAAAMH%2F%2Fupk%3D","updated":"2012-11-29 15:17:08.000000000","message":"I think following should cover the issue:\n\n    def __getattr__(self, name):\n        if name in self._member_actions:\n            def _handle_action(request, id, **kwargs):\n                if \u0027body\u0027 in kwargs:\n                    return getattr(self._plugin, name)(request.context, id, \n                                                       kwargs[\u0027body\u0027])\n                else:\n                    return getattr(self._plugin, name)(request.context, id)\n            return _handle_action\n        else:\n            raise AttributeError","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def __getattr__(self, name):"},{"line_number":172,"context_line":"        if name in self._member_actions:"},{"line_number":173,"context_line":"            def _handle_action(request, id, **kwargs):"},{"line_number":174,"context_line":"                if \u0027body\u0027 in kwargs:"},{"line_number":175,"context_line":"                    body \u003d kwargs.pop(\u0027body\u0027)"},{"line_number":176,"context_line":"                    return getattr(self._plugin, name)(request.context, id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8YQ%3D","line":173,"updated":"2012-12-05 19:51:01.000000000","message":"Why do we have inconsistent method definitions?  I think this a bug that we should fix.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def __getattr__(self, name):"},{"line_number":172,"context_line":"        if name in self._member_actions:"},{"line_number":173,"context_line":"            def _handle_action(request, id, **kwargs):"},{"line_number":174,"context_line":"                if \u0027body\u0027 in kwargs:"},{"line_number":175,"context_line":"                    body \u003d kwargs.pop(\u0027body\u0027)"},{"line_number":176,"context_line":"                    return getattr(self._plugin, name)(request.context, id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7wY%3D","line":173,"in_reply_to":"AAAAMX%2F%2F8YQ%3D","updated":"2012-12-06 11:38:03.000000000","message":"Consider we have GET member_action - then body parameter is redundant in plugin\u0027s handler:\ndef pool_stats(..., id, _body_)\n\nAnother case is when we have member actions in a sub-resource - then parent_id should be passed as well.\nSo method signatures may differ. Thougths?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"}],"quantum/extensions/lbaas.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":30,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":31,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":32,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":33,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":34,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":35,"context_line":"                      \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BiM%3D","line":32,"updated":"2012-11-13 12:04:19.000000000","message":"This does not have to be a UUID. It is a string. Please use \u0027type:string\u0027","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":30,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":31,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":32,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":33,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":34,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":35,"context_line":"                      \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BdU%3D","line":32,"in_reply_to":"AAAAMH%2F%2F%2BiM%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BiE%3D","line":47,"updated":"2012-11-13 12:04:19.000000000","message":"Can this be none? If so use type:ip_address_or_none","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BdQ%3D","line":47,"in_reply_to":"AAAAMH%2F%2F%2BiE%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":51,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":52,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bh8%3D","line":49,"updated":"2012-11-13 12:04:19.000000000","message":"I think you should have validate int or range here.","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":51,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":52,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bbw%3D","line":49,"in_reply_to":"AAAAMH%2F%2F%2Bh8%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":56,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":57,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":58,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                                \u0027is_visible\u0027: True, \u0027default\u0027: {}},"},{"line_number":60,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bh4%3D","line":58,"updated":"2012-11-13 12:04:19.000000000","message":"Is this a boolean? If so then please have validate boolean","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":56,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":57,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":58,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                                \u0027is_visible\u0027: True, \u0027default\u0027: {}},"},{"line_number":60,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bao%3D","line":58,"in_reply_to":"AAAAMH%2F%2F%2Bh4%3D","updated":"2012-11-13 14:09:54.000000000","message":"It\u0027s a dict - will add dict validation","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":58,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                                \u0027is_visible\u0027: True, \u0027default\u0027: {}},"},{"line_number":60,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":62,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bh0%3D","line":60,"updated":"2012-11-13 12:04:19.000000000","message":"validate int","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":58,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":59,"context_line":"                                \u0027is_visible\u0027: True, \u0027default\u0027: {}},"},{"line_number":60,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":62,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bbg%3D","line":60,"in_reply_to":"AAAAMH%2F%2F%2Bh0%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":73,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":74,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":76,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":77,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":78,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":79,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bhw%3D","line":76,"updated":"2012-11-13 12:04:19.000000000","message":"Same as above","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":73,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":74,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":75,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":76,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":77,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":78,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":79,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BdM%3D","line":76,"in_reply_to":"AAAAMH%2F%2F%2Bhw%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":116,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":117,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":118,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":119,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":120,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":121,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":122,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bhs%3D","line":119,"updated":"2012-11-13 12:04:19.000000000","message":"same as above","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":116,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":117,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":118,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":119,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":120,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":121,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":122,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BdI%3D","line":119,"in_reply_to":"AAAAMH%2F%2F%2Bhs%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":124,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":125,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":126,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":127,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bhk%3D","line":126,"updated":"2012-11-13 12:04:19.000000000","message":"same as above","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":124,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":125,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":126,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":127,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bco%3D","line":126,"in_reply_to":"AAAAMH%2F%2F%2Bhk%3D","updated":"2012-11-13 14:09:54.000000000","message":"address is mandatory here, can\u0027t be none","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":126,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":127,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":130,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":131,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bhg%3D","line":128,"updated":"2012-11-13 12:04:19.000000000","message":"Maybe range check?","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":126,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":127,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":130,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":131,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BbQ%3D","line":128,"in_reply_to":"AAAAMH%2F%2F%2Bhg%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":130,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":131,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":132,"context_line":"                   \u0027default\u0027: 1,"},{"line_number":133,"context_line":"                   \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":134,"context_line":"                   \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bhc%3D","line":131,"updated":"2012-11-13 12:04:19.000000000","message":"Range check?","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":129,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":130,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":131,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":132,"context_line":"                   \u0027default\u0027: 1,"},{"line_number":133,"context_line":"                   \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":134,"context_line":"                   \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BdA%3D","line":131,"in_reply_to":"AAAAMH%2F%2F%2Bhc%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":145,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":146,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":147,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":148,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":149,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":150,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":151,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BhY%3D","line":148,"updated":"2012-11-13 12:04:19.000000000","message":"same as above","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":145,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":146,"context_line":"               \u0027is_visible\u0027: True},"},{"line_number":147,"context_line":"        \u0027tenant_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":148,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":149,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":150,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":151,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Bck%3D","line":148,"in_reply_to":"AAAAMH%2F%2F%2BhY%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":152,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":153,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":154,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":155,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":156,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BhU%3D","line":154,"updated":"2012-11-13 12:04:19.000000000","message":"validate int","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":152,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":153,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":154,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":155,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":156,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BbI%3D","line":154,"in_reply_to":"AAAAMH%2F%2F%2BhU%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":155,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":156,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BhQ%3D","line":157,"updated":"2012-11-13 12:04:19.000000000","message":"validate int","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":155,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":156,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BbE%3D","line":157,"in_reply_to":"AAAAMH%2F%2F%2BhQ%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cb2ca5a4cb3fbaea9b6eab9909acbcab29ab7d83","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BhM%3D","line":160,"updated":"2012-11-13 12:04:19.000000000","message":"validate int","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"014237352670c91aff952d45d86aeee0c08af723","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2BbA%3D","line":160,"in_reply_to":"AAAAMH%2F%2F%2BhM%3D","updated":"2012-11-13 14:09:54.000000000","message":"Done","commit_id":"9498dde739142001834b2c90069ef1a7499719b6"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BCk%3D","line":1,"updated":"2012-11-13 18:14:19.000000000","message":"Please rename this file loadbalancer.py","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9OI%3D","line":1,"in_reply_to":"AAAAMH%2F%2F%2BCk%3D","updated":"2012-11-14 14:32:40.000000000","message":"Ok","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from abc import abstractmethod"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.api.v2 import attributes as attr"},{"line_number":21,"context_line":"from quantum.api.v2 import base"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BJY%3D","line":18,"updated":"2012-11-13 18:14:19.000000000","message":"import abc","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from abc import abstractmethod"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.api.v2 import attributes as attr"},{"line_number":21,"context_line":"from quantum.api.v2 import base"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9OE%3D","line":18,"in_reply_to":"AAAAMH%2F%2F%2BJY%3D","updated":"2012-11-14 14:32:40.000000000","message":"in l3 extension it is \n\"from abc import abstractmethod\".\nWhy is it important?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":43,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":44,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BLM%3D","line":45,"updated":"2012-11-13 18:14:19.000000000","message":"Consider ip_address for API coherence.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":43,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":44,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9lk%3D","line":45,"in_reply_to":"AAAAMH%2F%2F%2BLM%3D","updated":"2012-11-14 01:18:07.000000000","message":"address should be ok under VIP context.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":43,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":44,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":45,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Qc%3D","line":45,"in_reply_to":"AAAAMH%2F%2F9lk%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree with Leon","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":51,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":52,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BKk%3D","line":49,"updated":"2012-11-13 18:14:19.000000000","message":"port is confusing.  Consider: protocol_port","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":51,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":52,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9qA%3D","line":49,"in_reply_to":"AAAAMH%2F%2F%2BKk%3D","updated":"2012-11-14 00:21:17.000000000","message":"listen_port could be another candidte","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":51,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":52,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9nY%3D","line":49,"in_reply_to":"AAAAMH%2F%2F%2BKk%3D","updated":"2012-11-14 01:18:07.000000000","message":"port should be ok under VIP context. I don\u0027t think it\u0027s confusing to people using LBaaS.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":47,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":48,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":49,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":51,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":52,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9QY%3D","line":49,"in_reply_to":"AAAAMH%2F%2F9nY%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree with Leon","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":59,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":60,"context_line":"                                \u0027default\u0027: {},"},{"line_number":61,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9RA%3D","line":61,"updated":"2012-11-14 08:27:59.000000000","message":"You should rather convert the input to a dict than validating it.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":59,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":60,"context_line":"                                \u0027default\u0027: {},"},{"line_number":61,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9OM%3D","line":61,"in_reply_to":"AAAAMH%2F%2F9RA%3D","updated":"2012-11-14 14:32:40.000000000","message":"Convert from what? According to the API there should be a dict here: \"session_persistence\" : {\"type\":\"APP_COOKIE\", \"cookie_name\":\"jsessionid\"}","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":65,"context_line":"                             \u0027validate\u0027: {\u0027type:int_or_none\u0027: None},"},{"line_number":66,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDg%3D","line":65,"updated":"2012-11-13 18:14:19.000000000","message":"What if posted val is \"4\"?  Is this acceptable input?  Seems like it should be since we\u0027re converting ints elsewhere.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":65,"context_line":"                             \u0027validate\u0027: {\u0027type:int_or_none\u0027: None},"},{"line_number":66,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9m8%3D","line":65,"in_reply_to":"AAAAMH%2F%2F%2BDg%3D","updated":"2012-11-14 01:18:07.000000000","message":"4 (integer) is a valid input. Internally there should be a max value to validate it.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":65,"context_line":"                             \u0027validate\u0027: {\u0027type:int_or_none\u0027: None},"},{"line_number":66,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9qM%3D","line":65,"in_reply_to":"AAAAMH%2F%2F%2BDg%3D","updated":"2012-11-14 00:21:17.000000000","message":"Also the validation wouldn\u0027t pass if this defaults to attr.ATTR_NOT_SPECIFIED","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":63,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":64,"context_line":"                             \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":65,"context_line":"                             \u0027validate\u0027: {\u0027type:int_or_none\u0027: None},"},{"line_number":66,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9K0%3D","line":65,"in_reply_to":"AAAAMH%2F%2F9m8%3D","updated":"2012-11-14 14:32:40.000000000","message":"Will use 0 as a default value and conversion to int","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"},{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDc%3D","line":70,"updated":"2012-11-13 18:14:19.000000000","message":"convert_to always returns a bool.  Validate is redundant.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"},{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9m4%3D","line":70,"in_reply_to":"AAAAMH%2F%2F%2BDc%3D","updated":"2012-11-14 01:18:07.000000000","message":"Should be OK as I saw this is the same as L3 extension implementation.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":68,"context_line":"                           \u0027default\u0027: True,"},{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Kw%3D","line":70,"in_reply_to":"AAAAMH%2F%2F9m4%3D","updated":"2012-11-14 14:32:40.000000000","message":"+1","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":74,"context_line":"    },"},{"line_number":75,"context_line":"    \u0027pools\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9qE%3D","line":72,"updated":"2012-11-14 00:21:17.000000000","message":"no validation needed?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":74,"context_line":"    },"},{"line_number":75,"context_line":"    \u0027pools\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9OA%3D","line":72,"in_reply_to":"AAAAMH%2F%2F9mQ%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree with Leon","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":70,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":71,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":72,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":73,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":74,"context_line":"    },"},{"line_number":75,"context_line":"    \u0027pools\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9mQ%3D","line":72,"in_reply_to":"AAAAMH%2F%2F9qE%3D","updated":"2012-11-14 01:18:07.000000000","message":"Not required. It\u0027s a return value.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":84,"context_line":"                   \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":85,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":86,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9lo%3D","line":84,"updated":"2012-11-14 01:18:07.000000000","message":"\u0027vip_id\" should also be required as tenant_id. Otherwise, there is no way to specify vip_id later.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":84,"context_line":"                   \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":85,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":86,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Lg%3D","line":84,"in_reply_to":"AAAAMH%2F%2F9lo%3D","updated":"2012-11-14 14:32:40.000000000","message":"Agree","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":84,"context_line":"                   \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":85,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":86,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":88,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9pc%3D","line":85,"updated":"2012-11-14 00:21:17.000000000","message":"this validation won\u0027t pass if defaults to attr.ATTR_NOT_SPECIFIED","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":84,"context_line":"                   \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":85,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":86,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":87,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":88,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9LU%3D","line":85,"in_reply_to":"AAAAMH%2F%2F9pc%3D","updated":"2012-11-14 14:32:40.000000000","message":"default will be removed, vip_id is required","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":95,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":96,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":97,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":98,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":99,"context_line":"        \u0027lb_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":100,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9lM%3D","line":97,"updated":"2012-11-14 01:18:07.000000000","message":"Would be better to validate protocol value against a set of predefined values, such as \"tcp\", \"http\"","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":94,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":95,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":96,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":97,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":98,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":99,"context_line":"        \u0027lb_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":100,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9LQ%3D","line":97,"in_reply_to":"AAAAMH%2F%2F9lM%3D","updated":"2012-11-14 14:32:40.000000000","message":"Don\u0027t think we should limit protocol to some predefined set at this point as it depends on capabilities of loadbalancing devices","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027default\u0027: True,"},{"line_number":112,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":113,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":114,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":115,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":116,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDM%3D","line":113,"updated":"2012-11-13 18:14:19.000000000","message":"convert_to_boolean always returns a bool.  Validate is redundant.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027default\u0027: True,"},{"line_number":112,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":113,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":114,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":115,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":116,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9LM%3D","line":113,"in_reply_to":"AAAAMH%2F%2F%2BDM%3D","updated":"2012-11-14 14:32:40.000000000","message":"Used RESOURCE_ATTRIBUTE_MAP[\u0027networks\u0027][\u0027admin_state_up\u0027]  from quantum/api/v2/attributes.py as a reference","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":130,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":131,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":132,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":133,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":134,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":135,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BKQ%3D","line":132,"updated":"2012-11-13 18:14:19.000000000","message":"protocol_port","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":130,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":131,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":132,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":133,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"},{"line_number":134,"context_line":"                 \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":135,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Kc%3D","line":132,"in_reply_to":"AAAAMH%2F%2F%2BKQ%3D","updated":"2012-11-14 14:32:40.000000000","message":"the same","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":142,"context_line":"                           \u0027default\u0027: True,"},{"line_number":143,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":144,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":145,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":146,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":147,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BDE%3D","line":144,"updated":"2012-11-13 18:14:19.000000000","message":"convert_to always returns a bool.  Validate is redundant.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":142,"context_line":"                           \u0027default\u0027: True,"},{"line_number":143,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":144,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":145,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":146,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":147,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9LA%3D","line":144,"in_reply_to":"AAAAMH%2F%2F%2BDE%3D","updated":"2012-11-14 14:32:40.000000000","message":"the same","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":154,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":155,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":156,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":158,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":159,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BJA%3D","line":157,"updated":"2012-11-13 18:14:19.000000000","message":"Consider checker?_type","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":154,"context_line":"                      \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":155,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":156,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":158,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":159,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9K4%3D","line":157,"in_reply_to":"AAAAMH%2F%2F%2BJA%3D","updated":"2012-11-14 14:32:40.000000000","message":"Sorry, didn\u0027t understand the question. It\u0027s a type of health monitor which may be one of [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":158,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":159,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                  \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":162,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":163,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":164,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BC4%3D","line":161,"updated":"2012-11-13 18:14:19.000000000","message":"This is redundant.   convert_to_int ensures we\u0027ll have an int.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":158,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":159,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                  \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":162,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":163,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":164,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Jw%3D","line":161,"in_reply_to":"AAAAMH%2F%2F%2BC4%3D","updated":"2012-11-14 14:32:40.000000000","message":"int validation will be removed","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":162,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":163,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":164,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":165,"context_line":"                    \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":166,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":167,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":168,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BC0%3D","line":165,"updated":"2012-11-13 18:14:19.000000000","message":"This is redundant.   convert_to_int ensures we\u0027ll have an int.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":163,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":164,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":165,"context_line":"                    \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":166,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":167,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":168,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9k0%3D","line":165,"updated":"2012-11-14 01:18:07.000000000","message":"is there a way to validate that timeout is always less than delay?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":162,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":163,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":164,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":165,"context_line":"                    \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":166,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":167,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":168,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Js%3D","line":165,"in_reply_to":"AAAAMH%2F%2F9k0%3D","updated":"2012-11-14 14:32:40.000000000","message":"I think the plugin should be responsible for such advanced validation","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":166,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":167,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":168,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":169,"context_line":"                        \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":170,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":171,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":172,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BCw%3D","line":169,"updated":"2012-11-13 18:14:19.000000000","message":"This is redundant.   convert_to_int ensures we\u0027ll have an int.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":166,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":167,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":168,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":169,"context_line":"                        \u0027validate\u0027: {\u0027type:int\u0027: None},"},{"line_number":170,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":171,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":172,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Jo%3D","line":169,"in_reply_to":"AAAAMH%2F%2F%2BCw%3D","updated":"2012-11-14 14:32:40.000000000","message":"the same","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":174,"context_line":"                        \u0027default\u0027: \u0027GET\u0027,"},{"line_number":175,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":176,"context_line":"        \u0027path\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":177,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":178,"context_line":"                 \u0027default\u0027: \u0027/\u0027,"},{"line_number":179,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9ks%3D","line":176,"updated":"2012-11-14 01:18:07.000000000","message":"url_path","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":173,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":174,"context_line":"                        \u0027default\u0027: \u0027GET\u0027,"},{"line_number":175,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":176,"context_line":"        \u0027path\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":177,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":178,"context_line":"                 \u0027default\u0027: \u0027/\u0027,"},{"line_number":179,"context_line":"                 \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Jg%3D","line":176,"in_reply_to":"AAAAMH%2F%2F9ks%3D","updated":"2012-11-14 14:32:40.000000000","message":"Ok","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":185,"context_line":"                           \u0027default\u0027: True,"},{"line_number":186,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":187,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":188,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":189,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":190,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BCs%3D","line":187,"updated":"2012-11-13 18:14:19.000000000","message":"This is redundant.   convert_to_boolean ensures we\u0027ll have a bool.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":185,"context_line":"                           \u0027default\u0027: True,"},{"line_number":186,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":187,"context_line":"                           \u0027validate\u0027: {\u0027type:boolean\u0027: None},"},{"line_number":188,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":189,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":190,"context_line":"                   \u0027is_visible\u0027: True}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Jc%3D","line":187,"in_reply_to":"AAAAMH%2F%2F%2BCs%3D","updated":"2012-11-14 14:32:40.000000000","message":"the same","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class LBaaS(object):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def __init__(self):"},{"line_number":198,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9JA%3D","line":195,"updated":"2012-11-14 11:53:38.000000000","message":"I think the name is should be Lbaas according to extension loading mechanism since the module nams is lbaas.py.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class LBaaS(object):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def __init__(self):"},{"line_number":198,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BJ8%3D","line":195,"updated":"2012-11-13 18:14:19.000000000","message":"class Loadbalancer(object):","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class LBaaS(object):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def __init__(self):"},{"line_number":198,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9JY%3D","line":195,"in_reply_to":"AAAAMH%2F%2F%2BJ8%3D","updated":"2012-11-14 14:32:40.000000000","message":"Ok","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class LBaaS(object):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def __init__(self):"},{"line_number":198,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9GU%3D","line":195,"in_reply_to":"AAAAMH%2F%2F9JA%3D","updated":"2012-11-14 14:32:40.000000000","message":"Mark suggests rename the file as well","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":231,"context_line":"                                              member_actions\u003dmember_actions)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            resource \u003d extensions.ResourceExtension(collection_name,"},{"line_number":234,"context_line":"                                                    controller,"},{"line_number":235,"context_line":"                                                    member_actions\u003d"},{"line_number":236,"context_line":"                                                    member_actions)"},{"line_number":237,"context_line":"            resources.append(resource)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9I0%3D","line":234,"updated":"2012-11-14 11:53:38.000000000","message":"the adv service framework needs controller support get_plugin_type() method, I don\u0027t base.create_resource support it. Does it support this method?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":231,"context_line":"                                              member_actions\u003dmember_actions)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            resource \u003d extensions.ResourceExtension(collection_name,"},{"line_number":234,"context_line":"                                                    controller,"},{"line_number":235,"context_line":"                                                    member_actions\u003d"},{"line_number":236,"context_line":"                                                    member_actions)"},{"line_number":237,"context_line":"            resources.append(resource)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9GE%3D","line":234,"in_reply_to":"AAAAMH%2F%2F9I0%3D","updated":"2012-11-14 14:32:40.000000000","message":"It doesn\u0027t and I don\u0027t think it should.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return resources"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class LBaaSPluginBase(object):"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @abstractmethod"},{"line_number":245,"context_line":"    def get_vips(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BJ4%3D","line":242,"updated":"2012-11-13 18:14:19.000000000","message":"class LoadBalancerPluginBase(object):\n   __metaclass__ \u003d abc.ABCMeta","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return resources"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class LBaaSPluginBase(object):"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @abstractmethod"},{"line_number":245,"context_line":"    def get_vips(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9JU%3D","line":242,"in_reply_to":"AAAAMH%2F%2F%2BJ4%3D","updated":"2012-11-14 14:32:40.000000000","message":"Ok","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        pass"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    @abstractmethod"},{"line_number":285,"context_line":"    def stats(self, context, pool_id):"},{"line_number":286,"context_line":"        pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9jc%3D","line":285,"updated":"2012-11-14 01:18:07.000000000","message":"get_stats","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":282,"context_line":"        pass"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    @abstractmethod"},{"line_number":285,"context_line":"    def stats(self, context, pool_id):"},{"line_number":286,"context_line":"        pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9Bg%3D","line":285,"in_reply_to":"AAAAMH%2F%2F9jc%3D","updated":"2012-11-14 14:32:40.000000000","message":"the framework requires function name to be the same as in REST API call:\nGET /v1.0/pools/pool_id/stats\n(http://wiki.openstack.org/Quantum/LBaaS/API_1.0#Retrieve_Traffic_Statistics_for_a_Pool)","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @abstractmethod"},{"line_number":289,"context_line":"    def members(self, context, pool_id):"},{"line_number":290,"context_line":"        pass"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9jY%3D","line":289,"updated":"2012-11-14 01:18:07.000000000","message":"what\u0027s this method?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":286,"context_line":"        pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @abstractmethod"},{"line_number":289,"context_line":"    def members(self, context, pool_id):"},{"line_number":290,"context_line":"        pass"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9BY%3D","line":289,"in_reply_to":"AAAAMH%2F%2F9jY%3D","updated":"2012-11-14 14:32:40.000000000","message":"It should return members of a particular pool\n(http://wiki.openstack.org/Quantum/LBaaS/API_1.0#List_all_Members_of_a_specific_Pool)","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        pass"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @abstractmethod"},{"line_number":293,"context_line":"    def health_monitors(self, context, pool_id):"},{"line_number":294,"context_line":"        pass"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9jU%3D","line":293,"updated":"2012-11-14 01:18:07.000000000","message":"What\u0027s this method?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":290,"context_line":"        pass"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @abstractmethod"},{"line_number":293,"context_line":"    def health_monitors(self, context, pool_id):"},{"line_number":294,"context_line":"        pass"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F8%2Fg%3D","line":293,"in_reply_to":"AAAAMH%2F%2F9jU%3D","updated":"2012-11-14 14:32:40.000000000","message":"Actually I thought here the plugin should handle three actions: list health_monitors of a pool, add h_m to a pool, delete h_m from a pool - depending on request method. But the framework does not allow such things (sent a mail to openstack-dev thread). Probably h_m actions should be renamed in rest api.","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        pass"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    @abstractmethod"},{"line_number":333,"context_line":"    def delete_health_monitor(self, context, id):"},{"line_number":334,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9jE%3D","line":333,"updated":"2012-11-14 01:18:07.000000000","message":"Is there a method to assocaite/deassociate a health_monitor from a pool?","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":330,"context_line":"        pass"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    @abstractmethod"},{"line_number":333,"context_line":"    def delete_health_monitor(self, context, id):"},{"line_number":334,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F9As%3D","line":333,"in_reply_to":"AAAAMH%2F%2F9jE%3D","updated":"2012-11-14 14:32:40.000000000","message":"please see above","commit_id":"e38e8322f8736626b7cf9b567bd1520e48951c39"}],"quantum/extensions/loadbalancer.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":44,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":45,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":46,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":47,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":48,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":49,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FxvA%3D","line":46,"updated":"2012-11-26 03:01:24.000000000","message":"Why does not VIP related to a quantum port so that it will get a address from it?\nSee floatingip.\nWithout it, how do we manage address for vips?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":44,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":45,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":46,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":47,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":48,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":49,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fuos%3D","line":46,"in_reply_to":"AAAAMH%2F%2FxjI%3D","updated":"2012-11-28 13:42:39.000000000","message":"On this regard, I believe the same reasoning behind floating ips should apply. When a floating IP is created, we do not give the id of a port on the external network, but create one.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027network_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":44,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":45,"context_line":"                       \u0027is_visible\u0027: True},"},{"line_number":46,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":47,"context_line":"                    \u0027default\u0027: attr.ATTR_NOT_SPECIFIED,"},{"line_number":48,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address_or_none\u0027: None},"},{"line_number":49,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FxjI%3D","line":46,"in_reply_to":"AAAAMH%2F%2FxvA%3D","updated":"2012-11-26 10:19:54.000000000","message":"Not sure I can answer here as I\u0027m not the author of LBaaS REST API. Probably it is worth initiating a mail thread on this.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":54,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":56,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":57,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":58,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F07Y%3D","line":56,"updated":"2012-11-21 02:26:41.000000000","message":"can we do tighter validation of this at the API layer, similar to health_monitor types below, or are there too many possible values?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":54,"context_line":"        \u0027protocol\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":56,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":57,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":58,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0sI%3D","line":56,"in_reply_to":"AAAAMH%2F%2F07Y%3D","updated":"2012-11-21 09:12:40.000000000","message":"I think most common values are \u0027HTTP\u0027 and \u0027TCP\u0027, but not sure we should limit this here as some devices may use more detailed protocol division (e.g. Cisco ACE has \u0027TCP, \u0027HTTP\u0027, \u0027HTTPS\u0027, \u0027RTSP\u0027, \u0027SIP-TCP\u0027, \u0027SIP-UDP\u0027, \u0027UDP\u0027, \u0027FTP\u0027, \u0027Generic\u0027, \u0027RDP\u0027, \u0027DNS\u0027,\u0027RADIUS\u0027)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F06w%3D","line":62,"updated":"2012-11-21 02:26:41.000000000","message":"able to do tighter validation on the dict (i.e., what members should be there?)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0r8%3D","line":62,"in_reply_to":"AAAAMH%2F%2F06w%3D","updated":"2012-11-21 09:12:40.000000000","message":"Well, actually it depends on the type of session persistance, so \u0027type\u0027 is the only required field and other dict members may differ. I think such kind of advanced validation should be done in the LBaaS plugin.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FuoY%3D","line":62,"in_reply_to":"AAAAMH%2F%2F0r8%3D","updated":"2012-11-28 13:42:39.000000000","message":"Are the possible values driver specific?\n\nIn this case we would like to find a solution at least to properly document this behaviour, as it might harm the ability of writing portable clients for the LBaaS API (ie: clients should be driver specific)\n\nIs there non-trivial validation logic?\n\nIn this case I agree with moving the checks in the plugin as our validation framework cannot address at the moment with things like attribute validation depending on the value of other attributes.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Frvs%3D","line":62,"in_reply_to":"AAAAMH%2F%2FuoY%3D","updated":"2012-11-30 17:01:34.000000000","message":"I agree that we should move the validation into plugin layer. The value of session persistence could be a bit complex.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"},{"line_number":66,"context_line":"                             \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":67,"context_line":"                             \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FuoU%3D","line":64,"updated":"2012-11-28 13:42:39.000000000","message":"I think openstack convention is to default to -1 for unlimited.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: 0,"},{"line_number":66,"context_line":"                             \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":67,"context_line":"                             \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FulE%3D","line":64,"in_reply_to":"AAAAMH%2F%2FuoU%3D","updated":"2012-11-29 15:17:08.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027lb_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":99,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":100,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":101,"context_line":"        \u0027members\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":102,"context_line":"                    \u0027default\u0027: [],"},{"line_number":103,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":104,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FuoM%3D","line":101,"updated":"2012-11-28 13:42:39.000000000","message":"I think there has been some discussion recently on the mailing list to have members as readonly --\u003e hence allow_post \u003d False.\n\nWhen you create a member, you specify a pool_id. This is how you associate members to pools; having several ways of doing the same thing might sound confusing (also the concept of a \u0027dangling member\u0027 seems confusing).\n\nNote: please do not misinterpret \u0027dangling member\u0027!","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027lb_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":99,"context_line":"                      \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":100,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":101,"context_line":"        \u0027members\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":102,"context_line":"                    \u0027default\u0027: [],"},{"line_number":103,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":104,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fukw%3D","line":101,"in_reply_to":"AAAAMH%2F%2FuoM%3D","updated":"2012-11-29 15:17:08.000000000","message":"Sure. Actually current patch is very outdated as it is waiting for updates in the quantum API framework to support sub-resourses.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \u0027health_monitors\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":106,"context_line":"                            \u0027default\u0027: [],"},{"line_number":107,"context_line":"                            \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":108,"context_line":"                            \u0027is_visible\u0027: True},"},{"line_number":109,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":110,"context_line":"                           \u0027default\u0027: True,"},{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FuoI%3D","line":108,"updated":"2012-11-28 13:42:39.000000000","message":"This is still subject of discussions going on on the mailing list and gerrit (http://review.openstack.org/#/c/16888)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F06U%3D","line":114,"updated":"2012-11-21 02:26:41.000000000","message":"It seems we\u0027ve given everything an \u0027admin_status_up\u0027 and \u0027status\u0027 field.  I thin this makes sense for primary objects, but may make less sense for secondary objects that really just represent additional data associated with the primary object.  For example, in the main Quantum API, networks have an admin_status_up and status, but subnets do not.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0qw%3D","line":114,"in_reply_to":"AAAAMH%2F%2F06U%3D","updated":"2012-11-21 09:12:40.000000000","message":"Good comment. I think the reason for this is that every resource (except VIP) can exist independently but want to hear Youcef and other team members thoughts.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fun8%3D","line":114,"in_reply_to":"AAAAMH%2F%2F0qw%3D","updated":"2012-11-28 13:42:39.000000000","message":"I agree with Dan. Adding status here would lead to the question of how the state of a pool might affect the state of the VIP where it\u0027s attached.\n\nProbably a rathole we want to avoid.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Frvg%3D","line":114,"in_reply_to":"AAAAMH%2F%2Ftac%3D","updated":"2012-11-30 17:01:34.000000000","message":"Right, \"admin_status_up\" looks unnecessary but \"status\" is required for each top-class object to indicate the processing progress.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Ftac%3D","line":114,"in_reply_to":"AAAAMH%2F%2Fun8%3D","updated":"2012-11-29 15:17:08.000000000","message":"I believe this field was planned to store the info about resource state on different stages of actual device management, e.g, after adding pool to DB and before deploying it on device - PENDING, then after deploying - ACTIVE or if deploying was unsuccessfull - ERROR.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":118,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":119,"context_line":"               \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F06s%3D","line":116,"updated":"2012-11-21 02:26:41.000000000","message":"this is a more general comment, but similar to the CLI, I wonder if we should preface api names using \"lb-\", as something like \"members\" is a very generic term.  Such name collisions is one place where Quantum\u0027s approach of \"everything is a top-level-resource\" kind of sucks.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":115,"context_line":"    },"},{"line_number":116,"context_line":"    \u0027members\u0027: {"},{"line_number":117,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":118,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":119,"context_line":"               \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0rY%3D","line":116,"in_reply_to":"AAAAMH%2F%2F06s%3D","updated":"2012-11-21 09:12:40.000000000","message":"Actually there will be a common prefix for all LBaaS resources, so I believe \u0027/lbaas/members\u0027 should be ok.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":126,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":127,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":128,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":129,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":130,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":131,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fxuc%3D","line":128,"updated":"2012-11-26 03:01:24.000000000","message":"I think we can connect member to quantum port so that we can manage the address in quantum.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":126,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":127,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":128,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":129,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":130,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":131,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fun4%3D","line":128,"in_reply_to":"AAAAMH%2F%2FxjE%3D","updated":"2012-11-28 13:42:39.000000000","message":"In this case instead i kind of agree with Yong.\nBut this is a discussion for main openstack mailing list, as Oleg says.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":126,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":127,"context_line":"        \u0027address\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":128,"context_line":"                    \u0027validate\u0027: {\u0027type:ip_address\u0027: None},"},{"line_number":129,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":130,"context_line":"        \u0027port\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":131,"context_line":"                 \u0027validate\u0027: {\u0027type:range\u0027: [0, 65535]},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FxjE%3D","line":128,"in_reply_to":"AAAAMH%2F%2Fxuc%3D","updated":"2012-11-26 10:19:54.000000000","message":"the same","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":133,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":134,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":135,"context_line":"                   \u0027default\u0027: 1,"},{"line_number":136,"context_line":"                   \u0027validate\u0027: {\u0027type:range\u0027: [0, 256]},"},{"line_number":137,"context_line":"                   \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":138,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":139,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FunU%3D","line":136,"updated":"2012-11-28 13:42:39.000000000","message":"I can\u0027t find in the spec a range for the weight. Why was it chosen in this way?\n\nI am not sure about 256 as maximum value, but if that\u0027s been agreed I\u0027m ok with it.\nAlso, what does weight 0 means? Is that tantamount to disabling the member?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":133,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":134,"context_line":"        \u0027weight\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":135,"context_line":"                   \u0027default\u0027: 1,"},{"line_number":136,"context_line":"                   \u0027validate\u0027: {\u0027type:range\u0027: [0, 256]},"},{"line_number":137,"context_line":"                   \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":138,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":139,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtaY%3D","line":136,"in_reply_to":"AAAAMH%2F%2FunU%3D","updated":"2012-11-29 15:17:08.000000000","message":"No, it wasn\u0027t agreed, I used HAProxy config manual as a reference: \"The default weight is 1, and the maximal value is 256. A value of 0 means the server will not participate in load-balancing but will still accept persistent connections.\"\n(http://cbonte.github.com/haproxy-dconv/configuration-1.5.html#5-weight)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":142,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":143,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":145,"context_line":"    },"},{"line_number":146,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":147,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fung%3D","line":144,"updated":"2012-11-28 13:42:39.000000000","message":"Same comment as before on status. The status of a member has however some sense.\n\nBut again, I thought the health monitors were reporting it. Or perhaps they\u0027re supposed to update the status of the various members, which is then reported in this way?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":142,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":143,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":144,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":145,"context_line":"    },"},{"line_number":146,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":147,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fuj8%3D","line":144,"in_reply_to":"AAAAMH%2F%2Fung%3D","updated":"2012-11-29 15:17:08.000000000","message":"Currently there is also a discussion on this in mail: [Quantum] [LBaaS] Health Monitor Failure Detection","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":153,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":154,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":155,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":156,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FunM%3D","line":155,"updated":"2012-11-28 13:42:39.000000000","message":"This kind of validation might cause issues id some drivers want to use custom health monitors not included in the above list.\n\nDoesn\u0027t have to be addresses. This is just a heads-up.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":153,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":154,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":155,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":156,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fuj0%3D","line":155,"in_reply_to":"AAAAMH%2F%2FunM%3D","updated":"2012-11-29 15:17:08.000000000","message":"Actually these types are from our REST API","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":156,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FunI%3D","line":159,"updated":"2012-11-28 13:42:39.000000000","message":"We might need a \u0027non-negative integer\u0027 validator","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":156,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":157,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":158,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":159,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fujw%3D","line":159,"in_reply_to":"AAAAMH%2F%2FunI%3D","updated":"2012-11-29 15:17:08.000000000","message":"Agree, will add","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":159,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FunE%3D","line":162,"updated":"2012-11-28 13:42:39.000000000","message":"same here (with -1 for infinite)","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":159,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":160,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtXU%3D","line":162,"in_reply_to":"AAAAMH%2F%2FunE%3D","updated":"2012-11-29 15:17:08.000000000","message":"Sorry, didn\u0027t understand the comment :) -1 does not allow to use non-negative validator","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":166,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":167,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F06k%3D","line":164,"updated":"2012-11-21 02:26:41.000000000","message":"is there a valid range we plan to support here?  I assume negative values are not allowed?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":166,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":167,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0rQ%3D","line":164,"in_reply_to":"AAAAMH%2F%2F06k%3D","updated":"2012-11-21 09:12:40.000000000","message":"Good question! I think [1, 64] range should suit here.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":162,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":163,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":166,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":167,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtW8%3D","line":164,"in_reply_to":"AAAAMH%2F%2F0rQ%3D","updated":"2012-11-29 15:17:08.000000000","message":"will use non-negative validator here as well","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":169,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":170,"context_line":"        \u0027url_path\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":171,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":172,"context_line":"                     \u0027default\u0027: \u0027/\u0027,"},{"line_number":173,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":174,"context_line":"        \u0027expected_codes\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":175,"context_line":"                           \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fum4%3D","line":172,"updated":"2012-11-28 13:42:39.000000000","message":"This default specification will cause url_path to be sent to the plugin even if type is TCP or PING, which does not make sense a lot of sense. \n\nIf the plugin deals with it is not a big deal, but we might want to have a validator that states url_path can be specified only if type is HTTP or HTTPS. I don\u0027t think the validation framework is yet there, but we can do that.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":171,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":172,"context_line":"                     \u0027default\u0027: \u0027/\u0027,"},{"line_number":173,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":174,"context_line":"        \u0027expected_codes\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":175,"context_line":"                           \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":176,"context_line":"                           \u0027default\u0027: \u0027200\u0027,"},{"line_number":177,"context_line":"                           \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fumw%3D","line":174,"updated":"2012-11-28 13:42:39.000000000","message":"I\u0027d consider expected_code_range as expected_codes seems to call for a list.\n\nAlso, validation should probably be for a regex like\n[1-9][0-9]*-[1-9][0-9]*","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":171,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":172,"context_line":"                     \u0027default\u0027: \u0027/\u0027,"},{"line_number":173,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":174,"context_line":"        \u0027expected_codes\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":175,"context_line":"                           \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":176,"context_line":"                           \u0027default\u0027: \u0027200\u0027,"},{"line_number":177,"context_line":"                           \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtWQ%3D","line":174,"in_reply_to":"AAAAMH%2F%2Fumw%3D","updated":"2012-11-29 15:17:08.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":180,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":181,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":182,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":183,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":184,"context_line":"    }"},{"line_number":185,"context_line":"}"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fumo%3D","line":183,"updated":"2012-11-28 13:42:39.000000000","message":"Usual comments. I wonder what status means for a health monitor.\n\nHowever, from the API spec it seems \u0027status\u0027 will be used to describe the phase of the interaction between LBAAS plugin and backend.\n\nFor instance statuses will be:\nPENDING_CREATE, PENDING_DELETE, ERROR, and so on.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":180,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":181,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":182,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":183,"context_line":"                   \u0027is_visible\u0027: True}"},{"line_number":184,"context_line":"    }"},{"line_number":185,"context_line":"}"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FtaM%3D","line":183,"in_reply_to":"AAAAMH%2F%2Fumo%3D","updated":"2012-11-29 15:17:08.000000000","message":"Yes, this is exactly what I meant in one of the previous comments.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":216,"context_line":"            if resource_name \u003d\u003d \u0027pool\u0027:"},{"line_number":217,"context_line":"                member_actions \u003d {\u0027get_pool_stats\u0027: \u0027GET\u0027,"},{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FumI%3D","line":219,"updated":"2012-11-28 13:42:39.000000000","message":"I see \u0027stats\u0027 \u0027members\u0027 and \u0027healt monitors\u0027 as attributes of the pool of type \u0027collection\u0027. I think they should be returned in a GET for the main resource.\n\nIf user want only members or stats for instance, he/she can use fields filtering for that. So those operations might be redundant.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":216,"context_line":"            if resource_name \u003d\u003d \u0027pool\u0027:"},{"line_number":217,"context_line":"                member_actions \u003d {\u0027get_pool_stats\u0027: \u0027GET\u0027,"},{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fujs%3D","line":219,"in_reply_to":"AAAAMH%2F%2FumI%3D","updated":"2012-11-29 15:17:08.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":217,"context_line":"                member_actions \u003d {\u0027get_pool_stats\u0027: \u0027GET\u0027,"},{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0pI%3D","line":220,"updated":"2012-11-21 10:18:20.000000000","message":"FYI - One of the current issues that we have open at the moment is that there are no notification messages for \u0027PUT\u0027.\nIt is not related to this patch, but I would like you just to be aware of it.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":217,"context_line":"                member_actions \u003d {\u0027get_pool_stats\u0027: \u0027GET\u0027,"},{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0mI%3D","line":220,"in_reply_to":"AAAAMH%2F%2F0pI%3D","updated":"2012-11-21 11:35:45.000000000","message":"Ok, thanks for the info.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"},{"line_number":224,"context_line":"                                              resource_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F06Q%3D","line":221,"updated":"2012-11-21 02:26:41.000000000","message":"I think it would be more parallel with the existing Quantum api if we did not have at least the health_monitor actions, and instead just did a POST/DELETE to /health_monitors, specifying the pool_id as a attribute.  of the health_monitor.  In that case, fetching the health monitors for a pool is just doing a \"list of health monitors, filtered by pool_id.  \n\nThe same may apply to members.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"},{"line_number":224,"context_line":"                                              resource_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2F0q8%3D","line":221,"in_reply_to":"AAAAMH%2F%2F06Q%3D","updated":"2012-11-21 09:12:40.000000000","message":"Yes, I also vote for using filters to fetch members and health monitors of a pool. There is a discussion regarding this on openstack-dev (\u0027[openstack-dev] [quantum] [LBaaS] Health monitors REST resource\u0027 thread)\n\nRegarding health monitors the deal is that they have no pool_id field in order to be shared among several pools. So from my point of view adding/deleting health monitors should be implemented as member actions of the pool resource.","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"},{"line_number":224,"context_line":"                                              resource_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FxuQ%3D","line":221,"in_reply_to":"AAAAMH%2F%2F0q8%3D","updated":"2012-11-26 03:01:24.000000000","message":"Can one health monitor work under many pools at the same time?\ndelete_health_monitors will delete health_monitor itself or just delete the relation between pool and the monitor?","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                  \u0027get_pool_members\u0027: \u0027GET\u0027,"},{"line_number":219,"context_line":"                                  \u0027get_pool_health_monitors\u0027: \u0027GET\u0027,"},{"line_number":220,"context_line":"                                  \u0027add_health_monitors\u0027: \u0027PUT\u0027,"},{"line_number":221,"context_line":"                                  \u0027delete_health_monitors\u0027: \u0027PUT\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"            controller \u003d base.create_resource(collection_name,"},{"line_number":224,"context_line":"                                              resource_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fxjw%3D","line":221,"in_reply_to":"AAAAMH%2F%2FxuQ%3D","updated":"2012-11-26 10:19:54.000000000","message":"Yes, one health monitor can work under many pools. delete_health_monitors is a pool member action so it is for deleting relations. However it was decided not to use member actions for this so it will be removed in the next patch set","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: -1,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Zk%3D","line":62,"updated":"2012-12-05 19:51:01.000000000","message":"Seems like there should something that actually validates the keys in this dictionary.  Otherwise, one could legally pass nonsense such as  {\u0027a\u0027:2, \u0027b\u0027:4}.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027connection_limit\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":65,"context_line":"                             \u0027default\u0027: -1,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7wQ%3D","line":62,"in_reply_to":"AAAAMX%2F%2F8Zk%3D","updated":"2012-12-06 11:38:03.000000000","message":"The fact is that the structure of the dict may differ depending on the type of session persistance. I think such advanced validation should be the responsibility of the plugin","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":84,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":85,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":86,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":87,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8uc%3D","line":84,"updated":"2012-12-05 14:45:27.000000000","message":"if we define as\n\u0027\u0027default\u0027: ATTR_NOT_SPECIFIED\u0027,\n\u0027validate\u0027: {\u0027type:uuid\u0027: None}\n\nis it same?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027required_by_policy\u0027: True,"},{"line_number":82,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":83,"context_line":"        \u0027vip_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":84,"context_line":"                   \u0027validate\u0027: {\u0027type:uuid_or_none\u0027: None},"},{"line_number":85,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":86,"context_line":"        \u0027name\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":87,"context_line":"                 \u0027validate\u0027: {\u0027type:string\u0027: None},"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7wM%3D","line":84,"in_reply_to":"AAAAMX%2F%2F8uc%3D","updated":"2012-12-06 11:38:03.000000000","message":"In that case validation would not pass I think.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \u0027members\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":102,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":103,"context_line":"        \u0027health_monitors\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":104,"context_line":"                            \u0027default\u0027: [],"},{"line_number":105,"context_line":"                            \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":106,"context_line":"                            \u0027is_visible\u0027: True},"},{"line_number":107,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Zc%3D","line":104,"updated":"2012-12-05 19:51:01.000000000","message":"This is dangerous because when a request defaults, it will get a reference to this list. Defaulting to this list, could potentially accumulate items across api invocations and result in hard to track bugs.  The default should be None and a convert_to_list function should then convert None to an empty list.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \u0027members\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":102,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":103,"context_line":"        \u0027health_monitors\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":104,"context_line":"                            \u0027default\u0027: [],"},{"line_number":105,"context_line":"                            \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":106,"context_line":"                            \u0027is_visible\u0027: True},"},{"line_number":107,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7rQ%3D","line":104,"in_reply_to":"AAAAMX%2F%2F8Zc%3D","updated":"2012-12-06 11:38:03.000000000","message":"Agree, my only concern here is: if a user specifies a valid uuid string instead of a list: \u0027e5069610-744b-42a7-8bd8-ceac1a229cd4\u0027 - then conversion to list will make it like [\u0027e\u0027, \u00275\u0027,...] and further validation will return \"\u0027e\u0027 is not a valid uuid\" which is misleading for the user. Do you think it is reasonable to convert strings like: \"str\" -\u003e [\"str\"]?","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":161,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":162,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":163,"context_line":"                        \u0027validate\u0027: {\u0027type:range\u0027: [1, 10]},"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":166,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8ZY%3D","line":163,"updated":"2012-12-05 19:51:01.000000000","message":"Why 10?  Seems arbitrary.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":161,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":162,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":163,"context_line":"                        \u0027validate\u0027: {\u0027type:range\u0027: [1, 10]},"},{"line_number":164,"context_line":"                        \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":165,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":166,"context_line":"        \u0027http_method\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7v8%3D","line":163,"in_reply_to":"AAAAMX%2F%2F8ZY%3D","updated":"2012-12-06 11:38:03.000000000","message":"The range is specified in LBaaS API doc: http://wiki.openstack.org/Quantum/LBaaS/API_1.0#Create_a_Health_Monitor","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":173,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":174,"context_line":"        \u0027expected_codes\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":175,"context_line":"                           \u0027validate\u0027: {\u0027type:regex\u0027:"},{"line_number":176,"context_line":"                                        \u0027^(\\d+(\\s*,\\s*\\d+)*)$|^(\\d+-\\d+)$\u0027},"},{"line_number":177,"context_line":"                           \u0027default\u0027: \u0027200\u0027,"},{"line_number":178,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":179,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8ZI%3D","line":176,"updated":"2012-12-05 19:51:01.000000000","message":"This allows for invalid codes (ie 2000) Seems this should be:\n\n^(\\d{3}(\\s*,\\s*\\d{3})*)$|^(\\d{3}-\\d{3})$","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":173,"context_line":"                     \u0027is_visible\u0027: True},"},{"line_number":174,"context_line":"        \u0027expected_codes\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":175,"context_line":"                           \u0027validate\u0027: {\u0027type:regex\u0027:"},{"line_number":176,"context_line":"                                        \u0027^(\\d+(\\s*,\\s*\\d+)*)$|^(\\d+-\\d+)$\u0027},"},{"line_number":177,"context_line":"                           \u0027default\u0027: \u0027200\u0027,"},{"line_number":178,"context_line":"                           \u0027is_visible\u0027: True},"},{"line_number":179,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7v4%3D","line":176,"in_reply_to":"AAAAMX%2F%2F8ZI%3D","updated":"2012-12-06 11:38:03.000000000","message":"Done","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":232,"context_line":"                                              plugin, params,"},{"line_number":233,"context_line":"                                              member_actions\u003dmember_actions)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            resource \u003d extensions.ResourceExtension(collection_name,"},{"line_number":236,"context_line":"                                                    controller,"},{"line_number":237,"context_line":"                                                    member_actions\u003d"},{"line_number":238,"context_line":"                                                    member_actions)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Y8%3D","line":235,"updated":"2012-12-05 19:51:01.000000000","message":"The HACKING rules also say that this code formatting is allowed: (Makes the keyword argument easier to see).\n\nresource \u003d extensions.ResourceExtension(\n     collection_name,\n     controller,\n     member_actions\u003dmember_actions)","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":232,"context_line":"                                              plugin, params,"},{"line_number":233,"context_line":"                                              member_actions\u003dmember_actions)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            resource \u003d extensions.ResourceExtension(collection_name,"},{"line_number":236,"context_line":"                                                    controller,"},{"line_number":237,"context_line":"                                                    member_actions\u003d"},{"line_number":238,"context_line":"                                                    member_actions)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7vw%3D","line":235,"in_reply_to":"AAAAMX%2F%2F8Y8%3D","updated":"2012-12-06 11:38:03.000000000","message":"Done","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        pass"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    @abc.abstractmethod"},{"line_number":324,"context_line":"    def get_member(self, context, id, fields\u003dNone):"},{"line_number":325,"context_line":"        pass"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Ps%3D","line":324,"updated":"2012-12-05 21:25:45.000000000","message":"Where is the get_pool_members method? If we decided to remove it, we need to update the API spec too.\nThe same for get_pool_healthmonitor.  I agree that both members and healthmonitor can be found by get_pool method, but we need to make API spec consistent.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":321,"context_line":"        pass"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    @abc.abstractmethod"},{"line_number":324,"context_line":"    def get_member(self, context, id, fields\u003dNone):"},{"line_number":325,"context_line":"        pass"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7vk%3D","line":324,"in_reply_to":"AAAAMX%2F%2F8Ps%3D","updated":"2012-12-06 11:38:03.000000000","message":"Yes, it was decided to use get_pooI for that purposes. Agree that API spec should be updated. I believe it is not the only inconsistency between the code and the spec - I\u0027m going to update the spec once the patch will be accepted (if Youcef wouldn\u0027t do it first)","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"},{"line_number":251,"context_line":"                                              plugin, params,"},{"line_number":252,"context_line":"                                              allow_bulk\u003dTrue,"},{"line_number":253,"context_line":"                                              member_actions\u003dmember_actions,"},{"line_number":254,"context_line":"                                              parent\u003dparent)"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6ls%3D","line":252,"updated":"2012-12-07 09:49:08.000000000","message":"I think this is the bit that will allow us to update all health_monitors with a single POST to /pool/pool-id/health-monitors. As we can do the same also in a call to PUT /pool/pool-id we would be keeping consistency with other part of the API. \nSo I think it\u0027s ok (still there\u0027s the other principle of not wanting to allow multiple ways of doing the same thing, but this is a weaker point we can re-discuss even after approving this patch)","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":250,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"},{"line_number":251,"context_line":"                                              plugin, params,"},{"line_number":252,"context_line":"                                              allow_bulk\u003dTrue,"},{"line_number":253,"context_line":"                                              member_actions\u003dmember_actions,"},{"line_number":254,"context_line":"                                              parent\u003dparent)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"            resource \u003d extensions.ResourceExtension("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6lw%3D","line":253,"updated":"2012-12-07 09:49:08.000000000","message":"Are you intentionally passing the member actions from the last item in RESOURCE_ATTRIBUTE_MAP?\nThis should be just an empty dict, so why just don\u0027t remove the above line?","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":250,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"},{"line_number":251,"context_line":"                                              plugin, params,"},{"line_number":252,"context_line":"                                              allow_bulk\u003dTrue,"},{"line_number":253,"context_line":"                                              member_actions\u003dmember_actions,"},{"line_number":254,"context_line":"                                              parent\u003dparent)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"            resource \u003d extensions.ResourceExtension("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6kk%3D","line":253,"in_reply_to":"AAAAMX%2F%2F6lw%3D","updated":"2012-12-07 10:21:55.000000000","message":"Good catch! Thanks for pointing!","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.api.v2 import attributes as attr"},{"line_number":21,"context_line":"from quantum.api.v2 import base"},{"line_number":22,"context_line":"from quantum.api import extensions"},{"line_number":23,"context_line":"from quantum import manager"},{"line_number":24,"context_line":"from quantum.plugins.common import constants"},{"line_number":25,"context_line":"from quantum.plugins.services.service_base import ServicePluginBase"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5V0%3D","line":22,"updated":"2012-12-10 04:09:29.000000000","message":"This line should be placed between lines 19 and 20","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from quantum.api.v2 import attributes as attr"},{"line_number":21,"context_line":"from quantum.api.v2 import base"},{"line_number":22,"context_line":"from quantum.api import extensions"},{"line_number":23,"context_line":"from quantum import manager"},{"line_number":24,"context_line":"from quantum.plugins.common import constants"},{"line_number":25,"context_line":"from quantum.plugins.services.service_base import ServicePluginBase"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMX%2F%2F5UM%3D","line":22,"in_reply_to":"AAAAMX%2F%2F5V0%3D","updated":"2012-12-10 05:59:31.000000000","message":"Done","commit_id":"f2c2318492280e0ef965f529527ae61d090768ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":153,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":154,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":155,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":156,"context_line":"                  \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5Ms%3D","line":156,"updated":"2012-12-10 08:41:30.000000000","message":"silly question - why not a range?","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":153,"context_line":"                 \u0027validate\u0027: {\u0027type:values\u0027: [\u0027PING\u0027, \u0027TCP\u0027, \u0027HTTP\u0027, \u0027HTTPS\u0027]},"},{"line_number":154,"context_line":"                 \u0027is_visible\u0027: True},"},{"line_number":155,"context_line":"        \u0027delay\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":156,"context_line":"                  \u0027validate\u0027: {\u0027type:non_negative\u0027: None},"},{"line_number":157,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5KU%3D","line":156,"in_reply_to":"AAAAMX%2F%2F5Ms%3D","updated":"2012-12-10 10:14:30.000000000","message":"it was not limited in the API doc so I decided not to limit it in the patch as well","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":157,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":161,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":162,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":163,"context_line":"                        \u0027validate\u0027: {\u0027type:range\u0027: [1, 10]},"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5Mo%3D","line":160,"updated":"2012-12-10 08:41:30.000000000","message":"this too can be problematic if a negative value is passed. sorry for nit picking. to be honest i personally would leave it as is (same with the above). the loadbalancer will have its own checks and in some cases it may expect a negative number","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":157,"context_line":"                  \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":158,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":159,"context_line":"        \u0027timeout\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":160,"context_line":"                    \u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":161,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":162,"context_line":"        \u0027max_retries\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":163,"context_line":"                        \u0027validate\u0027: {\u0027type:range\u0027: [1, 10]},"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAMX%2F%2F5KY%3D","line":160,"in_reply_to":"AAAAMX%2F%2F5Mo%3D","updated":"2012-12-10 10:14:30.000000000","message":"yes, we should at least allow -1 value which means infinite","commit_id":"3700ce269121786afbfa806dfed479f7fad662c7"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":259,"context_line":"                collection_name,"},{"line_number":260,"context_line":"                controller, parent,"},{"line_number":261,"context_line":"                path_prefix\u003dconstants.COMMON_PREFIXES[constants.LOADBALANCER],"},{"line_number":262,"context_line":"                member_actions\u003dmember_actions)"},{"line_number":263,"context_line":"            resources.append(resource)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMX%2F%2F4EE%3D","line":262,"updated":"2012-12-11 12:59:53.000000000","message":"variable \u0027member_action\u0027 might be used before assignment","commit_id":"e01dfae22cd917ceeaae5a6d1b4b4a9b1a6a256d"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":259,"context_line":"                collection_name,"},{"line_number":260,"context_line":"                controller, parent,"},{"line_number":261,"context_line":"                path_prefix\u003dconstants.COMMON_PREFIXES[constants.LOADBALANCER],"},{"line_number":262,"context_line":"                member_actions\u003dmember_actions)"},{"line_number":263,"context_line":"            resources.append(resource)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAMX%2F%2F4D0%3D","line":262,"in_reply_to":"AAAAMX%2F%2F4EE%3D","updated":"2012-12-11 13:01:10.000000000","message":"Yes, just forgot to remove it from here as well. Thank you","commit_id":"e01dfae22cd917ceeaae5a6d1b4b4a9b1a6a256d"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":58,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F2wo%3D","line":60,"updated":"2012-12-12 13:54:08.000000000","message":"misspelled attribute name, should be \u0027session_persistence\u0027 (otherwise word becomes French :)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \u0027pool_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":58,"context_line":"                    \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":59,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":60,"context_line":"        \u0027session_persistance\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":61,"context_line":"                                \u0027default\u0027: {},"},{"line_number":62,"context_line":"                                \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":63,"context_line":"                                \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1ng%3D","line":60,"in_reply_to":"AAAAMX%2F%2F2wo%3D","updated":"2012-12-13 12:01:34.000000000","message":"Done","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":191,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: \u0027pools\u0027,"},{"line_number":192,"context_line":"                   \u0027member_name\u0027: \u0027pool\u0027},"},{"line_number":193,"context_line":"        \u0027parameters\u0027: {\u0027id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":194,"context_line":"                              \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":195,"context_line":"                              \u0027is_visible\u0027: True}}"},{"line_number":196,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1uA%3D","line":193,"updated":"2012-12-13 02:56:45.000000000","message":"I hit the issue that \"tenant_id\" has to be provided in create_pool_health_monitor method.  This should be such case in this method.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":190,"context_line":"    \u0027health_monitors\u0027: {"},{"line_number":191,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: \u0027pools\u0027,"},{"line_number":192,"context_line":"                   \u0027member_name\u0027: \u0027pool\u0027},"},{"line_number":193,"context_line":"        \u0027parameters\u0027: {\u0027id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":194,"context_line":"                              \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":195,"context_line":"                              \u0027is_visible\u0027: True}}"},{"line_number":196,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1nU%3D","line":193,"in_reply_to":"AAAAMX%2F%2F1uA%3D","updated":"2012-12-13 12:01:34.000000000","message":"Yes, I think we should have tenant_id here as in all other resources.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":197,"context_line":"}"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class LoadBalancer(object):"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @classmethod"},{"line_number":203,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1vI%3D","line":200,"updated":"2012-12-13 02:43:44.000000000","message":"Should rename it to Loadbalancer. Our extension framework will only recoganize Loadbalancer format (No upper case letter in the middle).","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":197,"context_line":"}"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class LoadBalancer(object):"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @classmethod"},{"line_number":203,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1nQ%3D","line":200,"in_reply_to":"AAAAMX%2F%2F1vI%3D","updated":"2012-12-13 12:01:34.000000000","message":"Done","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def get_resources(cls):"},{"line_number":224,"context_line":"        resources \u003d []"},{"line_number":225,"context_line":"        plugin \u003d manager.QuantumManager.get_service_plugins()[constants."},{"line_number":226,"context_line":"                                                              LOADBALANCER]"},{"line_number":227,"context_line":"        for collection_name in RESOURCE_ATTRIBUTE_MAP:"},{"line_number":228,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":229,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1qs%3D","line":226,"updated":"2012-12-13 06:32:09.000000000","message":"how about:\nplugin \u003d manager.QuantumManager.get_service_plugins()[\n    constants.LOADBALANCER]","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def get_resources(cls):"},{"line_number":224,"context_line":"        resources \u003d []"},{"line_number":225,"context_line":"        plugin \u003d manager.QuantumManager.get_service_plugins()[constants."},{"line_number":226,"context_line":"                                                              LOADBALANCER]"},{"line_number":227,"context_line":"        for collection_name in RESOURCE_ATTRIBUTE_MAP:"},{"line_number":228,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":229,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1nM%3D","line":226,"in_reply_to":"AAAAMX%2F%2F1qs%3D","updated":"2012-12-13 12:01:34.000000000","message":"Done","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":249,"context_line":"            parent \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(\u0027parent\u0027)"},{"line_number":250,"context_line":"            params \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].\\"},{"line_number":251,"context_line":"                get(\u0027parameters\u0027)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"},{"line_number":254,"context_line":"                                              plugin, params,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1qw%3D","line":251,"updated":"2012-12-13 06:32:09.000000000","message":"prefer to \nSUB_RESOURCE_ATTRIBUTE_MAP[\n      collection_name].get(\u0027parameters\u0027)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":249,"context_line":"            parent \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(\u0027parent\u0027)"},{"line_number":250,"context_line":"            params \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].\\"},{"line_number":251,"context_line":"                get(\u0027parameters\u0027)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"},{"line_number":254,"context_line":"                                              plugin, params,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1nI%3D","line":251,"in_reply_to":"AAAAMX%2F%2F1qw%3D","updated":"2012-12-13 12:01:34.000000000","message":"Done","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        pass"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    @abc.abstractmethod"},{"line_number":329,"context_line":"    def get_pool_health_monitor(self, context, id, pool_id, fields\u003dNone):"},{"line_number":330,"context_line":"        pass"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1uw%3D","line":329,"updated":"2012-12-13 02:43:44.000000000","message":"What this method actually returns?  If user already know the health_monitor id, user can directly call get_health_monitor.  I don\u0027t think we need this method.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":326,"context_line":"        pass"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    @abc.abstractmethod"},{"line_number":329,"context_line":"    def get_pool_health_monitor(self, context, id, pool_id, fields\u003dNone):"},{"line_number":330,"context_line":"        pass"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1jw%3D","line":329,"in_reply_to":"AAAAMX%2F%2F1uw%3D","updated":"2012-12-13 12:01:34.000000000","message":"Actually this method is not for users but is required by the API framework: the deal is that when deleting a resource (or a sub-resource) we first need to get it in order to verify that the deletion is valid in this context (see quantum.api.v2.base.Controller.delete()). The fact that we are using a sub-resource concept for associating/disassociating purposes brings some side effects :)","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":202,"context_line":"}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class Loadbalancer(object):"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMX%2F%2F0Jo%3D","line":205,"updated":"2012-12-14 11:22:33.000000000","message":"Should it be inherited from extensions.ExtensionDescriptor ?","commit_id":"bc66468daa0eee867a3ecc8a5cdfac85c0f55232"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":202,"context_line":"}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class Loadbalancer(object):"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @classmethod"},{"line_number":208,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMX%2F%2F0JY%3D","line":205,"in_reply_to":"AAAAMX%2F%2F0Jo%3D","updated":"2012-12-14 11:28:53.000000000","message":"According to the ExtensionDescriptor spec it is not a requirement but purely a convenience. Anyway I think we should inherit the extension from it at least to set an example for further service extensions. Thanks.","commit_id":"bc66468daa0eee867a3ecc8a5cdfac85c0f55232"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"unresolved":false,"context_lines":[{"line_number":273,"context_line":"        return LoadBalancerPluginBase"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"class LoadBalancerPluginBase(ServicePluginBase):"},{"line_number":277,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def get_plugin_type(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMX%2F%2F0Js%3D","line":276,"updated":"2012-12-14 11:22:33.000000000","message":"The class needs to be extended from extensions.PluginInterface since it supports correct isinstance verification for meta-classes (by comparing interfaces, not just fact of instantiation). (depended code is in PluginAwareExtensionManager)","commit_id":"bc66468daa0eee867a3ecc8a5cdfac85c0f55232"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":273,"context_line":"        return LoadBalancerPluginBase"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"class LoadBalancerPluginBase(ServicePluginBase):"},{"line_number":277,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def get_plugin_type(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMX%2F%2F0JU%3D","line":276,"in_reply_to":"AAAAMX%2F%2F0Js%3D","updated":"2012-12-14 11:28:53.000000000","message":"Agree","commit_id":"bc66468daa0eee867a3ecc8a5cdfac85c0f55232"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":230,"context_line":"        plugin \u003d manager.QuantumManager.get_service_plugins()["},{"line_number":231,"context_line":"            constants.LOADBALANCER]"},{"line_number":232,"context_line":"        for collection_name in RESOURCE_ATTRIBUTE_MAP:"},{"line_number":233,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":234,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"            member_actions \u003d {}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Zw%3D","line":233,"updated":"2012-12-18 22:29:52.000000000","message":"This seems rather fragile.  With this code we could never add a resource that ends in \"y\". (ie Proxy-\u003eProxies).  The limitation makes sense in the context, but at minimum probably need comment in code to document.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":230,"context_line":"        plugin \u003d manager.QuantumManager.get_service_plugins()["},{"line_number":231,"context_line":"            constants.LOADBALANCER]"},{"line_number":232,"context_line":"        for collection_name in RESOURCE_ATTRIBUTE_MAP:"},{"line_number":233,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":234,"context_line":"            params \u003d RESOURCE_ATTRIBUTE_MAP[collection_name]"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"            member_actions \u003d {}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F84Y%3D","line":233,"in_reply_to":"AAAAM3%2F%2F9Zw%3D","updated":"2012-12-19 08:58:03.000000000","message":"I\u0027ll add a proper comment","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":252,"context_line":"        for collection_name in SUB_RESOURCE_ATTRIBUTE_MAP:"},{"line_number":253,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":254,"context_line":"            parent \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(\u0027parent\u0027)"},{"line_number":255,"context_line":"            params \u003d SUB_RESOURCE_ATTRIBUTE_MAP["},{"line_number":256,"context_line":"                collection_name].get(\u0027parameters\u0027)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Tk%3D","line":255,"updated":"2012-12-18 22:29:52.000000000","message":"This does not look pythonic.  Consider:\n\nparams \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(\n    \u0027paramaters\u0027)","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":252,"context_line":"        for collection_name in SUB_RESOURCE_ATTRIBUTE_MAP:"},{"line_number":253,"context_line":"            resource_name \u003d collection_name[:-1]"},{"line_number":254,"context_line":"            parent \u003d SUB_RESOURCE_ATTRIBUTE_MAP[collection_name].get(\u0027parent\u0027)"},{"line_number":255,"context_line":"            params \u003d SUB_RESOURCE_ATTRIBUTE_MAP["},{"line_number":256,"context_line":"                collection_name].get(\u0027parameters\u0027)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"            controller \u003d base.create_resource(collection_name, resource_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F84U%3D","line":255,"in_reply_to":"AAAAM3%2F%2F9Tk%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"}],"quantum/plugins/common/constants.py":[{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LBAAS \u003d \"LBAAS\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8jo%3D","line":21,"updated":"2012-12-05 17:00:05.000000000","message":"I remember the old version, you are using LOAD_BALANER.  Why we want to change it to Lbaas?  Our plugin name is Loadbalancer so I prefer to have the same name.  We can just leave /lbaas prefix.","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LBAAS \u003d \"LBAAS\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F7vc%3D","line":21,"in_reply_to":"AAAAMX%2F%2F8Xc%3D","updated":"2012-12-06 11:38:03.000000000","message":"Done","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LBAAS \u003d \"LBAAS\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMX%2F%2F8Xc%3D","line":21,"in_reply_to":"AAAAMX%2F%2F8jo%3D","updated":"2012-12-05 19:51:01.000000000","message":"I agree.  The constant should be LOADBALANCER\u003d\"LOADBALANCER\"","commit_id":"044efed76970a1032e37eccec29624aeeb752d65"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"},{"line_number":25,"context_line":"    CORE: \"\","},{"line_number":26,"context_line":"    DUMMY: \"/dummy_svc\","},{"line_number":27,"context_line":"    LOADBALANCER: \"/lbaas\","},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6lg%3D","line":27,"updated":"2012-12-07 09:49:08.000000000","message":"I think we had an email thread were we discussed alternative prefixes. It\u0027s been a few weeks, but we kind of conclude that \u0027lb\u0027 was not actually overlapping with linux bridge (as the \u0027lb\u0027 acronym for it is used only in the code).\n\nAnd also, since all the services can be defined \u0027aas\u0027 the aas suffix is probably irrelevant.","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"},{"line_number":25,"context_line":"    CORE: \"\","},{"line_number":26,"context_line":"    DUMMY: \"/dummy_svc\","},{"line_number":27,"context_line":"    LOADBALANCER: \"/lbaas\","},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAMX%2F%2F6kY%3D","line":27,"in_reply_to":"AAAAMX%2F%2F6lg%3D","updated":"2012-12-07 10:21:55.000000000","message":"Agree","commit_id":"ce95e5b22fc8a412ad079ff284dfa56f0d81da58"}],"quantum/tests/unit/test_attributes.py":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":309,"context_line":"        msg \u003d attributes._validate_uuid(\u002700000000-ffff-ffff-ffff-000000000000\u0027)"},{"line_number":310,"context_line":"        self.assertIsNone(msg)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def test_uuid_list(self):"},{"line_number":313,"context_line":"        # check not a list"},{"line_number":314,"context_line":"        uuids \u003d [None,"},{"line_number":315,"context_line":"                 123,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fu7A%3D","line":312,"updated":"2012-11-28 03:28:58.000000000","message":"Please rename to \"test_validate_uuid_list\"","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":309,"context_line":"        msg \u003d attributes._validate_uuid(\u002700000000-ffff-ffff-ffff-000000000000\u0027)"},{"line_number":310,"context_line":"        self.assertIsNone(msg)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def test_uuid_list(self):"},{"line_number":313,"context_line":"        # check not a list"},{"line_number":314,"context_line":"        uuids \u003d [None,"},{"line_number":315,"context_line":"                 123,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fu1M%3D","line":312,"in_reply_to":"AAAAMH%2F%2Fu7A%3D","updated":"2012-11-28 06:27:56.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":352,"context_line":"            msg \u003d attributes._validate_uuid_list(uuid_list)"},{"line_number":353,"context_line":"            self.assertEquals(msg, None)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def test_dict(self):"},{"line_number":356,"context_line":"        msg \u003d attributes._validate_dict(None)"},{"line_number":357,"context_line":"        self.assertEquals(msg, \"\u0027None\u0027 is not a dictionary\")"},{"line_number":358,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fu68%3D","line":355,"updated":"2012-11-28 03:28:58.000000000","message":"Please rename to \"test_validate_dict\"","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":352,"context_line":"            msg \u003d attributes._validate_uuid_list(uuid_list)"},{"line_number":353,"context_line":"            self.assertEquals(msg, None)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def test_dict(self):"},{"line_number":356,"context_line":"        msg \u003d attributes._validate_dict(None)"},{"line_number":357,"context_line":"        self.assertEquals(msg, \"\u0027None\u0027 is not a dictionary\")"},{"line_number":358,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fu1Q%3D","line":355,"in_reply_to":"AAAAMH%2F%2Fu68%3D","updated":"2012-11-28 06:27:56.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":363,"context_line":"        self.assertEquals(msg, \"\u00271\u0027 is not a dictionary\")"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        msg \u003d attributes._validate_dict([])"},{"line_number":366,"context_line":"        self.assertEquals(msg, \"\u0027[]\u0027 is not a dictionary\")"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        msg \u003d attributes._validate_dict({})"},{"line_number":369,"context_line":"        self.assertIsNone(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2FupQ%3D","line":366,"updated":"2012-11-28 13:42:39.000000000","message":"for value in (None, True, \u00271\u0027, []):\n    self.assertEquals(attributes._validate_dict(value),\n                      \"\u0027%s\u0027 is not a dictionary\" % value)\n\nJust a suggestion for shortening the 356-366 code block. Not really important, it\u0027s just one of those moments when I love acting like a \u0027dict\u0027","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":363,"context_line":"        self.assertEquals(msg, \"\u00271\u0027 is not a dictionary\")"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        msg \u003d attributes._validate_dict([])"},{"line_number":366,"context_line":"        self.assertEquals(msg, \"\u0027[]\u0027 is not a dictionary\")"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        msg \u003d attributes._validate_dict({})"},{"line_number":369,"context_line":"        self.assertIsNone(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMH%2F%2Fujk%3D","line":366,"in_reply_to":"AAAAMH%2F%2FupQ%3D","updated":"2012-11-29 15:17:08.000000000","message":"Done","commit_id":"992306e046f9bdfad618997a9c7425e35ac16644"}],"quantum/tests/unit/test_loadbalancer_plugin.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":39,"context_line":"_get_path \u003d test_api_v2._get_path"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1qc%3D","line":36,"updated":"2012-12-13 06:32:09.000000000","message":"It looks like we didn\u0027t use it.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":39,"context_line":"_get_path \u003d test_api_v2._get_path"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1nA%3D","line":36,"in_reply_to":"AAAAMX%2F%2F1qc%3D","updated":"2012-12-13 12:01:34.000000000","message":"Done","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5983,"name":"Leon Cui","email":"lcui@vmware.com","username":"lcui"},"change_message_id":"85077b7c1b5384d7a47ba9ae1aa5c10b965d49a7","unresolved":false,"context_lines":[{"line_number":458,"context_line":"    def test_create_pool_health_monitor(self):"},{"line_number":459,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":460,"context_line":"        data \u003d {\u0027health_monitor\u0027: {\u0027id\u0027: health_monitor_id,"},{"line_number":461,"context_line":"                                   \u0027tenant_id\u0027: _uuid()}}"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        return_value \u003d copy.deepcopy(data[\u0027health_monitor\u0027])"},{"line_number":464,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1uo%3D","line":461,"updated":"2012-12-13 02:43:44.000000000","message":"tenant_id here looks weird to me.  tenant_id is already defined in health_monitor.  This method is just associating a health_monitor to a pool within the same tenant.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":458,"context_line":"    def test_create_pool_health_monitor(self):"},{"line_number":459,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":460,"context_line":"        data \u003d {\u0027health_monitor\u0027: {\u0027id\u0027: health_monitor_id,"},{"line_number":461,"context_line":"                                   \u0027tenant_id\u0027: _uuid()}}"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        return_value \u003d copy.deepcopy(data[\u0027health_monitor\u0027])"},{"line_number":464,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMX%2F%2F1lA%3D","line":461,"in_reply_to":"AAAAMX%2F%2F1uo%3D","updated":"2012-12-13 12:01:34.000000000","message":"Anyway it should be verified that tenant_id is the same one. I think tenant_id verification is required for any API call - so for creating a sub_resource too.Omitting tenant_id here results in \"HTTPBadRequest: Running without keystyone AuthN requires  that tenant_id is specified\" - so usually tenant_id is fetched from keystone and user doesn\u0027t need to specify it explicitly.","commit_id":"262e2b529fbad7f468beb3c3cca32eccce0df34e"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#  License for the spec"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import unittest"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"from webob import exc"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9ZI%3D","line":18,"updated":"2012-12-18 22:29:52.000000000","message":"Please change this to unittest2 and move to line 21.\n\nimport unittest2 as unittest","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#  License for the spec"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import unittest"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"from webob import exc"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F84M%3D","line":18,"in_reply_to":"AAAAM3%2F%2F9ZI%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # Create the default configurations"},{"line_number":63,"context_line":"        args \u003d [\u0027--config-file\u0027, test_api_v2.etcdir(\u0027quantum.conf.test\u0027)]"},{"line_number":64,"context_line":"        config.parse(args\u003dargs)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        #just stubbing core plugin with LoadBalancer plugin"},{"line_number":67,"context_line":"        cfg.CONF.set_override(\u0027core_plugin\u0027, plugin)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Yw%3D","line":64,"updated":"2012-12-18 22:29:52.000000000","message":"args is not a keyword parameter of parse()","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        # Create the default configurations"},{"line_number":63,"context_line":"        args \u003d [\u0027--config-file\u0027, test_api_v2.etcdir(\u0027quantum.conf.test\u0027)]"},{"line_number":64,"context_line":"        config.parse(args\u003dargs)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        #just stubbing core plugin with LoadBalancer plugin"},{"line_number":67,"context_line":"        cfg.CONF.set_override(\u0027core_plugin\u0027, plugin)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83w%3D","line":64,"in_reply_to":"AAAAM3%2F%2F9Yw%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_vip_create(self):"},{"line_number":86,"context_line":"        vip_id \u003d _uuid()"},{"line_number":87,"context_line":"        data \u003d {\u0027vip\u0027: {\u0027name\u0027: \u0027vip1\u0027, \u0027description\u0027: \u0027descr_vip1\u0027,"},{"line_number":88,"context_line":"                        \u0027subnet_id\u0027: _uuid(), \u0027address\u0027: \u0027127.0.0.1\u0027,"},{"line_number":89,"context_line":"                        \u0027port\u0027: 80, \u0027protocol\u0027: \u0027HTTP\u0027, \u0027pool_id\u0027: _uuid(),"},{"line_number":90,"context_line":"                        \u0027session_persistence\u0027: {\u0027type\u0027: \u0027dummy\u0027},"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Zk%3D","line":87,"updated":"2012-12-18 22:29:52.000000000","message":"The keys of the value dict should be one per line to be consistent with our hacking guidelines.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_vip_create(self):"},{"line_number":86,"context_line":"        vip_id \u003d _uuid()"},{"line_number":87,"context_line":"        data \u003d {\u0027vip\u0027: {\u0027name\u0027: \u0027vip1\u0027, \u0027description\u0027: \u0027descr_vip1\u0027,"},{"line_number":88,"context_line":"                        \u0027subnet_id\u0027: _uuid(), \u0027address\u0027: \u0027127.0.0.1\u0027,"},{"line_number":89,"context_line":"                        \u0027port\u0027: 80, \u0027protocol\u0027: \u0027HTTP\u0027, \u0027pool_id\u0027: _uuid(),"},{"line_number":90,"context_line":"                        \u0027session_persistence\u0027: {\u0027type\u0027: \u0027dummy\u0027},"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83s%3D","line":87,"in_reply_to":"AAAAM3%2F%2F9Zk%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"                        \u0027session_persistence\u0027: {\u0027type\u0027: \u0027dummy\u0027},"},{"line_number":91,"context_line":"                        \u0027connection_limit\u0027: 100, \u0027admin_state_up\u0027: True,"},{"line_number":92,"context_line":"                        \u0027tenant_id\u0027: _uuid()}}"},{"line_number":93,"context_line":"        return_value \u003d copy.deepcopy(data[\u0027vip\u0027])"},{"line_number":94,"context_line":"        return_value.update({\u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id})"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9ZQ%3D","line":93,"updated":"2012-12-18 22:29:52.000000000","message":"Why the deep copy here?  A shallow copy should suffice since all of the value are immutable types.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"                        \u0027session_persistence\u0027: {\u0027type\u0027: \u0027dummy\u0027},"},{"line_number":91,"context_line":"                        \u0027connection_limit\u0027: 100, \u0027admin_state_up\u0027: True,"},{"line_number":92,"context_line":"                        \u0027tenant_id\u0027: _uuid()}}"},{"line_number":93,"context_line":"        return_value \u003d copy.deepcopy(data[\u0027vip\u0027])"},{"line_number":94,"context_line":"        return_value.update({\u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id})"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83o%3D","line":93,"in_reply_to":"AAAAM3%2F%2F9ZQ%3D","updated":"2012-12-19 08:58:03.000000000","message":"\u0027session_persistence\u0027 value is mutable but I believe it doesn\u0027t matter here, will use shallow copy","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":99,"context_line":"        instance.create_vip.assert_called_with(mock.ANY,"},{"line_number":100,"context_line":"                                               vip\u003ddata)"},{"line_number":101,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":102,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":103,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":104,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":105,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Ys%3D","line":102,"updated":"2012-12-18 22:29:52.000000000","message":"The battery of asserts can be simplified considerably:\n\nself.assertEqual(res.json[\u0027vip\u0027], return_value)","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":99,"context_line":"        instance.create_vip.assert_called_with(mock.ANY,"},{"line_number":100,"context_line":"                                               vip\u003ddata)"},{"line_number":101,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":102,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":103,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":104,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":105,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83k%3D","line":102,"in_reply_to":"AAAAM3%2F%2F9Ys%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def test_vip_update(self):"},{"line_number":123,"context_line":"        vip_id \u003d _uuid()"},{"line_number":124,"context_line":"        update_data \u003d {\u0027vip\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":125,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027vip1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":126,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":127,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id}"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Yk%3D","line":125,"updated":"2012-12-18 22:29:52.000000000","message":"this needs to conform to hacking guidelines.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def test_vip_update(self):"},{"line_number":123,"context_line":"        vip_id \u003d _uuid()"},{"line_number":124,"context_line":"        update_data \u003d {\u0027vip\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":125,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027vip1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":126,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":127,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id}"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83g%3D","line":125,"in_reply_to":"AAAAM3%2F%2F9Yk%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":135,"context_line":"        instance.update_vip.assert_called_with(mock.ANY, vip_id,"},{"line_number":136,"context_line":"                                               vip\u003dupdate_data)"},{"line_number":137,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":138,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":139,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":140,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":141,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9YQ%3D","line":138,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":135,"context_line":"        instance.update_vip.assert_called_with(mock.ANY, vip_id,"},{"line_number":136,"context_line":"                                               vip\u003dupdate_data)"},{"line_number":137,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":138,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":139,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":140,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":141,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83Q%3D","line":138,"in_reply_to":"AAAAM3%2F%2F9YQ%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_vip_get(self):"},{"line_number":145,"context_line":"        vip_id \u003d _uuid()"},{"line_number":146,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027vip1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":147,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":148,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id}"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9X4%3D","line":146,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_vip_get(self):"},{"line_number":145,"context_line":"        vip_id \u003d _uuid()"},{"line_number":146,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027vip1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":147,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":148,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vip_id}"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83M%3D","line":146,"in_reply_to":"AAAAM3%2F%2F9X4%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":155,"context_line":"        instance.get_vip.assert_called_with(mock.ANY, vip_id,"},{"line_number":156,"context_line":"                                            fields\u003dmock.ANY)"},{"line_number":157,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":158,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":159,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":160,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":161,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9YM%3D","line":158,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":155,"context_line":"        instance.get_vip.assert_called_with(mock.ANY, vip_id,"},{"line_number":156,"context_line":"                                            fields\u003dmock.ANY)"},{"line_number":157,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":158,"context_line":"        self.assertTrue(\u0027vip\u0027 in res.json)"},{"line_number":159,"context_line":"        vip \u003d res.json[\u0027vip\u0027]"},{"line_number":160,"context_line":"        self.assertEqual(vip[\u0027id\u0027], vip_id)"},{"line_number":161,"context_line":"        self.assertEqual(vip[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83I%3D","line":158,"in_reply_to":"AAAAM3%2F%2F9YM%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def test_pool_create(self):"},{"line_number":174,"context_line":"        pool_id \u003d _uuid()"},{"line_number":175,"context_line":"        hm_id \u003d _uuid()"},{"line_number":176,"context_line":"        data \u003d {\u0027pool\u0027: {\u0027name\u0027: \u0027pool1\u0027, \u0027description\u0027: \u0027descr_pool1\u0027,"},{"line_number":177,"context_line":"                         \u0027subnet_id\u0027: _uuid(), \u0027protocol\u0027: \u0027HTTP\u0027,"},{"line_number":178,"context_line":"                         \u0027lb_method\u0027: \u0027ROUND_ROBIN\u0027,"},{"line_number":179,"context_line":"                         \u0027health_monitors\u0027: [hm_id],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9YI%3D","line":176,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def test_pool_create(self):"},{"line_number":174,"context_line":"        pool_id \u003d _uuid()"},{"line_number":175,"context_line":"        hm_id \u003d _uuid()"},{"line_number":176,"context_line":"        data \u003d {\u0027pool\u0027: {\u0027name\u0027: \u0027pool1\u0027, \u0027description\u0027: \u0027descr_pool1\u0027,"},{"line_number":177,"context_line":"                         \u0027subnet_id\u0027: _uuid(), \u0027protocol\u0027: \u0027HTTP\u0027,"},{"line_number":178,"context_line":"                         \u0027lb_method\u0027: \u0027ROUND_ROBIN\u0027,"},{"line_number":179,"context_line":"                         \u0027health_monitors\u0027: [hm_id],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83E%3D","line":176,"in_reply_to":"AAAAM3%2F%2F9YI%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":187,"context_line":"        instance.create_pool.assert_called_with(mock.ANY,"},{"line_number":188,"context_line":"                                                pool\u003ddata)"},{"line_number":189,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":190,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":191,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":192,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":193,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9YE%3D","line":190,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":187,"context_line":"        instance.create_pool.assert_called_with(mock.ANY,"},{"line_number":188,"context_line":"                                                pool\u003ddata)"},{"line_number":189,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":190,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":191,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":192,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":193,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F83A%3D","line":190,"in_reply_to":"AAAAM3%2F%2F9YE%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":210,"context_line":"    def test_pool_update(self):"},{"line_number":211,"context_line":"        pool_id \u003d _uuid()"},{"line_number":212,"context_line":"        update_data \u003d {\u0027pool\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":213,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027pool1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":214,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":215,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: pool_id}"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9X8%3D","line":213,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed.","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":210,"context_line":"    def test_pool_update(self):"},{"line_number":211,"context_line":"        pool_id \u003d _uuid()"},{"line_number":212,"context_line":"        update_data \u003d {\u0027pool\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":213,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027pool1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":214,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":215,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: pool_id}"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F828%3D","line":213,"in_reply_to":"AAAAM3%2F%2F9X8%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"        instance.update_pool.assert_called_with(mock.ANY, pool_id,"},{"line_number":224,"context_line":"                                                pool\u003dupdate_data)"},{"line_number":225,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":226,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":227,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":228,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":229,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Xs%3D","line":226,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":223,"context_line":"        instance.update_pool.assert_called_with(mock.ANY, pool_id,"},{"line_number":224,"context_line":"                                                pool\u003dupdate_data)"},{"line_number":225,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":226,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":227,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":228,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":229,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F824%3D","line":226,"in_reply_to":"AAAAM3%2F%2F9Xs%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def test_pool_get(self):"},{"line_number":233,"context_line":"        pool_id \u003d _uuid()"},{"line_number":234,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027pool1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":235,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":236,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: pool_id}"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Xc%3D","line":234,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def test_pool_get(self):"},{"line_number":233,"context_line":"        pool_id \u003d _uuid()"},{"line_number":234,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027pool1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":235,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":236,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: pool_id}"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F820%3D","line":234,"in_reply_to":"AAAAM3%2F%2F9Xc%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":243,"context_line":"        instance.get_pool.assert_called_with(mock.ANY, pool_id,"},{"line_number":244,"context_line":"                                             fields\u003dmock.ANY)"},{"line_number":245,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":246,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":247,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":248,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":249,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9VQ%3D","line":246,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":243,"context_line":"        instance.get_pool.assert_called_with(mock.ANY, pool_id,"},{"line_number":244,"context_line":"                                             fields\u003dmock.ANY)"},{"line_number":245,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":246,"context_line":"        self.assertTrue(\u0027pool\u0027 in res.json)"},{"line_number":247,"context_line":"        pool \u003d res.json[\u0027pool\u0027]"},{"line_number":248,"context_line":"        self.assertEqual(pool[\u0027id\u0027], pool_id)"},{"line_number":249,"context_line":"        self.assertEqual(pool[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F82w%3D","line":246,"in_reply_to":"AAAAM3%2F%2F9VQ%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        instance.stats.assert_called_with(mock.ANY, pool_id)"},{"line_number":273,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":274,"context_line":"        self.assertTrue(\u0027stats\u0027 in res.json)"},{"line_number":275,"context_line":"        self.assertEqual(res.json[\u0027stats\u0027], stats[\u0027stats\u0027])"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def test_member_create(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9XU%3D","line":274,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        instance.stats.assert_called_with(mock.ANY, pool_id)"},{"line_number":273,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":274,"context_line":"        self.assertTrue(\u0027stats\u0027 in res.json)"},{"line_number":275,"context_line":"        self.assertEqual(res.json[\u0027stats\u0027], stats[\u0027stats\u0027])"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def test_member_create(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F810%3D","line":274,"in_reply_to":"AAAAM3%2F%2F9XU%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def test_member_create(self):"},{"line_number":278,"context_line":"        member_id \u003d _uuid()"},{"line_number":279,"context_line":"        data \u003d {\u0027member\u0027: {\u0027name\u0027: \u0027member1\u0027, \u0027description\u0027: \u0027descr_member1\u0027,"},{"line_number":280,"context_line":"                           \u0027pool_id\u0027: _uuid(), \u0027address\u0027: \u0027127.0.0.1\u0027,"},{"line_number":281,"context_line":"                           \u0027port\u0027: 80, \u0027weight\u0027: 1,"},{"line_number":282,"context_line":"                           \u0027admin_state_up\u0027: True, \u0027tenant_id\u0027: _uuid()}}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9XQ%3D","line":279,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def test_member_create(self):"},{"line_number":278,"context_line":"        member_id \u003d _uuid()"},{"line_number":279,"context_line":"        data \u003d {\u0027member\u0027: {\u0027name\u0027: \u0027member1\u0027, \u0027description\u0027: \u0027descr_member1\u0027,"},{"line_number":280,"context_line":"                           \u0027pool_id\u0027: _uuid(), \u0027address\u0027: \u0027127.0.0.1\u0027,"},{"line_number":281,"context_line":"                           \u0027port\u0027: 80, \u0027weight\u0027: 1,"},{"line_number":282,"context_line":"                           \u0027admin_state_up\u0027: True, \u0027tenant_id\u0027: _uuid()}}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81w%3D","line":279,"in_reply_to":"AAAAM3%2F%2F9XQ%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":289,"context_line":"        instance.create_member.assert_called_with(mock.ANY,"},{"line_number":290,"context_line":"                                                  member\u003ddata)"},{"line_number":291,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":292,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":293,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":294,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":295,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9XI%3D","line":292,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":289,"context_line":"        instance.create_member.assert_called_with(mock.ANY,"},{"line_number":290,"context_line":"                                                  member\u003ddata)"},{"line_number":291,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":292,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":293,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":294,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":295,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81s%3D","line":292,"in_reply_to":"AAAAM3%2F%2F9XI%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_member_list(self):"},{"line_number":299,"context_line":"        member_id \u003d _uuid()"},{"line_number":300,"context_line":"        return_value \u003d [{\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: True,"},{"line_number":301,"context_line":"                         \u0027tenant_id\u0027: _uuid(), \u0027id\u0027: member_id}]"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9XA%3D","line":300,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_member_list(self):"},{"line_number":299,"context_line":"        member_id \u003d _uuid()"},{"line_number":300,"context_line":"        return_value \u003d [{\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: True,"},{"line_number":301,"context_line":"                         \u0027tenant_id\u0027: _uuid(), \u0027id\u0027: member_id}]"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81o%3D","line":300,"in_reply_to":"AAAAM3%2F%2F9XA%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":312,"context_line":"    def test_member_update(self):"},{"line_number":313,"context_line":"        member_id \u003d _uuid()"},{"line_number":314,"context_line":"        update_data \u003d {\u0027member\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":315,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":316,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":317,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: member_id}"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9W4%3D","line":315,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":312,"context_line":"    def test_member_update(self):"},{"line_number":313,"context_line":"        member_id \u003d _uuid()"},{"line_number":314,"context_line":"        update_data \u003d {\u0027member\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":315,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":316,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":317,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: member_id}"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81k%3D","line":315,"in_reply_to":"AAAAM3%2F%2F9W4%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":325,"context_line":"        instance.update_member.assert_called_with(mock.ANY, member_id,"},{"line_number":326,"context_line":"                                                  member\u003dupdate_data)"},{"line_number":327,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":328,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":329,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":330,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":331,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9W0%3D","line":328,"updated":"2012-12-18 22:29:52.000000000","message":"same as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":325,"context_line":"        instance.update_member.assert_called_with(mock.ANY, member_id,"},{"line_number":326,"context_line":"                                                  member\u003dupdate_data)"},{"line_number":327,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":328,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":329,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":330,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":331,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81g%3D","line":328,"in_reply_to":"AAAAM3%2F%2F9W0%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    def test_member_get(self):"},{"line_number":335,"context_line":"        member_id \u003d _uuid()"},{"line_number":336,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":337,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":338,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: member_id}"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Ws%3D","line":336,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    def test_member_get(self):"},{"line_number":335,"context_line":"        member_id \u003d _uuid()"},{"line_number":336,"context_line":"        return_value \u003d {\u0027name\u0027: \u0027member1\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":337,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":338,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: member_id}"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81I%3D","line":336,"in_reply_to":"AAAAM3%2F%2F9Ws%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":345,"context_line":"        instance.get_member.assert_called_with(mock.ANY, member_id,"},{"line_number":346,"context_line":"                                               fields\u003dmock.ANY)"},{"line_number":347,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":348,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":349,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":350,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":351,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Wk%3D","line":348,"updated":"2012-12-18 22:29:52.000000000","message":"same as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":345,"context_line":"        instance.get_member.assert_called_with(mock.ANY, member_id,"},{"line_number":346,"context_line":"                                               fields\u003dmock.ANY)"},{"line_number":347,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":348,"context_line":"        self.assertTrue(\u0027member\u0027 in res.json)"},{"line_number":349,"context_line":"        member \u003d res.json[\u0027member\u0027]"},{"line_number":350,"context_line":"        self.assertEqual(member[\u0027id\u0027], member_id)"},{"line_number":351,"context_line":"        self.assertEqual(member[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F81A%3D","line":348,"in_reply_to":"AAAAM3%2F%2F9Wk%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def test_health_monitor_create(self):"},{"line_number":364,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":365,"context_line":"        data \u003d {\u0027health_monitor\u0027: {\u0027type\u0027: \u0027HTTP\u0027, \u0027delay\u0027: 2, \u0027timeout\u0027: 1,"},{"line_number":366,"context_line":"                                   \u0027max_retries\u0027: 3, \u0027http_method\u0027: \u0027GET\u0027,"},{"line_number":367,"context_line":"                                   \u0027url_path\u0027: \u0027/path\u0027,"},{"line_number":368,"context_line":"                                   \u0027expected_codes\u0027: \u0027200-300\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Wg%3D","line":365,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def test_health_monitor_create(self):"},{"line_number":364,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":365,"context_line":"        data \u003d {\u0027health_monitor\u0027: {\u0027type\u0027: \u0027HTTP\u0027, \u0027delay\u0027: 2, \u0027timeout\u0027: 1,"},{"line_number":366,"context_line":"                                   \u0027max_retries\u0027: 3, \u0027http_method\u0027: \u0027GET\u0027,"},{"line_number":367,"context_line":"                                   \u0027url_path\u0027: \u0027/path\u0027,"},{"line_number":368,"context_line":"                                   \u0027expected_codes\u0027: \u0027200-300\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F808%3D","line":365,"in_reply_to":"AAAAM3%2F%2F9Wg%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":377,"context_line":"        instance.create_health_monitor.assert_called_with(mock.ANY,"},{"line_number":378,"context_line":"                                                          health_monitor\u003ddata)"},{"line_number":379,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":380,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":381,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":382,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":383,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Wc%3D","line":380,"updated":"2012-12-18 22:29:52.000000000","message":"same as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":377,"context_line":"        instance.create_health_monitor.assert_called_with(mock.ANY,"},{"line_number":378,"context_line":"                                                          health_monitor\u003ddata)"},{"line_number":379,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":380,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":381,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":382,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":383,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F804%3D","line":380,"in_reply_to":"AAAAM3%2F%2F9Wc%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_health_monitor_list(self):"},{"line_number":387,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":388,"context_line":"        return_value \u003d [{\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: True,"},{"line_number":389,"context_line":"                         \u0027tenant_id\u0027: _uuid(), \u0027id\u0027: health_monitor_id}]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9WM%3D","line":388,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_health_monitor_list(self):"},{"line_number":387,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":388,"context_line":"        return_value \u003d [{\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: True,"},{"line_number":389,"context_line":"                         \u0027tenant_id\u0027: _uuid(), \u0027id\u0027: health_monitor_id}]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F800%3D","line":388,"in_reply_to":"AAAAM3%2F%2F9WM%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":400,"context_line":"    def test_health_monitor_update(self):"},{"line_number":401,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":402,"context_line":"        update_data \u003d {\u0027health_monitor\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":403,"context_line":"        return_value \u003d {\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":404,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":405,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: health_monitor_id}"},{"line_number":406,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9WI%3D","line":403,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":400,"context_line":"    def test_health_monitor_update(self):"},{"line_number":401,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":402,"context_line":"        update_data \u003d {\u0027health_monitor\u0027: {\u0027admin_state_up\u0027: False}}"},{"line_number":403,"context_line":"        return_value \u003d {\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":404,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":405,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: health_monitor_id}"},{"line_number":406,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F80w%3D","line":403,"in_reply_to":"AAAAM3%2F%2F9WI%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":414,"context_line":"        instance.update_health_monitor.assert_called_with("},{"line_number":415,"context_line":"            mock.ANY, health_monitor_id, health_monitor\u003dupdate_data)"},{"line_number":416,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":417,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":418,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":419,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":420,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9WE%3D","line":417,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":414,"context_line":"        instance.update_health_monitor.assert_called_with("},{"line_number":415,"context_line":"            mock.ANY, health_monitor_id, health_monitor\u003dupdate_data)"},{"line_number":416,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":417,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":418,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":419,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":420,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F80s%3D","line":417,"in_reply_to":"AAAAM3%2F%2F9WE%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def test_health_monitor_get(self):"},{"line_number":424,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":425,"context_line":"        return_value \u003d {\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":426,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":427,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: health_monitor_id}"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9V0%3D","line":425,"updated":"2012-12-18 22:29:52.000000000","message":"hacking compliance needed","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def test_health_monitor_get(self):"},{"line_number":424,"context_line":"        health_monitor_id \u003d _uuid()"},{"line_number":425,"context_line":"        return_value \u003d {\u0027type\u0027: \u0027HTTP\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":426,"context_line":"                        \u0027tenant_id\u0027: _uuid(),"},{"line_number":427,"context_line":"                        \u0027status\u0027: \"ACTIVE\", \u0027id\u0027: health_monitor_id}"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F80o%3D","line":425,"in_reply_to":"AAAAM3%2F%2F9V0%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":435,"context_line":"        instance.get_health_monitor.assert_called_with("},{"line_number":436,"context_line":"            mock.ANY, health_monitor_id, fields\u003dmock.ANY)"},{"line_number":437,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":438,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":439,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":440,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":441,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Vw%3D","line":438,"updated":"2012-12-18 22:29:52.000000000","message":"same as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":435,"context_line":"        instance.get_health_monitor.assert_called_with("},{"line_number":436,"context_line":"            mock.ANY, health_monitor_id, fields\u003dmock.ANY)"},{"line_number":437,"context_line":"        self.assertEqual(res.status_int, exc.HTTPOk.code)"},{"line_number":438,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":439,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":440,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":441,"context_line":"        self.assertEqual(health_monitor[\u0027status\u0027], \"ACTIVE\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F80k%3D","line":438,"in_reply_to":"AAAAM3%2F%2F9Vw%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":464,"context_line":"        instance.create_pool_health_monitor.assert_called_with("},{"line_number":465,"context_line":"            mock.ANY, pool_id\u003d\u0027id1\u0027, health_monitor\u003ddata)"},{"line_number":466,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":467,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":468,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":469,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":470,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F9Vk%3D","line":467,"updated":"2012-12-18 22:29:52.000000000","message":"same simplification as above","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":464,"context_line":"        instance.create_pool_health_monitor.assert_called_with("},{"line_number":465,"context_line":"            mock.ANY, pool_id\u003d\u0027id1\u0027, health_monitor\u003ddata)"},{"line_number":466,"context_line":"        self.assertEqual(res.status_int, exc.HTTPCreated.code)"},{"line_number":467,"context_line":"        self.assertTrue(\u0027health_monitor\u0027 in res.json)"},{"line_number":468,"context_line":"        health_monitor \u003d res.json[\u0027health_monitor\u0027]"},{"line_number":469,"context_line":"        self.assertEqual(health_monitor[\u0027id\u0027], health_monitor_id)"},{"line_number":470,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2F80g%3D","line":467,"in_reply_to":"AAAAM3%2F%2F9Vk%3D","updated":"2012-12-19 08:58:03.000000000","message":"Done","commit_id":"ce478076b2df54d4dca8040f57df3d8395b36b2f"}]}
