)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"one or more security groups had no rules it failed"},{"line_number":11,"context_line":"because python throws a KeyError. See bug [1]."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[1] https://bugs.launchpad.net/horizon/+bug/1840465"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug: 1840465"},{"line_number":16,"context_line":"Change-Id: I6e05a7dc6b6655514ee2bff6bd327da86f13900a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7faddb67_422448c6","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":51},"updated":"2019-08-19 07:06:04.000000000","message":"This is unnecessary as \"Closes-Bug: #nnnnn\" would be a good reference.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":10,"context_line":"one or more security groups had no rules it failed"},{"line_number":11,"context_line":"because python throws a KeyError. See bug [1]."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[1] https://bugs.launchpad.net/horizon/+bug/1840465"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug: 1840465"},{"line_number":16,"context_line":"Change-Id: I6e05a7dc6b6655514ee2bff6bd327da86f13900a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7faddb67_5d850dac","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":51},"in_reply_to":"7faddb67_422448c6","updated":"2019-08-19 07:50:40.000000000","message":"Done","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[1] https://bugs.launchpad.net/horizon/+bug/1840465"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug: 1840465"},{"line_number":16,"context_line":"Change-Id: I6e05a7dc6b6655514ee2bff6bd327da86f13900a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7faddb67_a23bbce7","line":15,"updated":"2019-08-19 07:06:04.000000000","message":"Closes-Bug: #1840465","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[1] https://bugs.launchpad.net/horizon/+bug/1840465"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug: 1840465"},{"line_number":16,"context_line":"Change-Id: I6e05a7dc6b6655514ee2bff6bd327da86f13900a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7faddb67_fd8dd9d3","line":15,"in_reply_to":"7faddb67_a23bbce7","updated":"2019-08-19 07:50:40.000000000","message":"Done","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"}],"openstack_dashboard/api/neutron.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if sg_dict is None:"},{"line_number":237,"context_line":"            sg_dict \u003d {sg[\u0027id\u0027]: sg[\u0027name\u0027]}"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        if hasattr(sg, \u0027security_group_rules\u0027):"},{"line_number":240,"context_line":"            sg[\u0027rules\u0027] \u003d [SecurityGroupRule(rule, sg_dict)"},{"line_number":241,"context_line":"                           for rule in sg[\u0027security_group_rules\u0027]]"},{"line_number":242,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_5de3cd05","line":239,"range":{"start_line":239,"start_character":19,"end_line":239,"end_character":21},"updated":"2019-08-19 07:06:04.000000000","message":"\"sg\" is a dict returned by neutronclient, so this check always returns false. What you need is \"sg\" dict contains \"security_gruop_rules\" key.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if sg_dict is None:"},{"line_number":237,"context_line":"            sg_dict \u003d {sg[\u0027id\u0027]: sg[\u0027name\u0027]}"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        if hasattr(sg, \u0027security_group_rules\u0027):"},{"line_number":240,"context_line":"            sg[\u0027rules\u0027] \u003d [SecurityGroupRule(rule, sg_dict)"},{"line_number":241,"context_line":"                           for rule in sg[\u0027security_group_rules\u0027]]"},{"line_number":242,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_3db13190","line":239,"range":{"start_line":239,"start_character":19,"end_line":239,"end_character":21},"in_reply_to":"7faddb67_5de3cd05","updated":"2019-08-19 07:50:40.000000000","message":"It turns out that all length check in unit tests were added due to this wrong condition.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        if hasattr(sg, \u0027security_group_rules\u0027):"},{"line_number":240,"context_line":"            sg[\u0027rules\u0027] \u003d [SecurityGroupRule(rule, sg_dict)"},{"line_number":241,"context_line":"                           for rule in sg[\u0027security_group_rules\u0027]]"},{"line_number":242,"context_line":"        else:"},{"line_number":243,"context_line":"            sg[\u0027rules\u0027] \u003d []"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_bdbbe1e2","line":241,"range":{"start_line":241,"start_character":39,"end_line":241,"end_character":65},"updated":"2019-08-19 07:06:04.000000000","message":"It looks enough to change this to:\n\n  sg.get(\u0027security_gruop_rules\u0027, [])","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        if hasattr(sg, \u0027security_group_rules\u0027):"},{"line_number":240,"context_line":"            sg[\u0027rules\u0027] \u003d [SecurityGroupRule(rule, sg_dict)"},{"line_number":241,"context_line":"                           for rule in sg[\u0027security_group_rules\u0027]]"},{"line_number":242,"context_line":"        else:"},{"line_number":243,"context_line":"            sg[\u0027rules\u0027] \u003d []"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_5dae6d2e","line":241,"range":{"start_line":241,"start_character":39,"end_line":241,"end_character":65},"in_reply_to":"7faddb67_bdbbe1e2","updated":"2019-08-19 07:50:40.000000000","message":"Done","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"}],"openstack_dashboard/dashboards/project/security_groups/tests.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        if self.security_group_rules.count() \u003e 0:"},{"line_number":168,"context_line":"            rule \u003d self.security_group_rules.first()"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            rule \u003d None"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        self.mock_is_extension_supported.return_value \u003d is_desc_support"},{"line_number":173,"context_line":"        self.mock_security_group_rule_create.return_value \u003d rule"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_3dcff17f","line":170,"updated":"2019-08-19 07:06:04.000000000","message":"Rather than introducing this kind of hacky things, it looks much better to ensure security_group_rules (and corresponding codes) always exists in api/neutron.py.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        if self.security_group_rules.count() \u003e 0:"},{"line_number":168,"context_line":"            rule \u003d self.security_group_rules.first()"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            rule \u003d None"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        self.mock_is_extension_supported.return_value \u003d is_desc_support"},{"line_number":173,"context_line":"        self.mock_security_group_rule_create.return_value \u003d rule"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_9db86575","line":170,"in_reply_to":"7faddb67_3dcff17f","updated":"2019-08-19 07:50:40.000000000","message":"This is no longer needed after updating api/neutron.py.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"}],"openstack_dashboard/test/test_data/neutron_data.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                   \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":499,"context_line":"                   \u0027id\u0027: \u0027443a4d7a-4bd2-4474-9a77-02b35c9f8c95\u0027,"},{"line_number":500,"context_line":"                   \u0027name\u0027: \u0027another_group\u0027}"},{"line_number":501,"context_line":"    # Empty security group, should not have any rules."},{"line_number":502,"context_line":"    sec_group_empty \u003d {\u0027tenant_id\u0027: \u00271\u0027,"},{"line_number":503,"context_line":"                       \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":504,"context_line":"                       \u0027id\u0027: \u0027144a1b3d-4cd4-5598-3c42-34f49d6d2c11\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_2227ccc9","line":501,"updated":"2019-08-19 07:06:04.000000000","message":"- A comma is unnecessary.\n- \"should not have\" -\u003e \"has\"","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                   \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":499,"context_line":"                   \u0027id\u0027: \u0027443a4d7a-4bd2-4474-9a77-02b35c9f8c95\u0027,"},{"line_number":500,"context_line":"                   \u0027name\u0027: \u0027another_group\u0027}"},{"line_number":501,"context_line":"    # Empty security group, should not have any rules."},{"line_number":502,"context_line":"    sec_group_empty \u003d {\u0027tenant_id\u0027: \u00271\u0027,"},{"line_number":503,"context_line":"                       \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":504,"context_line":"                       \u0027id\u0027: \u0027144a1b3d-4cd4-5598-3c42-34f49d6d2c11\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_fda63954","line":501,"in_reply_to":"7faddb67_2227ccc9","updated":"2019-08-19 07:50:40.000000000","message":"It was moved to after L.588 and rephrased.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":500,"context_line":"                   \u0027name\u0027: \u0027another_group\u0027}"},{"line_number":501,"context_line":"    # Empty security group, should not have any rules."},{"line_number":502,"context_line":"    sec_group_empty \u003d {\u0027tenant_id\u0027: \u00271\u0027,"},{"line_number":503,"context_line":"                       \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":504,"context_line":"                       \u0027id\u0027: \u0027144a1b3d-4cd4-5598-3c42-34f49d6d2c11\u0027,"},{"line_number":505,"context_line":"                       \u0027name\u0027: \u0027empty_group\u0027}"},{"line_number":506,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_c2191888","line":503,"range":{"start_line":503,"start_character":39,"end_line":503,"end_character":49},"updated":"2019-08-19 07:06:04.000000000","message":"Some meaning full description would be better.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":500,"context_line":"                   \u0027name\u0027: \u0027another_group\u0027}"},{"line_number":501,"context_line":"    # Empty security group, should not have any rules."},{"line_number":502,"context_line":"    sec_group_empty \u003d {\u0027tenant_id\u0027: \u00271\u0027,"},{"line_number":503,"context_line":"                       \u0027description\u0027: \u0027NotDefault\u0027,"},{"line_number":504,"context_line":"                       \u0027id\u0027: \u0027144a1b3d-4cd4-5598-3c42-34f49d6d2c11\u0027,"},{"line_number":505,"context_line":"                       \u0027name\u0027: \u0027empty_group\u0027}"},{"line_number":506,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_1da4754a","line":503,"range":{"start_line":503,"start_character":39,"end_line":503,"end_character":49},"in_reply_to":"7faddb67_c2191888","updated":"2019-08-19 07:50:40.000000000","message":"Done","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"}],"openstack_dashboard/test/unit/api/test_neutron.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":1300,"context_line":"            id\u003dset([sg_id]), fields\u003d[\u0027id\u0027, \u0027name\u0027])"},{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"    def test_security_group_rule_delete(self):"},{"line_number":1303,"context_line":"        if self.api_security_group_rules.count() \u003d\u003d 0:"},{"line_number":1304,"context_line":"            return"},{"line_number":1305,"context_line":"        sg_rule \u003d self.api_security_group_rules.first()"},{"line_number":1306,"context_line":"        self.qclient.delete_security_group_rule.return_value \u003d None"},{"line_number":1307,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_622144b4","line":1304,"range":{"start_line":1303,"start_character":8,"end_line":1304,"end_character":18},"updated":"2019-08-19 07:06:04.000000000","message":"We don\u0027t want to skip the test. It is better to check security_gruop_rule_delete is not called instead.","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":1155,"context_line":"        exp_rules \u003d exp_sg.get(\u0027security_group_rules\u0027, [])"},{"line_number":1156,"context_line":"        self.assertEqual(len(exp_rules), len(ret_sg.rules))"},{"line_number":1157,"context_line":"        for (exprule, retrule) in six.moves.zip(exp_rules, ret_sg.rules):"},{"line_number":1158,"context_line":"            self._cmp_sg_rule(exprule, retrule)"},{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    def _test_security_group_list(self, **params):"},{"line_number":1161,"context_line":"        sgs \u003d self.api_security_groups.list()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_3d8851c4","line":1158,"updated":"2019-08-19 07:50:40.000000000","message":"NOTE: this function covers SG without rules (neutron_data has been updated), so there is no need to add a new test corresponding to this change.","commit_id":"cdb191ec83f86dffade56be07ca53077d7c78b14"}],"releasenotes/notes/security-group-no-rules-list-bugfix-b77ab5aff1d3e45e.yaml":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"45cea97d50dacdc868487f36854712a857afce9f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixed a bug where listing security groups did not work if one or more"},{"line_number":5,"context_line":"    security groups had no rules in them."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_8241e065","line":5,"updated":"2019-08-19 07:06:04.000000000","message":"In case of bug fixes, could you include the bug link?\nThe following should work:\n\n [:bug:`1840465`]","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f9e24e5394d09c7f5b229543892d5f06a5a3b78","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixed a bug where listing security groups did not work if one or more"},{"line_number":5,"context_line":"    security groups had no rules in them."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_7d6809f3","line":5,"in_reply_to":"7faddb67_8241e065","updated":"2019-08-19 07:50:40.000000000","message":"Done","commit_id":"1cb02149cd7be4d715a5c85f1495c58df29458f5"}]}
