)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38fdab7b347d971a27ebc275b92d4ea7acd7acc9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"name which is returned (rather than id) via the API. The problem occurs if"},{"line_number":13,"context_line":"this security group is deleted in which case a 404 was raised."},{"line_number":14,"context_line":"This patch fixes this issue by catching the 404 and ignoring the rule as"},{"line_number":15,"context_line":"its already deleted as there is a constrain enforced that you cannot"},{"line_number":16,"context_line":"delete a security group if another security group has a rule that references"},{"line_number":17,"context_line":"that security group."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7adec928_f6cce863","line":15,"updated":"2014-05-09 16:39:10.000000000","message":"s/constrain/constraint/\n\nIs this the FK you\u0027re referring to?\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/db/sqlalchemy/models.py#n674","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":12,"context_line":"name which is returned (rather than id) via the API. The problem occurs if"},{"line_number":13,"context_line":"this security group is deleted in which case a 404 was raised."},{"line_number":14,"context_line":"This patch fixes this issue by catching the 404 and ignoring the rule as"},{"line_number":15,"context_line":"its already deleted as there is a constrain enforced that you cannot"},{"line_number":16,"context_line":"delete a security group if another security group has a rule that references"},{"line_number":17,"context_line":"that security group."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7adec928_e00df338","line":15,"in_reply_to":"7adec928_f6cce863","updated":"2014-05-10 06:51:54.000000000","message":"yup, also enforced in neutron.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"}],"nova/api/openstack/compute/contrib/security_groups.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"599dec3136b1d32a9659ea6367ca25aabd75bfd3","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."},{"line_number":233,"context_line":"                    LOG.info(_(\"Security Group ID %s does not exist\"),"},{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_d6f9acc9","line":233,"updated":"2014-05-09 16:37:49.000000000","message":"nit: I\u0027d remove ID from the message.\n\nShould also use _LI here from gettextutils.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."},{"line_number":233,"context_line":"                    LOG.info(_(\"Security Group ID %s does not exist\"),"},{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_3321f7fb","line":233,"in_reply_to":"7adec928_d6f9acc9","updated":"2014-05-10 06:51:54.000000000","message":"I think having the ID makes sense otherwise someone could have a security group with the same name as the id and it would be potentially confusing. \n\nSorry i don\u0027t follow the _LI from gettextutils comment :(","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"599dec3136b1d32a9659ea6367ca25aabd75bfd3","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"},{"line_number":237,"context_line":"                                \u0027tenant_id\u0027: source_group.get(\u0027project_id\u0027)}"},{"line_number":238,"context_line":"        else:"},{"line_number":239,"context_line":"            sg_rule[\u0027ip_range\u0027] \u003d {\u0027cidr\u0027: rule[\u0027cidr\u0027]}"},{"line_number":240,"context_line":"        return sg_rule"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_562d9c45","line":237,"updated":"2014-05-09 16:37:49.000000000","message":"Remove unrelated change.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"},{"line_number":237,"context_line":"                                \u0027tenant_id\u0027: source_group.get(\u0027project_id\u0027)}"},{"line_number":238,"context_line":"        else:"},{"line_number":239,"context_line":"            sg_rule[\u0027ip_range\u0027] \u003d {\u0027cidr\u0027: rule[\u0027cidr\u0027]}"},{"line_number":240,"context_line":"        return sg_rule"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_334ad7c5","line":237,"in_reply_to":"7adec928_562d9c45","updated":"2014-05-10 06:51:54.000000000","message":"I agree thought imho it makes the code a little nicer looking.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"599dec3136b1d32a9659ea6367ca25aabd75bfd3","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # up it\u0027s name."},{"line_number":411,"context_line":"        with translate_exceptions():"},{"line_number":412,"context_line":"            raise exception.SecurityGroupNotFound("},{"line_number":413,"context_line":"                security_group_id\u003dsg_rule[\u0027group_id\u0027])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def _rule_args_to_dict(self, context, to_port\u003dNone, from_port\u003dNone,"},{"line_number":416,"context_line":"                           ip_protocol\u003dNone, cidr\u003dNone, group_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_36c4905e","line":413,"updated":"2014-05-09 16:37:49.000000000","message":"Looks like group_id is optional, so shouldn\u0027t you be using security_group[\u0027id\u0027]?","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # up it\u0027s name."},{"line_number":411,"context_line":"        with translate_exceptions():"},{"line_number":412,"context_line":"            raise exception.SecurityGroupNotFound("},{"line_number":413,"context_line":"                security_group_id\u003dsg_rule[\u0027group_id\u0027])"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def _rule_args_to_dict(self, context, to_port\u003dNone, from_port\u003dNone,"},{"line_number":416,"context_line":"                           ip_protocol\u003dNone, cidr\u003dNone, group_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_b30d0793","line":413,"in_reply_to":"7adec928_36c4905e","updated":"2014-05-10 06:51:54.000000000","message":"I can add; if sg_rule[\u0027group_id\u0027] but the only way you can get here is if the group_id does not exist in the backend system anymore.  This should be group_id -- which is another security group that a rule references.  security_group[\u0027id\u0027] is the group that this rule is being added to.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"760654d44a8236af0e2e04c6fb9e94965cc6cb7d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                    # NOTE(arosen): There is a possible race condition that can"},{"line_number":227,"context_line":"                    # occur here if two api calls occur concurrently: one that"},{"line_number":228,"context_line":"                    # lists the security groups and another one that deletes a"},{"line_number":229,"context_line":"                    # security that has a group_id before the group_id is"},{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_3fa91f24","line":229,"updated":"2014-05-19 19:57:25.000000000","message":"s/deletes a security that/deletes a security group that/ :)","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"a151de3a383c99cdc3a84c75a42cbe7811a5b671","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                    # NOTE(arosen): There is a possible race condition that can"},{"line_number":227,"context_line":"                    # occur here if two api calls occur concurrently: one that"},{"line_number":228,"context_line":"                    # lists the security groups and another one that deletes a"},{"line_number":229,"context_line":"                    # security that has a group_id before the group_id is"},{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_11c37738","line":229,"in_reply_to":"7adec928_3fa91f24","updated":"2014-05-19 20:08:08.000000000","message":"Done","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"760654d44a8236af0e2e04c6fb9e94965cc6cb7d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."},{"line_number":233,"context_line":"                    LOG.info(_(\"Security Group ID %s does not exist\"),"},{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_ff7977c8","line":233,"updated":"2014-05-19 19:57:25.000000000","message":"Recommend DEBUG log level here, not INFO, as we\u0027re trying to keep INFO for notices about successful atomic operations, per:\n\nhttps://wiki.openstack.org/wiki/LoggingStandards#Messages_at_INFO_should_be_a_unit_of_work","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"a151de3a383c99cdc3a84c75a42cbe7811a5b671","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    # fetched. To handle this if SecurityGroupNotFound is"},{"line_number":231,"context_line":"                    # raised we return None instead of the rule and the caller"},{"line_number":232,"context_line":"                    # should ignore the rule."},{"line_number":233,"context_line":"                    LOG.info(_(\"Security Group ID %s does not exist\"),"},{"line_number":234,"context_line":"                            rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_f1c7eb42","line":233,"in_reply_to":"7adec928_ff7977c8","updated":"2014-05-19 20:08:08.000000000","message":"Done","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":4912,"name":"Michael H Wilson","email":"geekinutah@gmail.com","username":"geekinutah"},"change_message_id":"312072c34729c63423ce2da63bc99b5550eee96e","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                    # of the rule and the caller should ignore the rule."},{"line_number":233,"context_line":"                    LOG.debug(\"Security Group ID %s does not exist\","},{"line_number":234,"context_line":"                              rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"},{"line_number":237,"context_line":"                                \u0027tenant_id\u0027: source_group.get(\u0027project_id\u0027)}"},{"line_number":238,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_943a15e5","line":235,"updated":"2014-05-19 20:47:58.000000000","message":"nit: return None is so explicit :-)","commit_id":"eb84cfb4ef7376401f48488d4810714c2664e5fa"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"6d55b53e5020d02aa11371e40348a70c42cc4013","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                    # of the rule and the caller should ignore the rule."},{"line_number":233,"context_line":"                    LOG.debug(\"Security Group ID %s does not exist\","},{"line_number":234,"context_line":"                              rule[\u0027group_id\u0027])"},{"line_number":235,"context_line":"                    return"},{"line_number":236,"context_line":"            sg_rule[\u0027group\u0027] \u003d {\u0027name\u0027: source_group.get(\u0027name\u0027),"},{"line_number":237,"context_line":"                                \u0027tenant_id\u0027: source_group.get(\u0027project_id\u0027)}"},{"line_number":238,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_87c905ae","line":235,"in_reply_to":"7adec928_943a15e5","updated":"2014-05-19 20:59:32.000000000","message":"return already explicitly returns none. I don\u0027t think adding the None here makes anything more explicit.","commit_id":"eb84cfb4ef7376401f48488d4810714c2664e5fa"}],"nova/tests/api/openstack/compute/contrib/test_security_groups.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"599dec3136b1d32a9659ea6367ca25aabd75bfd3","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.assertEqual(res_dict, expected)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_get_security_group_list_missing_group_id_rule(self):"},{"line_number":314,"context_line":"        groups \u003d []"},{"line_number":315,"context_line":"        rule1 \u003d security_group_rule_template(cidr\u003d\u002710.2.3.124/24\u0027,"},{"line_number":316,"context_line":"                                             parent_group_id\u003d1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_9683a403","line":313,"updated":"2014-05-09 16:37:49.000000000","message":"This only tests the nova-network security group API, shouldn\u0027t you also have a test case for neutronv2 security group API in:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/tests/api/openstack/compute/contrib/test_neutron_security_groups.py\n\nThe security groups test class there extends the class this is in.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.assertEqual(res_dict, expected)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_get_security_group_list_missing_group_id_rule(self):"},{"line_number":314,"context_line":"        groups \u003d []"},{"line_number":315,"context_line":"        rule1 \u003d security_group_rule_template(cidr\u003d\u002710.2.3.124/24\u0027,"},{"line_number":316,"context_line":"                                             parent_group_id\u003d1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_d339b342","line":313,"in_reply_to":"7adec928_9683a403","updated":"2014-05-10 06:51:54.000000000","message":"This test is run with neutron as well because of: \nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/tests/api/openstack/compute/contrib/test_neutron_security_groups.py#n53\n\nIn fact the test failed on my first patch set: http://logs.openstack.org/93/92893/1/check/gate-nova-python27/9d328d8/testr_results.html.gz","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"599dec3136b1d32a9659ea6367ca25aabd75bfd3","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        def return_security_groups(context, project, search_opts):"},{"line_number":344,"context_line":"            return [security_group_db(sg) for sg in groups]"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        self.stubs.Set(self.controller.security_group_api, \u0027list\u0027,"},{"line_number":347,"context_line":"                       return_security_groups)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_3672d049","line":346,"updated":"2014-05-09 16:37:49.000000000","message":"Use mock instead.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e8a587f7873ff1bdb956bf7d557352c90b3a7911","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        def return_security_groups(context, project, search_opts):"},{"line_number":344,"context_line":"            return [security_group_db(sg) for sg in groups]"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        self.stubs.Set(self.controller.security_group_api, \u0027list\u0027,"},{"line_number":347,"context_line":"                       return_security_groups)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_f33f8f23","line":346,"in_reply_to":"7adec928_3672d049","updated":"2014-05-10 06:51:54.000000000","message":"This whole file uses stubs already. I\u0027d rather replace all the stubs at once in a separate patch if that\u0027s okay with you.","commit_id":"4ed01ed9bc72720aca098c22bb36ac4b4fdd106d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"760654d44a8236af0e2e04c6fb9e94965cc6cb7d","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            return [security_group_db(sg) for sg in groups]"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        self.stubs.Set(self.controller.security_group_api, \u0027list\u0027,"},{"line_number":348,"context_line":"                       return_security_groups)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_51d6df28","line":348,"updated":"2014-05-19 19:57:25.000000000","message":"Hate to be a pedant, but any way to have new unit tests use mock instead of mox?","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"503fb6f949120464560891552a2763620c9935ea","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            return [security_group_db(sg) for sg in groups]"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        self.stubs.Set(self.controller.security_group_api, \u0027list\u0027,"},{"line_number":348,"context_line":"                       return_security_groups)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_01dfe069","line":348,"in_reply_to":"7adec928_5107bf81","updated":"2014-06-04 14:17:40.000000000","message":"We won\u0027t accept mass conversions of tests from mox to mock.  What we should be doing is gradually moving over to mock-specific test classes for new test cases like Jim did here:\n\nhttps://review.openstack.org/#/c/79776/15/nova/tests/network/test_neutronv2.py\n\nThat might be a bit tricky with the test inheritance here though with Neutron, but you could just have a new test class in the neutron case that extends the new mock class here.","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"a151de3a383c99cdc3a84c75a42cbe7811a5b671","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            return [security_group_db(sg) for sg in groups]"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        self.stubs.Set(self.controller.security_group_api, \u0027list\u0027,"},{"line_number":348,"context_line":"                       return_security_groups)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_5107bf81","line":348,"in_reply_to":"7adec928_51d6df28","updated":"2014-05-19 20:08:08.000000000","message":"Is it okay if I change all the tests over in one swoop later?","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"760654d44a8236af0e2e04c6fb9e94965cc6cb7d","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.assertEqual(res_dict, expected)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":356,"context_line":"        all_groups \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_712cbb99","line":353,"updated":"2014-05-19 19:57:25.000000000","message":"expected before actual please :)","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"a151de3a383c99cdc3a84c75a42cbe7811a5b671","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.assertEqual(res_dict, expected)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":356,"context_line":"        all_groups \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_91e6a7e6","line":353,"in_reply_to":"7adec928_712cbb99","updated":"2014-05-19 20:08:08.000000000","message":"All of the assets in this file do:  self.assertEqual(res_dict, expected). I rather change these all in it\u0027s own set?","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"503fb6f949120464560891552a2763620c9935ea","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/os-security-groups\u0027)"},{"line_number":351,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.assertEqual(res_dict, expected)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":356,"context_line":"        all_groups \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_01c6009a","line":353,"in_reply_to":"7adec928_91e6a7e6","updated":"2014-06-04 14:17:40.000000000","message":"Just because everyone did it incorrectly before doesn\u0027t mean we should continue doing it incorrectly - don\u0027t make me say the thing about jumping off bridges... :)","commit_id":"e6b1e8927c2f4c395b1839ca15fa243a54e8e7c8"}]}
