)]}'
{"neutronclient/common/utils.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fe1Q%3D","line":155,"updated":"2013-07-17 16:35:51.000000000","message":"this method does exactly what strlist.split(\",\") does, doesn\u0027t it?","commit_id":"9fa9adcf65268c98236ce3fc6df05d2b643000ec"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAQn%2F%2F3%2Bo%3D","line":155,"in_reply_to":"AAAAP3%2F%2Fe1Q%3D","updated":"2013-07-31 06:33:24.000000000","message":"Done. Use string.split directly as argument handler.","commit_id":"9fa9adcf65268c98236ce3fc6df05d2b643000ec"},{"author":{"_account_id":7708,"name":"Sergey Vilgelm","username":"svilgelm","inactive":true},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F%2BWE%3D","line":155,"updated":"2013-07-18 07:41:47.000000000","message":"This function is not necessary.","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F8Jc%3D","line":155,"in_reply_to":"AAAAQn%2F%2F%2BWE%3D","updated":"2013-07-18 19:05:28.000000000","message":"Hi Sergey,\nI\u0027m not sure how, without this function, I would designate a type handler function as below.  Any advice?\n\nparser.add_argument(\n           \u0027--firewall-rules\u0027, type\u003dutils.str2list,\n           help\u003d\u0027ordered list of firewall rules for the policy\u0027)\n\nThanks!\nKC","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F4Ys%3D","line":155,"in_reply_to":"AAAAQn%2F%2F608%3D","updated":"2013-07-31 06:32:47.000000000","message":"Function removed.","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7708,"name":"Sergey Vilgelm","username":"svilgelm","inactive":true},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def str2list(strlist):"},{"line_number":156,"context_line":"        \u0027\u0027\u0027Convert value1,value2,... string into list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        :param strlist: value1,value2"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F608%3D","line":155,"in_reply_to":"AAAAQn%2F%2F8Jc%3D","updated":"2013-07-19 06:18:28.000000000","message":"import string\n\nstring.split","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"}],"neutronclient/neutron/v2_0/__init__.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    if resource_match:"},{"line_number":41,"context_line":"        resource_plural \u003d resource_match[0]"},{"line_number":42,"context_line":"    else:"},{"line_number":43,"context_line":"        resource_plural \u003d resource + \u0027s\u0027"},{"line_number":44,"context_line":"    obj_lister \u003d getattr(client, \"list_%s\" % resource_plural)"},{"line_number":45,"context_line":"    # perform search by id only if we are passing a valid UUID"},{"line_number":46,"context_line":"    match \u003d re.match(UUID_PATTERN, name_or_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs2Q%3D","line":43,"updated":"2013-07-12 19:23:34.000000000","message":"This logic is used multiple times. We should avoid copy-paste logic and it is better to define a method to get a plural form for a resource. I made a same comment in VPNaaS CLI review.\n\nIn addtion, \".keys()\" is unnecessary. Please check a comment in VPNaaS review.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"    if resource_match:"},{"line_number":41,"context_line":"        resource_plural \u003d resource_match[0]"},{"line_number":42,"context_line":"    else:"},{"line_number":43,"context_line":"        resource_plural \u003d resource + \u0027s\u0027"},{"line_number":44,"context_line":"    obj_lister \u003d getattr(client, \"list_%s\" % resource_plural)"},{"line_number":45,"context_line":"    # perform search by id only if we are passing a valid UUID"},{"line_number":46,"context_line":"    match \u003d re.match(UUID_PATTERN, name_or_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2Bk%3D","line":43,"in_reply_to":"AAAAP3%2F%2Fs2Q%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7708,"name":"Sergey Vilgelm","username":"svilgelm","inactive":true},"unresolved":false,"context_lines":[{"line_number":34,"context_line":"                         HEX_ELEM + \u0027{12}\u0027])"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def _get_resource_plural(resource, client):"},{"line_number":38,"context_line":"    plurals \u003d client.EXTED_PLURALS"},{"line_number":39,"context_line":"    resource_match \u003d [k for k in plurals"},{"line_number":40,"context_line":"                      if plurals[k] \u003d\u003d resource]"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F%2BUU%3D","line":37,"updated":"2013-07-18 07:41:47.000000000","message":"More understandable.\n\n    plurals \u003d client.EXTED_PLURALS\n    for key, value in plurals.items():\n        if value \u003d\u003d resource:\n            return key\n    return resource + \u0027s\u0027","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":34,"context_line":"                         HEX_ELEM + \u0027{12}\u0027])"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def _get_resource_plural(resource, client):"},{"line_number":38,"context_line":"    plurals \u003d client.EXTED_PLURALS"},{"line_number":39,"context_line":"    resource_match \u003d [k for k in plurals"},{"line_number":40,"context_line":"                      if plurals[k] \u003d\u003d resource]"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F4FE%3D","line":37,"in_reply_to":"AAAAQn%2F%2F%2BUU%3D","updated":"2013-07-31 06:32:47.000000000","message":"Done. Revised for easier read in patch 23.","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"}],"neutronclient/neutron/v2_0/fw/firewall.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_known_arguments(self, parser):"},{"line_number":52,"context_line":"        parser.add_argument("},{"line_number":53,"context_line":"            \u0027firewall_policy_id\u0027, metavar\u003d\u0027POLICY_ID\u0027,"},{"line_number":54,"context_line":"            help\u003d\u0027firewall policy id\u0027)"},{"line_number":55,"context_line":"        parser.add_argument("},{"line_number":56,"context_line":"            \u0027--name\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs1c%3D","line":53,"updated":"2013-07-12 19:23:34.000000000","message":"It is better to support a policy name here. If then, metavar should be POLICY.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def add_known_arguments(self, parser):"},{"line_number":52,"context_line":"        parser.add_argument("},{"line_number":53,"context_line":"            \u0027firewall_policy_id\u0027, metavar\u003d\u0027POLICY_ID\u0027,"},{"line_number":54,"context_line":"            help\u003d\u0027firewall policy id\u0027)"},{"line_number":55,"context_line":"        parser.add_argument("},{"line_number":56,"context_line":"            \u0027--name\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2Bg%3D","line":53,"in_reply_to":"AAAAP3%2F%2Fs1c%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"}],"neutronclient/neutron/v2_0/fw/firewallpolicy.py":[{"author":{"_account_id":6641,"name":"Ravi Chunduru","email":"ravivsn@gmail.com","username":"ravivsn"},"unresolved":false,"context_lines":[{"line_number":66,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":67,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":68,"context_line":"        parser.add_argument("},{"line_number":69,"context_line":"            \u0027--firewall-rules-list\u0027,"},{"line_number":70,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"},{"line_number":71,"context_line":"        parser.add_argument("},{"line_number":72,"context_line":"            \u0027--audited\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2F0nA%3D","line":69,"updated":"2013-07-10 21:59:01.000000000","message":"firewall-rules-list is an unrecognized attribute. It should be firewall-rule-list. Ref from neutron/neutron/extensions/firewall.py","commit_id":"1e8e5a62429c5b718698c8db100aa1cc147b0237"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":66,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":67,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":68,"context_line":"        parser.add_argument("},{"line_number":69,"context_line":"            \u0027--firewall-rules-list\u0027,"},{"line_number":70,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"},{"line_number":71,"context_line":"        parser.add_argument("},{"line_number":72,"context_line":"            \u0027--audited\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2F0ew%3D","line":69,"in_reply_to":"AAAAP3%2F%2F0nA%3D","updated":"2013-07-31 06:35:04.000000000","message":"Ravi, thanks for catching this -fixed by now.","commit_id":"1e8e5a62429c5b718698c8db100aa1cc147b0237"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"    resource \u003d \u0027firewall_policy\u0027"},{"line_number":29,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListFirewallPolicy\u0027)"},{"line_number":30,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027shared\u0027,"},{"line_number":31,"context_line":"                    \u0027firewall_rule_list\u0027, \u0027audited\u0027]"},{"line_number":32,"context_line":"    _formatters \u003d {}"},{"line_number":33,"context_line":"    pagination_support \u003d True"},{"line_number":34,"context_line":"    sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fqr4%3D","line":31,"updated":"2013-07-14 20:06:21.000000000","message":"Per the review comments, I changed firewall_rule_list to firewall_rules. Hence it will be need to be reflected here as well. My apologies for making you go through this again.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"    resource \u003d \u0027firewall_policy\u0027"},{"line_number":29,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListFirewallPolicy\u0027)"},{"line_number":30,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027shared\u0027,"},{"line_number":31,"context_line":"                    \u0027firewall_rule_list\u0027, \u0027audited\u0027]"},{"line_number":32,"context_line":"    _formatters \u003d {}"},{"line_number":33,"context_line":"    pagination_support \u003d True"},{"line_number":34,"context_line":"    sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2Bc%3D","line":31,"in_reply_to":"AAAAP3%2F%2Fqr4%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListFirewallPolicy\u0027)"},{"line_number":30,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027shared\u0027,"},{"line_number":31,"context_line":"                    \u0027firewall_rule_list\u0027, \u0027audited\u0027]"},{"line_number":32,"context_line":"    _formatters \u003d {}"},{"line_number":33,"context_line":"    pagination_support \u003d True"},{"line_number":34,"context_line":"    sorting_support \u003d True"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs30%3D","line":32,"updated":"2013-07-12 19:23:34.000000000","message":"firewall_rule_list is a list. It is better to define a formatter for rule list.\nIn addition, if a length of each line becomes long, some fields should be dropped from the summary.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.ListFirewallPolicy\u0027)"},{"line_number":30,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027shared\u0027,"},{"line_number":31,"context_line":"                    \u0027firewall_rule_list\u0027, \u0027audited\u0027]"},{"line_number":32,"context_line":"    _formatters \u003d {}"},{"line_number":33,"context_line":"    pagination_support \u003d True"},{"line_number":34,"context_line":"    sorting_support \u003d True"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2BY%3D","line":32,"in_reply_to":"AAAAP3%2F%2Fs30%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            \u0027--not-shared\u0027,"},{"line_number":64,"context_line":"            dest\u003d\u0027shared\u0027,"},{"line_number":65,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":66,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":67,"context_line":"        parser.add_argument("},{"line_number":68,"context_line":"            \u0027--firewall-rule-list\u0027,"},{"line_number":69,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs3o%3D","line":66,"updated":"2013-07-12 19:23:34.000000000","message":"Please check a comment for --not-shared in firewallrule.py","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":63,"context_line":"            \u0027--not-shared\u0027,"},{"line_number":64,"context_line":"            dest\u003d\u0027shared\u0027,"},{"line_number":65,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":66,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":67,"context_line":"        parser.add_argument("},{"line_number":68,"context_line":"            \u0027--firewall-rule-list\u0027,"},{"line_number":69,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2BU%3D","line":66,"in_reply_to":"AAAAP3%2F%2Fs3o%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":126,"context_line":"            \u0027--firewall-rule-id\u0027,"},{"line_number":127,"context_line":"            help\u003d\u0027new rule to insert\u0027)"},{"line_number":128,"context_line":"        parser.add_argument("},{"line_number":129,"context_line":"            \u0027--insert-before\u0027,"},{"line_number":130,"context_line":"            help\u003d\u0027insert before this rule\u0027)"},{"line_number":131,"context_line":"        parser.add_argument("},{"line_number":132,"context_line":"            \u0027--insert-after\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2Fhpc%3D","line":129,"updated":"2013-07-29 19:58:15.000000000","message":"Instead of the current help where it shows:\n[--insert-before INSERT_BEFORE]\ncan we say\n[--insert-before FIREWALL_RULE_ID]","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":126,"context_line":"            \u0027--firewall-rule-id\u0027,"},{"line_number":127,"context_line":"            help\u003d\u0027new rule to insert\u0027)"},{"line_number":128,"context_line":"        parser.add_argument("},{"line_number":129,"context_line":"            \u0027--insert-before\u0027,"},{"line_number":130,"context_line":"            help\u003d\u0027insert before this rule\u0027)"},{"line_number":131,"context_line":"        parser.add_argument("},{"line_number":132,"context_line":"            \u0027--insert-after\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcQA%3D","line":129,"in_reply_to":"AAAAQn%2F%2Fhpc%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027--insert-before\u0027,"},{"line_number":130,"context_line":"            help\u003d\u0027insert before this rule\u0027)"},{"line_number":131,"context_line":"        parser.add_argument("},{"line_number":132,"context_line":"            \u0027--insert-after\u0027,"},{"line_number":133,"context_line":"            help\u003d\u0027insert after this rule\u0027)"},{"line_number":134,"context_line":"        self.add_known_arguments(parser)"},{"line_number":135,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FhpY%3D","line":132,"updated":"2013-07-29 19:58:15.000000000","message":"ditto","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \u0027--insert-before\u0027,"},{"line_number":130,"context_line":"            help\u003d\u0027insert before this rule\u0027)"},{"line_number":131,"context_line":"        parser.add_argument("},{"line_number":132,"context_line":"            \u0027--insert-after\u0027,"},{"line_number":133,"context_line":"            help\u003d\u0027insert after this rule\u0027)"},{"line_number":134,"context_line":"        self.add_known_arguments(parser)"},{"line_number":135,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcP8%3D","line":132,"in_reply_to":"AAAAQn%2F%2FhpY%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def add_known_arguments(self, parser):"},{"line_number":62,"context_line":"        parser.add_argument("},{"line_number":63,"context_line":"            \u0027name\u0027,"},{"line_number":64,"context_line":"            help\u003d\u0027name for the firewall policy\u0027)"},{"line_number":65,"context_line":"        parser.add_argument("},{"line_number":66,"context_line":"            \u0027--description\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKp8%3D","line":63,"updated":"2013-08-06 04:18:09.000000000","message":"Needs metavar\u003d\u0027NAME\u0027","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def add_known_arguments(self, parser):"},{"line_number":62,"context_line":"        parser.add_argument("},{"line_number":63,"context_line":"            \u0027name\u0027,"},{"line_number":64,"context_line":"            help\u003d\u0027name for the firewall policy\u0027)"},{"line_number":65,"context_line":"        parser.add_argument("},{"line_number":66,"context_line":"            \u0027--description\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKWE%3D","line":63,"in_reply_to":"AAAAQn%2F%2FKp8%3D","updated":"2013-08-06 07:42:40.000000000","message":"Done","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d\u0027to create a shared policy\u0027)"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--firewall-rules\u0027, type\u003dstring.split,"},{"line_number":75,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"},{"line_number":76,"context_line":"        parser.add_argument("},{"line_number":77,"context_line":"            \u0027--audited\u0027,"},{"line_number":78,"context_line":"            action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKqA%3D","line":75,"updated":"2013-08-06 04:18:09.000000000","message":"It is better to describe what delimiter can be used. The default delimiter of string.split is whitespace(s).\n\nCould you share an example how to specify multiple rules when create?","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d\u0027to create a shared policy\u0027)"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--firewall-rules\u0027, type\u003dstring.split,"},{"line_number":75,"context_line":"            help\u003d\u0027ordered list of firewall rules for the policy\u0027)"},{"line_number":76,"context_line":"        parser.add_argument("},{"line_number":77,"context_line":"            \u0027--audited\u0027,"},{"line_number":78,"context_line":"            action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKWA%3D","line":75,"in_reply_to":"AAAAQn%2F%2FKqA%3D","updated":"2013-08-06 07:42:40.000000000","message":"Done - expanded help text with syntax explanation and example","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        neutronv20.update_dict(parsed_args, body,"},{"line_number":128,"context_line":"                               [\u0027firewall_rule_id\u0027, \u0027insert_before\u0027,"},{"line_number":129,"context_line":"                                \u0027insert_after\u0027])"},{"line_number":130,"context_line":"        return body"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKps%3D","line":129,"updated":"2013-08-06 04:18:09.000000000","message":"We can use firewall rule names in firewall-policy-create. It is better firewall rule name is supported here too.","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        neutronv20.update_dict(parsed_args, body,"},{"line_number":128,"context_line":"                               [\u0027firewall_rule_id\u0027, \u0027insert_before\u0027,"},{"line_number":129,"context_line":"                                \u0027insert_after\u0027])"},{"line_number":130,"context_line":"        return body"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKV8%3D","line":129,"in_reply_to":"AAAAQn%2F%2FKps%3D","updated":"2013-08-06 07:42:40.000000000","message":"Done","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        parser.add_argument("},{"line_number":142,"context_line":"            \u0027--insert-after\u0027,"},{"line_number":143,"context_line":"            metavar\u003d\u0027FIREWALL_RULE_ID\u0027,"},{"line_number":144,"context_line":"            help\u003d\u0027insert after this rule\u0027)"},{"line_number":145,"context_line":"        self.add_known_arguments(parser)"},{"line_number":146,"context_line":"        return parser"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKpA%3D","line":144,"updated":"2013-08-06 04:18:09.000000000","message":"Are all options optional? Does \"neutron firewall-policy-insert-rule \u003cpolicy_id\u003e\" work? If not, we need to mark required options.","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":141,"context_line":"        parser.add_argument("},{"line_number":142,"context_line":"            \u0027--insert-after\u0027,"},{"line_number":143,"context_line":"            metavar\u003d\u0027FIREWALL_RULE_ID\u0027,"},{"line_number":144,"context_line":"            help\u003d\u0027insert after this rule\u0027)"},{"line_number":145,"context_line":"        self.add_known_arguments(parser)"},{"line_number":146,"context_line":"        return parser"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKV4%3D","line":144,"in_reply_to":"AAAAQn%2F%2FKpA%3D","updated":"2013-08-06 07:42:40.000000000","message":"Indeed, firewall_rule_id is required.  Updated call accordingly","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def args2body(self, parsed_args):"},{"line_number":171,"context_line":"        body \u003d {}"},{"line_number":172,"context_line":"        neutronv20.update_dict(parsed_args, body,"},{"line_number":173,"context_line":"                               [\u0027firewall_rule_id\u0027, ])"},{"line_number":174,"context_line":"        return body"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKpU%3D","line":173,"updated":"2013-08-06 04:18:09.000000000","message":"It is better to support firewall rule name to specify a firewall rule.","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def args2body(self, parsed_args):"},{"line_number":171,"context_line":"        body \u003d {}"},{"line_number":172,"context_line":"        neutronv20.update_dict(parsed_args, body,"},{"line_number":173,"context_line":"                               [\u0027firewall_rule_id\u0027, ])"},{"line_number":174,"context_line":"        return body"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKNU%3D","line":173,"in_reply_to":"AAAAQn%2F%2FKpU%3D","updated":"2013-08-06 07:42:40.000000000","message":"Done","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        parser \u003d super(FirewallPolicyRemoveRule, self).get_parser(prog_name)"},{"line_number":178,"context_line":"        parser.add_argument("},{"line_number":179,"context_line":"            \u0027--firewall-rule-id\u0027,"},{"line_number":180,"context_line":"            help\u003d\u0027firewall rule to remove from policy\u0027)"},{"line_number":181,"context_line":"        self.add_known_arguments(parser)"},{"line_number":182,"context_line":"        return parser"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKpQ%3D","line":180,"updated":"2013-08-06 04:18:09.000000000","message":"Isn\u0027t it a required argument?","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":177,"context_line":"        parser \u003d super(FirewallPolicyRemoveRule, self).get_parser(prog_name)"},{"line_number":178,"context_line":"        parser.add_argument("},{"line_number":179,"context_line":"            \u0027--firewall-rule-id\u0027,"},{"line_number":180,"context_line":"            help\u003d\u0027firewall rule to remove from policy\u0027)"},{"line_number":181,"context_line":"        self.add_known_arguments(parser)"},{"line_number":182,"context_line":"        return parser"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKNQ%3D","line":180,"in_reply_to":"AAAAQn%2F%2FKpQ%3D","updated":"2013-08-06 07:42:40.000000000","message":"Done - made it required.","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"}],"neutronclient/neutron/v2_0/fw/firewallrule.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"from neutronclient.neutron import v2_0 as neutronv20"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs4E%3D","line":20,"updated":"2013-07-12 19:23:34.000000000","message":"Needs a blank line between L.20-21.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"from neutronclient.neutron import v2_0 as neutronv20"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2BQ%3D","line":20,"in_reply_to":"AAAAP3%2F%2Fs4E%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027firewall_policy_id\u0027,"},{"line_number":30,"context_line":"                    \u0027shared\u0027, \u0027protocol\u0027, \u0027source_ip_address\u0027,"},{"line_number":31,"context_line":"                    \u0027destination_ip_address\u0027, \u0027source_port\u0027,"},{"line_number":32,"context_line":"                    \u0027destination_port\u0027, \u0027action\u0027, \u0027enabled\u0027]"},{"line_number":33,"context_line":"    _formatters \u003d {}"},{"line_number":34,"context_line":"    pagination_support \u003d True"},{"line_number":35,"context_line":"    sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs5M%3D","line":32,"updated":"2013-07-12 19:23:34.000000000","message":"I think too many fields are displayed in the list and each line becomes too long. Can we reduce the fields displayed by default? It is better that length of one line fits into a width or normal terminal (IMO it should not be 80 chars and more characters per line is acceptable).","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"    list_columns \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027, \u0027firewall_policy_id\u0027,"},{"line_number":30,"context_line":"                    \u0027shared\u0027, \u0027protocol\u0027, \u0027source_ip_address\u0027,"},{"line_number":31,"context_line":"                    \u0027destination_ip_address\u0027, \u0027source_port\u0027,"},{"line_number":32,"context_line":"                    \u0027destination_port\u0027, \u0027action\u0027, \u0027enabled\u0027]"},{"line_number":33,"context_line":"    _formatters \u003d {}"},{"line_number":34,"context_line":"    pagination_support \u003d True"},{"line_number":35,"context_line":"    sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F3%2BM%3D","line":32,"in_reply_to":"AAAAP3%2F%2Fs5M%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done. Reduced to minimal fields.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027--not-shared\u0027,"},{"line_number":65,"context_line":"            dest\u003d\u0027shared\u0027,"},{"line_number":66,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":67,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":68,"context_line":"        parser.add_argument("},{"line_number":69,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":70,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs4g%3D","line":67,"updated":"2013-07-12 19:23:34.000000000","message":"Do we need an option to specify the default value?\nIf the default value of shared is False, \"--no-shared\" is unnecessary and only \"--shared\" is required. It is done for a network. net-create has only --shared option.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027--not-shared\u0027,"},{"line_number":65,"context_line":"            dest\u003d\u0027shared\u0027,"},{"line_number":66,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":67,"context_line":"            help\u003d\u0027set shared to False (default False)\u0027)"},{"line_number":68,"context_line":"        parser.add_argument("},{"line_number":69,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":70,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F398%3D","line":67,"in_reply_to":"AAAAP3%2F%2Fs4g%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done. Removed unnecessary option.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":71,"context_line":"        parser.add_argument("},{"line_number":72,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":73,"context_line":"            help\u003d\u0027source ip address in x.x.x.x/x\u0027)"},{"line_number":74,"context_line":"        parser.add_argument("},{"line_number":75,"context_line":"            \u0027--destination-ip-address\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027destination ip address in x.x.x.x/x\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs4I%3D","line":73,"updated":"2013-07-12 19:23:34.000000000","message":"IPv6 format is not allowed? help shows only IPv4 format.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":70,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":71,"context_line":"        parser.add_argument("},{"line_number":72,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":73,"context_line":"            help\u003d\u0027source ip address in x.x.x.x/x\u0027)"},{"line_number":74,"context_line":"        parser.add_argument("},{"line_number":75,"context_line":"            \u0027--destination-ip-address\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027destination ip address in x.x.x.x/x\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F394%3D","line":73,"in_reply_to":"AAAAP3%2F%2Fs4I%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done. It\u0027s allowed - updated help text to not be restrictive to ipv4.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--enabled\u0027,"},{"line_number":93,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":94,"context_line":"            help\u003d\u0027set enabled to True (default True)\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def args2body(self, parsed_args):"},{"line_number":97,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs4Y%3D","line":94,"updated":"2013-07-12 19:23:34.000000000","message":"Same as the comment for --non-shared.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--enabled\u0027,"},{"line_number":93,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":94,"context_line":"            help\u003d\u0027set enabled to True (default True)\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def args2body(self, parsed_args):"},{"line_number":97,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F390%3D","line":94,"in_reply_to":"AAAAP3%2F%2Fs4Y%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done. Removed.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":84,"context_line":"            required\u003dTrue,"},{"line_number":85,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":86,"context_line":"        parser.add_argument("},{"line_number":87,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":88,"context_line":"            help\u003d\u0027source ip address or subnet\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2F2pY%3D","line":85,"updated":"2013-07-22 00:56:30.000000000","message":"Please move a mandatory argument after optional ones. It makes it easier to read the help message.","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":84,"context_line":"            required\u003dTrue,"},{"line_number":85,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":86,"context_line":"        parser.add_argument("},{"line_number":87,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":88,"context_line":"            help\u003d\u0027source ip address or subnet\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2FcPA%3D","line":85,"in_reply_to":"AAAAQn%2F%2F2pY%3D","updated":"2013-07-31 06:32:08.000000000","message":"Done","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027--action\u0027,"},{"line_number":100,"context_line":"            required\u003dTrue,"},{"line_number":101,"context_line":"            help\u003d\u0027action: {allow, deny (default)}\u0027)"},{"line_number":102,"context_line":"        parser.add_argument("},{"line_number":103,"context_line":"            \u0027--disabled\u0027,"},{"line_number":104,"context_line":"            dest\u003d\u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2F2pU%3D","line":101,"updated":"2013-07-22 00:56:30.000000000","message":"Ditto","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027--action\u0027,"},{"line_number":100,"context_line":"            required\u003dTrue,"},{"line_number":101,"context_line":"            help\u003d\u0027action: {allow, deny (default)}\u0027)"},{"line_number":102,"context_line":"        parser.add_argument("},{"line_number":103,"context_line":"            \u0027--disabled\u0027,"},{"line_number":104,"context_line":"            dest\u003d\u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2FcNo%3D","line":101,"in_reply_to":"AAAAQn%2F%2F2pU%3D","updated":"2013-07-31 06:32:08.000000000","message":"Done","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"            help\u003d\u0027destination ip address or subnet\u0027)"},{"line_number":88,"context_line":"        parser.add_argument("},{"line_number":89,"context_line":"            \u0027--source-port\u0027,"},{"line_number":90,"context_line":"            help\u003d\u0027source port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--destination-port\u0027,"},{"line_number":93,"context_line":"            help\u003d\u0027destination port (integer in [0, 65535] or range in a:b)\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2Fg2o%3D","line":90,"updated":"2013-07-30 00:29:17.000000000","message":"We dont allow port zero","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"            help\u003d\u0027destination ip address or subnet\u0027)"},{"line_number":88,"context_line":"        parser.add_argument("},{"line_number":89,"context_line":"            \u0027--source-port\u0027,"},{"line_number":90,"context_line":"            help\u003d\u0027source port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--destination-port\u0027,"},{"line_number":93,"context_line":"            help\u003d\u0027destination port (integer in [0, 65535] or range in a:b)\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcP4%3D","line":90,"in_reply_to":"AAAAQn%2F%2Fg2o%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"            help\u003d\u0027source port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--destination-port\u0027,"},{"line_number":93,"context_line":"            help\u003d\u0027destination port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":94,"context_line":"        parser.add_argument("},{"line_number":95,"context_line":"            \u0027--disabled\u0027,"},{"line_number":96,"context_line":"            dest\u003d\u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2Fg2g%3D","line":93,"updated":"2013-07-30 00:29:17.000000000","message":"ditto","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"            help\u003d\u0027source port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":91,"context_line":"        parser.add_argument("},{"line_number":92,"context_line":"            \u0027--destination-port\u0027,"},{"line_number":93,"context_line":"            help\u003d\u0027destination port (integer in [0, 65535] or range in a:b)\u0027)"},{"line_number":94,"context_line":"        parser.add_argument("},{"line_number":95,"context_line":"            \u0027--disabled\u0027,"},{"line_number":96,"context_line":"            dest\u003d\u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcP0%3D","line":93,"in_reply_to":"AAAAQn%2F%2Fg2g%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":95,"context_line":"            \u0027--disabled\u0027,"},{"line_number":96,"context_line":"            dest\u003d\u0027enabled\u0027,"},{"line_number":97,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":98,"context_line":"            help\u003d\u0027set enabled to False (default True)\u0027)"},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":101,"context_line":"            required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2Fg3s%3D","line":98,"updated":"2013-07-30 00:29:17.000000000","message":"suggest wording this as:\nto disable this rule","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":95,"context_line":"            \u0027--disabled\u0027,"},{"line_number":96,"context_line":"            dest\u003d\u0027enabled\u0027,"},{"line_number":97,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":98,"context_line":"            help\u003d\u0027set enabled to False (default True)\u0027)"},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--protocol\u0027, choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027],"},{"line_number":101,"context_line":"            required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcPw%3D","line":98,"in_reply_to":"AAAAQn%2F%2Fg3s%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"            required\u003dTrue,"},{"line_number":102,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":103,"context_line":"        parser.add_argument("},{"line_number":104,"context_line":"            \u0027--action\u0027,"},{"line_number":105,"context_line":"            required\u003dTrue,"},{"line_number":106,"context_line":"            help\u003d\u0027action: {allow, deny (default)}\u0027)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2Fhro%3D","line":104,"updated":"2013-07-29 19:58:15.000000000","message":"suggestion - can we add the action choices here:\n[\u0027allow\u0027, \u0027deny\u0027]","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":"            required\u003dTrue,"},{"line_number":102,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":103,"context_line":"        parser.add_argument("},{"line_number":104,"context_line":"            \u0027--action\u0027,"},{"line_number":105,"context_line":"            required\u003dTrue,"},{"line_number":106,"context_line":"            help\u003d\u0027action: {allow, deny (default)}\u0027)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAQn%2F%2FcPE%3D","line":104,"in_reply_to":"AAAAQn%2F%2Fhro%3D","updated":"2013-07-31 06:31:47.000000000","message":"Done","commit_id":"e5e318f9019f5b9eccd05f2458861fed2eb62579"}],"neutronclient/shell.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":49,"context_line":"from neutronclient.neutron.v2_0 import router"},{"line_number":50,"context_line":"from neutronclient.neutron.v2_0 import securitygroup"},{"line_number":51,"context_line":"from neutronclient.neutron.v2_0 import subnet"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"from neutronclient.openstack.common import strutils"},{"line_number":54,"context_line":"from neutronclient.version import __version__"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs6s%3D","line":52,"updated":"2013-07-12 19:23:34.000000000","message":"Please remove this blank line.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":49,"context_line":"from neutronclient.neutron.v2_0 import router"},{"line_number":50,"context_line":"from neutronclient.neutron.v2_0 import securitygroup"},{"line_number":51,"context_line":"from neutronclient.neutron.v2_0 import subnet"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"from neutronclient.openstack.common import strutils"},{"line_number":54,"context_line":"from neutronclient.version import __version__"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F39s%3D","line":52,"in_reply_to":"AAAAP3%2F%2Fs6s%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    \u0027l3-agent-router-remove\u0027: agentscheduler.RemoveRouterFromL3Agent,"},{"line_number":182,"context_line":"    \u0027router-list-on-l3-agent\u0027: agentscheduler.ListRoutersOnL3Agent,"},{"line_number":183,"context_line":"    \u0027l3-agent-list-hosting-router\u0027: agentscheduler.ListL3AgentsHostingRouter,"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    \u0027firewall-rule-list\u0027: firewallrule.ListFirewallRule,"},{"line_number":186,"context_line":"    \u0027firewall-rule-show\u0027: firewallrule.ShowFirewallRule,"},{"line_number":187,"context_line":"    \u0027firewall-rule-create\u0027: firewallrule.CreateFirewallRule,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs60%3D","line":184,"updated":"2013-07-12 19:23:34.000000000","message":"This blank line is necessary? No blank line is found in other places (though it helps the readability). My comment is just for consistency.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":181,"context_line":"    \u0027l3-agent-router-remove\u0027: agentscheduler.RemoveRouterFromL3Agent,"},{"line_number":182,"context_line":"    \u0027router-list-on-l3-agent\u0027: agentscheduler.ListRoutersOnL3Agent,"},{"line_number":183,"context_line":"    \u0027l3-agent-list-hosting-router\u0027: agentscheduler.ListL3AgentsHostingRouter,"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    \u0027firewall-rule-list\u0027: firewallrule.ListFirewallRule,"},{"line_number":186,"context_line":"    \u0027firewall-rule-show\u0027: firewallrule.ShowFirewallRule,"},{"line_number":187,"context_line":"    \u0027firewall-rule-create\u0027: firewallrule.CreateFirewallRule,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F39o%3D","line":184,"in_reply_to":"AAAAP3%2F%2Fs60%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"}],"neutronclient/v2_0/client.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":723,"context_line":"    @APIParamsCall"},{"line_number":724,"context_line":"    def list_firewall_rules(self, retrieve_all\u003dTrue, **_params):"},{"line_number":725,"context_line":"        \"\"\"Fetches a list of all firewall rules for a tenant"},{"line_number":726,"context_line":"        \"\"\""},{"line_number":727,"context_line":"        # Pass filters in \"params\" argument to do_request"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        return self.list(\u0027firewall_rules\u0027, self.firewall_rules_path,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs7E%3D","line":726,"updated":"2013-07-12 19:23:34.000000000","message":"The docstring fits into one line. It is the python docstring convention. Same comment for the docstrings of the rest methods below.","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":723,"context_line":"    @APIParamsCall"},{"line_number":724,"context_line":"    def list_firewall_rules(self, retrieve_all\u003dTrue, **_params):"},{"line_number":725,"context_line":"        \"\"\"Fetches a list of all firewall rules for a tenant"},{"line_number":726,"context_line":"        \"\"\""},{"line_number":727,"context_line":"        # Pass filters in \"params\" argument to do_request"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        return self.list(\u0027firewall_rules\u0027, self.firewall_rules_path,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F39g%3D","line":726,"in_reply_to":"AAAAP3%2F%2Fs7E%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done","commit_id":"0a2c314659bd3528bd6164c4dd57a8770d0d9706"}],"quantumclient/quantum/v2_0/__init__.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":475,"context_line":"    def call_server(self, quantum_client, search_opts, parsed_args):"},{"line_number":476,"context_line":"        if self.resource in [\u0027firewall_policy\u0027]:"},{"line_number":477,"context_line":"            obj_lister \u003d getattr(quantum_client,"},{"line_number":478,"context_line":"                                 \"list_%ss\" % re.sub(\u0027y\\Z\u0027, \u0027ie\u0027, self.resource))"},{"line_number":479,"context_line":"        else:"},{"line_number":480,"context_line":"            obj_lister \u003d getattr(quantum_client,"},{"line_number":481,"context_line":"                                 \"list_%ss\" % self.resource)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoWc%3D","line":478,"updated":"2013-06-26 12:51:21.000000000","message":"It is better to avoid a logic related to a specific resource in this module. It is better to override this method in firewall_policy or define a mapping table from singular form to plural form.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":475,"context_line":"    def call_server(self, quantum_client, search_opts, parsed_args):"},{"line_number":476,"context_line":"        if self.resource in [\u0027firewall_policy\u0027]:"},{"line_number":477,"context_line":"            obj_lister \u003d getattr(quantum_client,"},{"line_number":478,"context_line":"                                 \"list_%ss\" % re.sub(\u0027y\\Z\u0027, \u0027ie\u0027, self.resource))"},{"line_number":479,"context_line":"        else:"},{"line_number":480,"context_line":"            obj_lister \u003d getattr(quantum_client,"},{"line_number":481,"context_line":"                                 \"list_%ss\" % self.resource)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcWk%3D","line":478,"in_reply_to":"AAAAPn%2F%2FoWc%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done.  Instead, code is added to handle plurals based on client.EXTED_PLURALS","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}],"quantumclient/quantum/v2_0/firewall.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"8bcfcfc2e19b01e1cad9f021ccb7a492bcd1d91f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# @author: KC Wang, Big Switch Networks"},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F%2BoI%3D","line":18,"updated":"2013-06-16 06:53:37.000000000","message":"this line should go to the top of the file","commit_id":"5d360b9d1b2550308b5a58a6ae2b75499671bc4a"}],"quantumclient/quantum/v2_0/firewallpolicy.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"af4e48f4c4993362eb4b0bb11bc98ceb34167328","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":68,"context_line":"            help\u003d\u0027set audited to True\u0027)"},{"line_number":69,"context_line":"        parser.add_argument("},{"line_number":70,"context_line":"            \u0027--admin-state-down\u0027,"},{"line_number":71,"context_line":"            dest\u003d\u0027admin_state\u0027,"},{"line_number":72,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":73,"context_line":"            help\u003d\u0027set admin state up to false\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoxQ%3D","line":70,"updated":"2013-06-26 09:05:40.000000000","message":"admin-state-down or _up? seems to be not matching help message and argument name from args2body","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":68,"context_line":"            help\u003d\u0027set audited to True\u0027)"},{"line_number":69,"context_line":"        parser.add_argument("},{"line_number":70,"context_line":"            \u0027--admin-state-down\u0027,"},{"line_number":71,"context_line":"            dest\u003d\u0027admin_state\u0027,"},{"line_number":72,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":73,"context_line":"            help\u003d\u0027set admin state up to false\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcWQ%3D","line":70,"in_reply_to":"AAAAPn%2F%2FoX0%3D","updated":"2013-07-03 01:53:19.000000000","message":"This is following convention seen in other modules, e.g., lb/vip.py, network.py.  Since admin_state is default up, it makes sense --admin-state-down is provided as argument.  I suppose we also need to add an --admin-state-up as argument, but this was not seen in other examples","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":68,"context_line":"            help\u003d\u0027set audited to True\u0027)"},{"line_number":69,"context_line":"        parser.add_argument("},{"line_number":70,"context_line":"            \u0027--admin-state-down\u0027,"},{"line_number":71,"context_line":"            dest\u003d\u0027admin_state\u0027,"},{"line_number":72,"context_line":"            action\u003d\u0027store_false\u0027,"},{"line_number":73,"context_line":"            help\u003d\u0027set admin state up to false\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoX0%3D","line":70,"in_reply_to":"AAAAPn%2F%2FoxQ%3D","updated":"2013-06-26 12:51:21.000000000","message":"Perhaps we need to change \"admin state up\" in help message to the attribute name \"admin_state_up\" (concatenated with underscore).","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}],"quantumclient/quantum/v2_0/firewallrule.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        parser.add_argument("},{"line_number":60,"context_line":"            \u0027--shared\u0027,"},{"line_number":61,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoWE%3D","line":62,"updated":"2013-06-26 12:51:21.000000000","message":"Is the default value False since store_true is used?","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        parser.add_argument("},{"line_number":60,"context_line":"            \u0027--shared\u0027,"},{"line_number":61,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcVY%3D","line":62,"in_reply_to":"AAAAPn%2F%2FoWE%3D","updated":"2013-07-03 01:53:19.000000000","message":"Yes, also adding --not-shared to allow disable after enabled.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0a13db33096fe21f3567866c32d10acb8c43654d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":66,"context_line":"        parser.add_argument("},{"line_number":67,"context_line":"            \u0027--source-ip-address\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FogI%3D","line":64,"updated":"2013-06-26 11:19:30.000000000","message":"Spelling. (And there is no unit test for this.)","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":66,"context_line":"        parser.add_argument("},{"line_number":67,"context_line":"            \u0027--source-ip-address\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcTs%3D","line":64,"in_reply_to":"AAAAPn%2F%2FogI%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done. Added unit tests for firewallrule","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":66,"context_line":"        parser.add_argument("},{"line_number":67,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":68,"context_line":"            help\u003d\u0027source ip address\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoWU%3D","line":65,"updated":"2013-06-26 12:51:21.000000000","message":"If we support specific protocol types, it is better to add choices\u003d[\u0027tcp\u0027, \u0027udp\u0027, \u0027icmp\u0027]. If free format of protocol name is supported, the current implementation looks good.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            help\u003d\u0027shared (default True)\u0027)"},{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--protcol\u0027,"},{"line_number":65,"context_line":"            help\u003d\u0027protocol for the firewall rule: {tcp, udp, icmp}\u0027)"},{"line_number":66,"context_line":"        parser.add_argument("},{"line_number":67,"context_line":"            \u0027--source-ip-address\u0027,"},{"line_number":68,"context_line":"            help\u003d\u0027source ip address\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcTg%3D","line":65,"in_reply_to":"AAAAPn%2F%2FoWU%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done. Agreed - add choices as suggested.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            help\u003d\u0027destination port\u0027)"},{"line_number":78,"context_line":"        parser.add_argument("},{"line_number":79,"context_line":"            \u0027--action\u0027,"},{"line_number":80,"context_line":"            help\u003d\u0027action (default deny)\u0027)"},{"line_number":81,"context_line":"        parser.add_argument("},{"line_number":82,"context_line":"            \u0027--enabled\u0027,"},{"line_number":83,"context_line":"            action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoVw%3D","line":80,"updated":"2013-06-26 12:51:21.000000000","message":"It is better to explain which actins are supported.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            help\u003d\u0027destination port\u0027)"},{"line_number":78,"context_line":"        parser.add_argument("},{"line_number":79,"context_line":"            \u0027--action\u0027,"},{"line_number":80,"context_line":"            help\u003d\u0027action (default deny)\u0027)"},{"line_number":81,"context_line":"        parser.add_argument("},{"line_number":82,"context_line":"            \u0027--enabled\u0027,"},{"line_number":83,"context_line":"            action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcTc%3D","line":80,"in_reply_to":"AAAAPn%2F%2FoVw%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done.  Agreed - list supported actions in help text.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parser.add_argument("},{"line_number":82,"context_line":"            \u0027--enabled\u0027,"},{"line_number":83,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":84,"context_line":"            help\u003d\u0027enabled (default True)\u0027)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def args2body(self, parsed_args):"},{"line_number":87,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoVo%3D","line":84,"updated":"2013-06-26 12:51:21.000000000","message":"default is False?","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parser.add_argument("},{"line_number":82,"context_line":"            \u0027--enabled\u0027,"},{"line_number":83,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":84,"context_line":"            help\u003d\u0027enabled (default True)\u0027)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def args2body(self, parsed_args):"},{"line_number":87,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcTQ%3D","line":84,"in_reply_to":"AAAAPn%2F%2FoVo%3D","updated":"2013-07-03 01:53:19.000000000","message":"Default True.  Similar situation as --shared.  Also add --disabled.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}],"quantumclient/v2_0/client.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"af4e48f4c4993362eb4b0bb11bc98ceb34167328","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    DHCP_AGENTS \u003d \u0027/dhcp-agents\u0027"},{"line_number":186,"context_line":"    L3_ROUTERS \u003d \u0027/l3-routers\u0027"},{"line_number":187,"context_line":"    L3_AGENTS \u003d \u0027/l3-agents\u0027"},{"line_number":188,"context_line":"    firewall_rules_path \u003d \"/firewall_rules\""},{"line_number":189,"context_line":"    firewall_rule_path \u003d \"/firewall_rules/%s\""},{"line_number":190,"context_line":"    firewall_policies_path \u003d \"/firewall_policies\""},{"line_number":191,"context_line":"    firewall_policy_path \u003d \"/firewall_policies/%s\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fowk%3D","line":188,"updated":"2013-06-26 09:05:40.000000000","message":"i guess these paths need some prefix, no?\n/fw or something","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    DHCP_AGENTS \u003d \u0027/dhcp-agents\u0027"},{"line_number":186,"context_line":"    L3_ROUTERS \u003d \u0027/l3-routers\u0027"},{"line_number":187,"context_line":"    L3_AGENTS \u003d \u0027/l3-agents\u0027"},{"line_number":188,"context_line":"    firewall_rules_path \u003d \"/firewall_rules\""},{"line_number":189,"context_line":"    firewall_rule_path \u003d \"/firewall_rules/%s\""},{"line_number":190,"context_line":"    firewall_policies_path \u003d \"/firewall_policies\""},{"line_number":191,"context_line":"    firewall_policy_path \u003d \"/firewall_policies/%s\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYCU%3D","line":188,"in_reply_to":"AAAAPn%2F%2FoUM%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done - add /fw prefix","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    DHCP_AGENTS \u003d \u0027/dhcp-agents\u0027"},{"line_number":186,"context_line":"    L3_ROUTERS \u003d \u0027/l3-routers\u0027"},{"line_number":187,"context_line":"    L3_AGENTS \u003d \u0027/l3-agents\u0027"},{"line_number":188,"context_line":"    firewall_rules_path \u003d \"/firewall_rules\""},{"line_number":189,"context_line":"    firewall_rule_path \u003d \"/firewall_rules/%s\""},{"line_number":190,"context_line":"    firewall_policies_path \u003d \"/firewall_policies\""},{"line_number":191,"context_line":"    firewall_policy_path \u003d \"/firewall_policies/%s\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoUM%3D","line":188,"in_reply_to":"AAAAPn%2F%2Fowk%3D","updated":"2013-06-26 12:51:21.000000000","message":"Though It may be a part of this patch, it may be better  resources for services have some prefix as enikanorov mentioned. lbaas does so.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                     \u0027quotas\u0027: \u0027quota\u0027,"},{"line_number":207,"context_line":"                     \u0027firewall_rules\u0027: \u0027firewall_rule\u0027,"},{"line_number":208,"context_line":"                     \u0027firewall_policies\u0027: \u0027firewall_policy\u0027,"},{"line_number":209,"context_line":"                     \u0027firewalls\u0027: \u0027firewall\u0027"},{"line_number":210,"context_line":"                     }"},{"line_number":211,"context_line":"    # 8192 Is the default max URI len for eventlet.wsgi.server"},{"line_number":212,"context_line":"    MAX_URI_LEN \u003d 8192"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoUo%3D","line":209,"updated":"2013-06-26 12:51:21.000000000","message":"It is better to add a comma at eol.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                     \u0027quotas\u0027: \u0027quota\u0027,"},{"line_number":207,"context_line":"                     \u0027firewall_rules\u0027: \u0027firewall_rule\u0027,"},{"line_number":208,"context_line":"                     \u0027firewall_policies\u0027: \u0027firewall_policy\u0027,"},{"line_number":209,"context_line":"                     \u0027firewalls\u0027: \u0027firewall\u0027"},{"line_number":210,"context_line":"                     }"},{"line_number":211,"context_line":"    # 8192 Is the default max URI len for eventlet.wsgi.server"},{"line_number":212,"context_line":"    MAX_URI_LEN \u003d 8192"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYCQ%3D","line":209,"in_reply_to":"AAAAPn%2F%2FoUo%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}],"tests/unit/fw/test_cli20_firewallpolicy.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"        my_id \u003d \u0027myid1\u0027"},{"line_number":138,"context_line":"        args \u003d [my_id]"},{"line_number":139,"context_line":"        self._test_delete_resource(resource, cmd, my_id, args)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class CLITestV20FirewallPolicyXML(CLITestV20FirewallPolicyJSON):"},{"line_number":143,"context_line":"    format \u003d \u0027xml\u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2F22U%3D","line":140,"updated":"2013-07-21 18:56:29.000000000","message":"Add tests for firewall-policy-insert-rule and firewall-policy-remove-rule.","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"        my_id \u003d \u0027myid1\u0027"},{"line_number":138,"context_line":"        args \u003d [my_id]"},{"line_number":139,"context_line":"        self._test_delete_resource(resource, cmd, my_id, args)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class CLITestV20FirewallPolicyXML(CLITestV20FirewallPolicyJSON):"},{"line_number":143,"context_line":"    format \u003d \u0027xml\u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2FcNk%3D","line":140,"in_reply_to":"AAAAQn%2F%2F22U%3D","updated":"2013-07-31 06:32:08.000000000","message":"Done","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mox"},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutronclient.neutron.v2_0.fw import firewallpolicy"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKog%3D","line":20,"updated":"2013-08-06 04:18:09.000000000","message":"mox is thridparty","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mox"},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutronclient.neutron.v2_0.fw import firewallpolicy"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKK8%3D","line":20,"in_reply_to":"AAAAQn%2F%2FKNA%3D","updated":"2013-08-06 07:49:53.000000000","message":"According to HACKING.rst, imports are split into three sections: standard, thirdparty and package-specific modules.\n\"sys\" is standard library and mox is thirdparty library.\nSo I would suggest that imports should be as follows:\n\n  import sys\n\n  import mox\n\n  import neutronclient.neutron.v2_0.fw import firewallpolicy\n  ...","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mox"},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutronclient.neutron.v2_0.fw import firewallpolicy"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAAQn%2F%2FKNA%3D","line":20,"in_reply_to":"AAAAQn%2F%2FKog%3D","updated":"2013-08-06 07:42:40.000000000","message":"Akihiro - I was following convention of existing tests in python-neutronclient.  Could you elaborate on your comment?  Thanks.","commit_id":"bf0a4b0b0172c6e9944d29ff9cc5e3caf3de478d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mox"},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutronclient.neutron.v2_0.fw import firewallpolicy"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAQn%2F%2FKKY%3D","line":20,"updated":"2013-08-06 08:15:20.000000000","message":"As I described in the comment in patch set 35, please move this after \"import sys\" and add a blank line between \"import sys\" and \"import mox\".","commit_id":"683e3097d326a0dc9a016332aa82e4a983b633ff"}],"tests/unit/test_cli20.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9f25645a527eea3d54ea1707adb435bdf65cce8e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import mox"},{"line_number":22,"context_line":"from mox import Comparator"},{"line_number":23,"context_line":"from mox import ContainsKeyValue"},{"line_number":24,"context_line":"import re"},{"line_number":25,"context_line":"import testtools"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from quantumclient.common import constants"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FoRo%3D","line":24,"updated":"2013-06-26 12:51:21.000000000","message":"re is a standard library.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import mox"},{"line_number":22,"context_line":"from mox import Comparator"},{"line_number":23,"context_line":"from mox import ContainsKeyValue"},{"line_number":24,"context_line":"import re"},{"line_number":25,"context_line":"import testtools"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from quantumclient.common import constants"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYCM%3D","line":24,"in_reply_to":"AAAAPn%2F%2FoRo%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done - removed","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"831d640954ee32cf00ed03495354cbe5f0e110f7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutronclient import shell"},{"line_number":26,"context_line":"from neutronclient.v2_0 import client"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"API_VERSION \u003d \"2.0\""},{"line_number":30,"context_line":"FORMAT \u003d \u0027json\u0027"},{"line_number":31,"context_line":"TOKEN \u003d \u0027testtoken\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fs6E%3D","side":"PARENT","line":28,"updated":"2013-07-12 19:23:34.000000000","message":"Is it related to this patch?","commit_id":"037497da521b5c1cf8cb53837f9af10eb755210e"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutronclient import shell"},{"line_number":26,"context_line":"from neutronclient.v2_0 import client"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"API_VERSION \u003d \"2.0\""},{"line_number":30,"context_line":"FORMAT \u003d \u0027json\u0027"},{"line_number":31,"context_line":"TOKEN \u003d \u0027testtoken\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAQn%2F%2F39c%3D","side":"PARENT","line":28,"in_reply_to":"AAAAP3%2F%2Fs6E%3D","updated":"2013-07-31 06:33:45.000000000","message":"Done. it\u0027s unrelated, so removed change.","commit_id":"037497da521b5c1cf8cb53837f9af10eb755210e"},{"author":{"_account_id":7708,"name":"Sergey Vilgelm","username":"svilgelm","inactive":true},"unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.client.format \u003d self.format"},{"line_number":212,"context_line":"        resstr \u003d self.client.serialize(ress)"},{"line_number":213,"context_line":"        # url method body"},{"line_number":214,"context_line":"        plurals \u003d self.client.EXTED_PLURALS"},{"line_number":215,"context_line":"        resource_plural \u003d [k for k in plurals"},{"line_number":216,"context_line":"                           if plurals[k] \u003d\u003d resource][0]"},{"line_number":217,"context_line":"        path \u003d getattr(self.client, resource_plural + \"_path\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F%2BTg%3D","line":214,"updated":"2013-07-18 07:41:47.000000000","message":"You must use the function _get_resource_plural().","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.client.format \u003d self.format"},{"line_number":212,"context_line":"        resstr \u003d self.client.serialize(ress)"},{"line_number":213,"context_line":"        # url method body"},{"line_number":214,"context_line":"        plurals \u003d self.client.EXTED_PLURALS"},{"line_number":215,"context_line":"        resource_plural \u003d [k for k in plurals"},{"line_number":216,"context_line":"                           if plurals[k] \u003d\u003d resource][0]"},{"line_number":217,"context_line":"        path \u003d getattr(self.client, resource_plural + \"_path\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAQn%2F%2F3%2FQ%3D","line":214,"in_reply_to":"AAAAQn%2F%2F%2BTg%3D","updated":"2013-07-31 06:32:47.000000000","message":"Done (patch 25).","commit_id":"50dcac290951c8d6417f1d65919705176d6679ad"},{"author":{"_account_id":7708,"name":"Sergey Vilgelm","username":"svilgelm","inactive":true},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"import testtools"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import constants"},{"line_number":25,"context_line":"from neutronclient.neutron.v2_0 import _get_resource_plural"},{"line_number":26,"context_line":"from neutronclient import shell"},{"line_number":27,"context_line":"from neutronclient.v2_0 import client"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2F2UM%3D","line":25,"updated":"2013-07-22 06:40:30.000000000","message":"https://github.com/openstack-dev/hacking/blob/master/HACKING.rst#imports","commit_id":"bda3a8530df8714a7f66337a215113b320796988"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"import testtools"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutronclient.common import constants"},{"line_number":25,"context_line":"from neutronclient.neutron.v2_0 import _get_resource_plural"},{"line_number":26,"context_line":"from neutronclient import shell"},{"line_number":27,"context_line":"from neutronclient.v2_0 import client"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAQn%2F%2FcNc%3D","line":25,"in_reply_to":"AAAAQn%2F%2F2UM%3D","updated":"2013-07-31 06:32:08.000000000","message":"removed relative import","commit_id":"bda3a8530df8714a7f66337a215113b320796988"}],"tests/unit/test_cli20_firewall.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3c0ac78150fd06e3ff103369fc80a1229f315fe0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class CLITestV20FirewallJSON(test_cli20.CLITestV20Base):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_create_firewall_with_mandatory_params(self):"},{"line_number":29,"context_line":"        \"\"\"firewall-create with mandatory params only.\"\"\""},{"line_number":30,"context_line":"        resource \u003d \u0027firewall\u0027"},{"line_number":31,"context_line":"        cmd \u003d firewall.CreateFirewall(test_cli20.MyApp(sys.stdout), None)"},{"line_number":32,"context_line":"        name \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FmiE%3D","line":29,"updated":"2013-06-26 22:18:40.000000000","message":"it\u0027d be nice if these docstrings could be improved, they don\u0027t mean much, you might as well take them out.","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class CLITestV20FirewallJSON(test_cli20.CLITestV20Base):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_create_firewall_with_mandatory_params(self):"},{"line_number":29,"context_line":"        \"\"\"firewall-create with mandatory params only.\"\"\""},{"line_number":30,"context_line":"        resource \u003d \u0027firewall\u0027"},{"line_number":31,"context_line":"        cmd \u003d firewall.CreateFirewall(test_cli20.MyApp(sys.stdout), None)"},{"line_number":32,"context_line":"        name \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYCI%3D","line":29,"in_reply_to":"AAAAPn%2F%2FmiE%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}],"tests/unit/test_cli20_firewallpolicy.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3c0ac78150fd06e3ff103369fc80a1229f315fe0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._test_list_resources_with_pagination(resources, cmd)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_list_firewall_policies_sort(self):"},{"line_number":76,"context_line":"        \"\"\"firewall-policy-list --sort-key name --sort-key id --sort-key asc"},{"line_number":77,"context_line":"        --sort-key desc"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        resources \u003d \"firewall_policies\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fmh8%3D","line":76,"updated":"2013-06-26 22:18:40.000000000","message":"ditto","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"},{"author":{"_account_id":7753,"name":"Kuang-Ching Wang","email":"kuangching.wang@gmail.com","username":"kcwang"},"change_message_id":"6d4c945869d10e2d182b14f84adfdeeb2848a64e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self._test_list_resources_with_pagination(resources, cmd)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_list_firewall_policies_sort(self):"},{"line_number":76,"context_line":"        \"\"\"firewall-policy-list --sort-key name --sort-key id --sort-key asc"},{"line_number":77,"context_line":"        --sort-key desc"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        resources \u003d \"firewall_policies\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYCE%3D","line":76,"in_reply_to":"AAAAPn%2F%2Fmh8%3D","updated":"2013-07-03 01:53:19.000000000","message":"Done","commit_id":"5e3f7f854fc6e1c7e5c27fcce0abe7e0a89ab090"}]}
