)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I26c37198861735bf85eb79570f192c71c7dd9941"},{"line_number":16,"context_line":"Partial-Bug: #1754184"},{"line_number":17,"context_line":"bp: unified-limit-improve"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"bf659307_88dab1e6","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":25},"updated":"2018-04-10 15:42:58.000000000","message":"Until we get the details of this specification worked out, we might just be able to track everything in the bug you linked.","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I26c37198861735bf85eb79570f192c71c7dd9941"},{"line_number":16,"context_line":"Partial-Bug: #1754184"},{"line_number":17,"context_line":"bp: unified-limit-improve"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"bf659307_bc36c950","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":25},"in_reply_to":"bf659307_88dab1e6","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"}],"keystone/limit/backends/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        :param registered_limits: a list of dictionaries representing limits to"},{"line_number":40,"context_line":"                                  create."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :returns: all the new created registered limits."},{"line_number":43,"context_line":"        :raises keystone.exception.Conflict: If a duplicate registered limit"},{"line_number":44,"context_line":"            exists."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_08f0e166","line":42,"range":{"start_line":42,"start_character":26,"end_line":42,"end_character":29},"updated":"2018-04-10 15:42:58.000000000","message":"nit: newly*","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        :param registered_limits: a list of dictionaries representing limits to"},{"line_number":40,"context_line":"                                  create."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :returns: all the new created registered limits."},{"line_number":43,"context_line":"        :raises keystone.exception.Conflict: If a duplicate registered limit"},{"line_number":44,"context_line":"            exists."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_dc14dda2","line":42,"range":{"start_line":42,"start_character":26,"end_line":42,"end_character":29},"in_reply_to":"bf659307_08f0e166","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param limits: a list of dictionaries representing limits to create."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        :returns: all the new created limits."},{"line_number":110,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."},{"line_number":111,"context_line":"        :raises keystone.exception.NoLimitReference: If no reference registered"},{"line_number":112,"context_line":"            limit exists."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_28f36575","line":109,"range":{"start_line":109,"start_character":26,"end_line":109,"end_character":29},"updated":"2018-04-10 15:42:58.000000000","message":"nit: newly*","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :param limits: a list of dictionaries representing limits to create."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        :returns: all the new created limits."},{"line_number":110,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."},{"line_number":111,"context_line":"        :raises keystone.exception.NoLimitReference: If no reference registered"},{"line_number":112,"context_line":"            limit exists."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_1c1ed5ba","line":109,"range":{"start_line":109,"start_character":26,"end_line":109,"end_character":29},"in_reply_to":"bf659307_28f36575","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"}],"keystone/limit/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027registered_limit\u0027)"},{"line_number":136,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":137,"context_line":"        with sql.session_for_write() as session:"},{"line_number":138,"context_line":"            return_ref \u003d []"},{"line_number":139,"context_line":"            for registered_limit in registered_limits:"},{"line_number":140,"context_line":"                if registered_limit.get(\u0027region_id\u0027) is None:"},{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_e8ec8d90","line":138,"range":{"start_line":138,"start_character":12,"end_line":138,"end_character":22},"updated":"2018-04-10 15:42:58.000000000","message":"nit: \n\n  limits \u003d []\n\nis a bit more descriptive of what is contained within the list.","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027registered_limit\u0027)"},{"line_number":136,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":137,"context_line":"        with sql.session_for_write() as session:"},{"line_number":138,"context_line":"            return_ref \u003d []"},{"line_number":139,"context_line":"            for registered_limit in registered_limits:"},{"line_number":140,"context_line":"                if registered_limit.get(\u0027region_id\u0027) is None:"},{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_dc793dfc","line":138,"range":{"start_line":138,"start_character":12,"end_line":138,"end_character":22},"in_reply_to":"bf659307_e8ec8d90","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def create_limits(self, limits):"},{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            with sql.session_for_write() as session:"},{"line_number":212,"context_line":"                return_ref \u003d []"},{"line_number":213,"context_line":"                for limit in limits:"},{"line_number":214,"context_line":"                    if limit.get(\u0027region_id\u0027) is None:"},{"line_number":215,"context_line":"                        self._check_unified_limit_without_region("}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_a8fe9535","line":212,"range":{"start_line":212,"start_character":16,"end_line":212,"end_character":26},"updated":"2018-04-10 15:42:58.000000000","message":"nit: same comment here.","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def create_limits(self, limits):"},{"line_number":210,"context_line":"        try:"},{"line_number":211,"context_line":"            with sql.session_for_write() as session:"},{"line_number":212,"context_line":"                return_ref \u003d []"},{"line_number":213,"context_line":"                for limit in limits:"},{"line_number":214,"context_line":"                    if limit.get(\u0027region_id\u0027) is None:"},{"line_number":215,"context_line":"                        self._check_unified_limit_without_region("}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_fc67614c","line":212,"range":{"start_line":212,"start_character":16,"end_line":212,"end_character":26},"in_reply_to":"bf659307_a8fe9535","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"085d847cc4f02f5638b9f8cd845fe92554f1c563","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            for registered_limit in registered_limits:"},{"line_number":140,"context_line":"                if registered_limit.get(\u0027region_id\u0027) is None:"},{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"},{"line_number":142,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":143,"context_line":"                session.add(ref)"},{"line_number":144,"context_line":"                new_registered_limits.append(ref.to_dict())"},{"line_number":145,"context_line":"            return new_registered_limits"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f6a8fd7_16280484","line":142,"range":{"start_line":142,"start_character":53,"end_line":142,"end_character":69},"updated":"2018-05-02 18:16:19.000000000","message":"Could we append this to new_registered_limits instead of rebuilding a dict from ref?","commit_id":"6ec45b127d780ea68dcb9a2c919a079c297292e3"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c8740a7eb489f04166013d36b19f224f70b211af","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            for registered_limit in registered_limits:"},{"line_number":140,"context_line":"                if registered_limit.get(\u0027region_id\u0027) is None:"},{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"},{"line_number":142,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":143,"context_line":"                session.add(ref)"},{"line_number":144,"context_line":"                new_registered_limits.append(ref.to_dict())"},{"line_number":145,"context_line":"            return new_registered_limits"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_0c182773","line":142,"range":{"start_line":142,"start_character":53,"end_line":142,"end_character":69},"in_reply_to":"5f7c97a3_806f45c4","updated":"2018-05-07 21:32:33.000000000","message":"It looks like the api-ref shows it returning null if region_id is not specified, so leaving this here is likely alright.","commit_id":"6ec45b127d780ea68dcb9a2c919a079c297292e3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"ca92c06d477c14a3e1d93e9129d13885c20c5506","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            for registered_limit in registered_limits:"},{"line_number":140,"context_line":"                if registered_limit.get(\u0027region_id\u0027) is None:"},{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"},{"line_number":142,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":143,"context_line":"                session.add(ref)"},{"line_number":144,"context_line":"                new_registered_limits.append(ref.to_dict())"},{"line_number":145,"context_line":"            return new_registered_limits"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_806f45c4","line":142,"range":{"start_line":142,"start_character":53,"end_line":142,"end_character":69},"in_reply_to":"9f6a8fd7_16280484","updated":"2018-05-04 09:09:26.000000000","message":"it\u0027s a little different.\nif registered_limit doesn\u0027t contain \"region_id\", ref.to_dict() will contain a pair like \"region_id: null\". So ref.to_dict() can ensure all the properties are returned.\n\nIf we don\u0027t want \"region_id\": null. I can remove ref.to_dict()","commit_id":"6ec45b127d780ea68dcb9a2c919a079c297292e3"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"085d847cc4f02f5638b9f8cd845fe92554f1c563","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                    self._check_unified_limit_without_region(registered_limit)"},{"line_number":142,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":143,"context_line":"                session.add(ref)"},{"line_number":144,"context_line":"                new_registered_limits.append(ref.to_dict())"},{"line_number":145,"context_line":"            return new_registered_limits"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027registered_limit\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f6a8fd7_963bb4cf","line":144,"range":{"start_line":144,"start_character":45,"end_line":144,"end_character":58},"updated":"2018-05-02 18:16:19.000000000","message":"registered_limit instead of ref.to_dict()","commit_id":"6ec45b127d780ea68dcb9a2c919a079c297292e3"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"085d847cc4f02f5638b9f8cd845fe92554f1c563","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    if limit.get(\u0027region_id\u0027) is None:"},{"line_number":215,"context_line":"                        self._check_unified_limit_without_region("},{"line_number":216,"context_line":"                            limit, is_registered_limit\u003dFalse)"},{"line_number":217,"context_line":"                    ref \u003d LimitModel.from_dict(limit)"},{"line_number":218,"context_line":"                    session.add(ref)"},{"line_number":219,"context_line":"                    new_limits.append(ref.to_dict())"},{"line_number":220,"context_line":"                return new_limits"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f6a8fd7_b636f8e6","line":217,"range":{"start_line":217,"start_character":47,"end_line":217,"end_character":52},"updated":"2018-05-02 18:16:19.000000000","message":"same question here","commit_id":"6ec45b127d780ea68dcb9a2c919a079c297292e3"}],"keystone/tests/unit/limit/test_backends.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":43,"context_line":"            region_id\u003dself.region_one[\u0027id\u0027],"},{"line_number":44,"context_line":"            resource_name\u003d\u0027backup\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":45,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":46,"context_line":"            [registered_limit_2, registered_limit_3])"},{"line_number":47,"context_line":"        self.assertEqual(2, len(res2))"},{"line_number":48,"context_line":"        for re in res2:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_68295d99","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":12},"updated":"2018-04-10 15:42:58.000000000","message":"Since we\u0027re not too worried about a naming conflict here, we can probably just name this:\n\n  limits \u003d PROVIDERS.unified_limit_api.create_registered_limits()\n\nand then adjust the loop below to read like:\n\n  for limit in limits:\n\nwhich reads a bit easier instead of having to keep a mental mapping of re -\u003e limits returned from create_registered_limits.","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":43,"context_line":"            region_id\u003dself.region_one[\u0027id\u0027],"},{"line_number":44,"context_line":"            resource_name\u003d\u0027backup\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":45,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":46,"context_line":"            [registered_limit_2, registered_limit_3])"},{"line_number":47,"context_line":"        self.assertEqual(2, len(res2))"},{"line_number":48,"context_line":"        for re in res2:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_7cd831ee","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":12},"in_reply_to":"bf659307_68295d99","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c3f017ed6407a7041524c28424f32183e9e78eab","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            region_id\u003dself.region_two[\u0027id\u0027],"},{"line_number":397,"context_line":"            resource_name\u003d\u0027backup\u0027, resource_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_limits([limit_2, limit_3])"},{"line_number":400,"context_line":"        for re in res2:"},{"line_number":401,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":402,"context_line":"                self.assertDictEqual(limit_2, re)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_880dd13f","line":399,"range":{"start_line":399,"start_character":8,"end_line":399,"end_character":12},"updated":"2018-04-10 15:42:58.000000000","message":"Same comments here as above.","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"71b3e282e6cdc2ea8846eb9cb6c365d86eba833c","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            region_id\u003dself.region_two[\u0027id\u0027],"},{"line_number":397,"context_line":"            resource_name\u003d\u0027backup\u0027, resource_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_limits([limit_2, limit_3])"},{"line_number":400,"context_line":"        for re in res2:"},{"line_number":401,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":402,"context_line":"                self.assertDictEqual(limit_2, re)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_bceb2976","line":399,"range":{"start_line":399,"start_character":8,"end_line":399,"end_character":12},"in_reply_to":"bf659307_880dd13f","updated":"2018-04-11 02:12:48.000000000","message":"Done","commit_id":"5326810428d2f1b5ff6a3a40242d693b08363b1b"}]}
