)]}'
{"keystone/common/sql/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        won\u0027t match any value in the column in the table."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        if value is None:"},{"line_number":332,"context_line":"            return"},{"line_number":333,"context_line":"        col \u003d col_attr.property.columns[0]"},{"line_number":334,"context_line":"        if isinstance(col.type, sql.types.Boolean):"},{"line_number":335,"context_line":"            # The column is a Boolean, we should have already validated input."}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_ae46a74e","line":332,"range":{"start_line":331,"start_character":8,"end_line":332,"end_character":18},"updated":"2017-12-27 20:04:55.000000000","message":"Is this to make it so we can have region_id be None?","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        won\u0027t match any value in the column in the table."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        if value is None:"},{"line_number":332,"context_line":"            return"},{"line_number":333,"context_line":"        col \u003d col_attr.property.columns[0]"},{"line_number":334,"context_line":"        if isinstance(col.type, sql.types.Boolean):"},{"line_number":335,"context_line":"            # The column is a Boolean, we should have already validated input."}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_7fa50fb5","line":332,"range":{"start_line":331,"start_character":8,"end_line":332,"end_character":18},"in_reply_to":"bf8cb3f7_ae46a74e","updated":"2017-12-28 02:55:33.000000000","message":"Yes!","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ba1cc8a18c7cc78b36b66e597ce03f628da38e76","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        won\u0027t match any value in the column in the table."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        if value is None:"},{"line_number":332,"context_line":"            return"},{"line_number":333,"context_line":"        col \u003d col_attr.property.columns[0]"},{"line_number":334,"context_line":"        if isinstance(col.type, sql.types.Boolean):"},{"line_number":335,"context_line":"            # The column is a Boolean, we should have already validated input."}],"source_content_type":"text/x-python","patch_set":20,"id":"9f91af0f_9f9b8f16","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":18},"updated":"2018-01-08 22:52:34.000000000","message":"This potentially could change behaviors, but it looks benign.","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4f129474f8fd1f745d53e34fdb99087303f26468","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        won\u0027t match any value in the column in the table."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        if value is None:"},{"line_number":332,"context_line":"            return"},{"line_number":333,"context_line":"        col \u003d col_attr.property.columns[0]"},{"line_number":334,"context_line":"        if isinstance(col.type, sql.types.Boolean):"},{"line_number":335,"context_line":"            # The column is a Boolean, we should have already validated input."}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_e7967095","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":18},"in_reply_to":"9f91af0f_69afe67c","updated":"2018-01-10 17:19:27.000000000","message":"Simply because it is now explicitly returning on a None which would never match before and raise. Like i said, looks mostly benign.","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"71ebb2930534067549232d93bf7ea73ba28f33ba","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        won\u0027t match any value in the column in the table."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        if value is None:"},{"line_number":332,"context_line":"            return"},{"line_number":333,"context_line":"        col \u003d col_attr.property.columns[0]"},{"line_number":334,"context_line":"        if isinstance(col.type, sql.types.Boolean):"},{"line_number":335,"context_line":"            # The column is a Boolean, we should have already validated input."}],"source_content_type":"text/x-python","patch_set":20,"id":"9f91af0f_69afe67c","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":18},"in_reply_to":"9f91af0f_9f9b8f16","updated":"2018-01-09 15:18:33.000000000","message":"How so?","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"}],"keystone/exception.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Forbid to create limits that don\u0027t have registered\""},{"line_number":469,"context_line":"                       \"limit reference\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_80f56759","line":468,"range":{"start_line":468,"start_character":64,"end_line":468,"end_character":74},"updated":"2017-12-19 20:30:26.000000000","message":"We\u0027ll need a space after registered so that it renders properly.\n\n  message_format \u003d _(\"Unable to create limits without a proper registered \"\n                     \"limit.\")","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Forbid to create limits that don\u0027t have registered\""},{"line_number":469,"context_line":"                       \"limit reference\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_ef9a1b6d","line":468,"range":{"start_line":468,"start_character":64,"end_line":468,"end_character":74},"in_reply_to":"df87a7cf_80f56759","updated":"2017-12-20 02:26:25.000000000","message":"Done","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Forbid to create limit that don\u0027t have registered \""},{"line_number":469,"context_line":"                       \"limit reference\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_b1661529","line":468,"range":{"start_line":468,"start_character":24,"end_line":468,"end_character":30},"updated":"2017-12-26 21:12:09.000000000","message":"nit: Unable to create a limit that doesn\u0027t have a corresponding registered limit.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"eadcba2c938166d054e2fa0928b6329d4dc08e43","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Forbid to create limit that don\u0027t have registered \""},{"line_number":469,"context_line":"                       \"limit reference\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_aa653e47","line":468,"range":{"start_line":468,"start_character":24,"end_line":468,"end_character":30},"in_reply_to":"bf8cb3f7_b1661529","updated":"2017-12-27 08:10:29.000000000","message":"Done","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Unable to create a limit that doesn\u0027t have a\""},{"line_number":469,"context_line":"                       \"corresponding registered limit\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_6e7adf88","line":468,"range":{"start_line":468,"start_character":67,"end_line":468,"end_character":68},"updated":"2017-12-27 20:04:55.000000000","message":"nit: We will need to put a space after \"a\" here so that the error renders properly.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Unable to create a limit that doesn\u0027t have a\""},{"line_number":469,"context_line":"                       \"corresponding registered limit\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_1faac384","line":468,"range":{"start_line":468,"start_character":67,"end_line":468,"end_character":68},"in_reply_to":"bf8cb3f7_6e7adf88","updated":"2017-12-28 02:55:33.000000000","message":"Done","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ba1cc8a18c7cc78b36b66e597ce03f628da38e76","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Unable to create a limit that doesn\u0027t have a \""},{"line_number":469,"context_line":"                       \"corresponding registered limit\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f91af0f_bf8f73cb","line":468,"range":{"start_line":468,"start_character":54,"end_line":468,"end_character":68},"updated":"2018-01-08 22:52:34.000000000","message":"NIT: \"that has no corresponding registered limit\".\n\nCleaner language.","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"}],"keystone/limit/backends/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":28,"context_line":"class RegisteredLimitDriverBase(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":32,"context_line":"        \"\"\"Create a new registered limit."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_e088f3c6","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":32},"updated":"2017-12-19 20:30:26.000000000","message":"According to the specification, this is supposed to create a single limit:\n\nhttp://specs.openstack.org/openstack/keystone-specs/specs/keystone/queens/limits-api.html#create-registered-limits","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":28,"context_line":"class RegisteredLimitDriverBase(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":32,"context_line":"        \"\"\"Create a new registered limit."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_0a2f2d88","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":32},"in_reply_to":"df87a7cf_e088f3c6","updated":"2017-12-20 02:26:25.000000000","message":"I don\u0027t think so.\n\"this supports sending a number of limit definitions at once\"","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":41,"context_line":"        \"\"\"Update an existing registered limit."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :raises keystone.exception.RegisteredLimitNotFound: If limit doesn\u0027t"},{"line_number":44,"context_line":"            exist."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_a08e6bce","line":41,"range":{"start_line":41,"start_character":11,"end_line":41,"end_character":47},"updated":"2017-12-19 20:30:26.000000000","message":"This can be done with multiple limits thought, too.","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":41,"context_line":"        \"\"\"Update an existing registered limit."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :raises keystone.exception.RegisteredLimitNotFound: If limit doesn\u0027t"},{"line_number":44,"context_line":"            exist."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_aa4de172","line":41,"range":{"start_line":41,"start_character":11,"end_line":41,"end_character":47},"in_reply_to":"df87a7cf_a08e6bce","updated":"2017-12-20 02:26:25.000000000","message":"Done","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                      Any filters satisfied here will be removed so that"},{"line_number":56,"context_line":"                      the caller will know if any filters remain."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :returns: a list of limit_refs or an empty list."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_40b99f76","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":56},"updated":"2017-12-19 20:30:26.000000000","message":"The types here would specifically be a list of dictionaries.","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                      Any filters satisfied here will be removed so that"},{"line_number":56,"context_line":"                      the caller will know if any filters remain."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :returns: a list of limit_refs or an empty list."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_ca52a513","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":56},"in_reply_to":"df87a7cf_40b99f76","updated":"2017-12-20 02:26:25.000000000","message":"Done","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":86,"context_line":"class LimitDriverBase(object):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @abc.abstractmethod"},{"line_number":89,"context_line":"    def create_limits(self, limits):"},{"line_number":90,"context_line":"        \"\"\"Create a new limit."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_e0b1d390","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":21},"updated":"2017-12-19 20:30:26.000000000","message":"Create multiple limits or a single limit?","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":86,"context_line":"class LimitDriverBase(object):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @abc.abstractmethod"},{"line_number":89,"context_line":"    def create_limits(self, limits):"},{"line_number":90,"context_line":"        \"\"\"Create a new limit."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_8a581d31","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":21},"in_reply_to":"df87a7cf_e0b1d390","updated":"2017-12-20 02:26:25.000000000","message":"multiple as well.","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":28,"context_line":"class RegisteredLimitDriverBase(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":32,"context_line":"        \"\"\"Create new registered limits."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_1177c1d6","line":31,"range":{"start_line":31,"start_character":39,"end_line":31,"end_character":56},"updated":"2017-12-26 21:12:09.000000000","message":"We can document this as a parameter below.\n\n  :param registered_limits: a list of dictionaries representing limits to create.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"eadcba2c938166d054e2fa0928b6329d4dc08e43","unresolved":false,"context_lines":[{"line_number":28,"context_line":"class RegisteredLimitDriverBase(object):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @abc.abstractmethod"},{"line_number":31,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":32,"context_line":"        \"\"\"Create new registered limits."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        :raises keystone.exception.Conflict: If a duplicate limit exists."}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_ca4f62bb","line":31,"range":{"start_line":31,"start_character":39,"end_line":31,"end_character":56},"in_reply_to":"bf8cb3f7_1177c1d6","updated":"2017-12-27 08:10:29.000000000","message":"Done","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":41,"context_line":"        \"\"\"Update existing registered limits."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :raises keystone.exception.RegisteredLimitNotFound: If limit doesn\u0027t"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_d180798e","line":40,"range":{"start_line":40,"start_character":39,"end_line":40,"end_character":56},"updated":"2017-12-26 21:12:09.000000000","message":"nit: same comment here as above.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"eadcba2c938166d054e2fa0928b6329d4dc08e43","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":41,"context_line":"        \"\"\"Update existing registered limits."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :raises keystone.exception.RegisteredLimitNotFound: If limit doesn\u0027t"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_4ad112cd","line":40,"range":{"start_line":40,"start_character":39,"end_line":40,"end_character":56},"in_reply_to":"bf8cb3f7_d180798e","updated":"2017-12-27 08:10:29.000000000","message":"Done","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @abc.abstractmethod"},{"line_number":63,"context_line":"    def get_registered_limit(self, registered_limit_id):"},{"line_number":64,"context_line":"        \"\"\"Get a registered limit."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: limit_ref"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_f17b3dbb","line":63,"range":{"start_line":63,"start_character":35,"end_line":63,"end_character":54},"updated":"2017-12-26 21:12:09.000000000","message":"Same comment here as above, which should be applied to the rest of the module.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"eadcba2c938166d054e2fa0928b6329d4dc08e43","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @abc.abstractmethod"},{"line_number":63,"context_line":"    def get_registered_limit(self, registered_limit_id):"},{"line_number":64,"context_line":"        \"\"\"Get a registered limit."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: limit_ref"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_6ad416be","line":63,"range":{"start_line":63,"start_character":35,"end_line":63,"end_character":54},"in_reply_to":"bf8cb3f7_f17b3dbb","updated":"2017-12-27 08:10:29.000000000","message":"Done","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"329351ed5b7a08e6bbf0c55b7102870ff71e016c","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        :param registered_limit_id: the registered limit id to get."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        :returns: limit_ref."},{"line_number":80,"context_line":"        :raises keystone.exception.RegisteredLimitNotFound: If registered limit"},{"line_number":81,"context_line":"            doesn\u0027t exist."},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_900214b4","line":79,"range":{"start_line":79,"start_character":18,"end_line":79,"end_character":27},"updated":"2018-01-02 21:55:22.000000000","message":"nit: we could describe this in terms of types (e.g. a dictionary representing a limit reference.)","commit_id":"9399909f902ade059a7605e88a0f3cfca86d8da3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"329351ed5b7a08e6bbf0c55b7102870ff71e016c","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        :param limits: a list of dictionaries representing limits to update."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :returns: all the limits."},{"line_number":123,"context_line":"        :raises keystone.exception.LimitNotFound: If limit doesn\u0027t"},{"line_number":124,"context_line":"            exist."},{"line_number":125,"context_line":"        :raises keystone.exception.Conflict: If update to a duplicate limit."}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_b0ff18a9","line":122,"range":{"start_line":122,"start_character":8,"end_line":122,"end_character":33},"updated":"2018-01-02 21:55:22.000000000","message":"Similar comment here as above. We could describe this as a list of dictionaries, where each dictionary is a limit reference.","commit_id":"9399909f902ade059a7605e88a0f3cfca86d8da3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"329351ed5b7a08e6bbf0c55b7102870ff71e016c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @abc.abstractmethod"},{"line_number":131,"context_line":"    def list_limits(self, hints, project_id):"},{"line_number":132,"context_line":"        \"\"\"List all limits for project_id."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param hints: contains the list of filters yet to be satisfied."}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_50d32c39","line":131,"range":{"start_line":131,"start_character":4,"end_line":131,"end_character":45},"updated":"2018-01-02 21:55:22.000000000","message":"I\u0027m not sure if I left this comment on this patch or another one. But this feels like we either need to modify the name or add another list_limits method.\n\n  def list_limits_for_project(self, hints, project_id):\n      ...\n  \n  def list_limits(self, hints):\n      ...","commit_id":"9399909f902ade059a7605e88a0f3cfca86d8da3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b0e1cf2f4c6aeb04b2749b1cb36d7a739449ebba","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @abc.abstractmethod"},{"line_number":127,"context_line":"    def list_limits(self, hints):"},{"line_number":128,"context_line":"        \"\"\"List all limits for project_id."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param hints: contains the list of filters yet to be satisfied."},{"line_number":131,"context_line":"                      Any filters satisfied here will be removed so that"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_51f55c82","line":128,"range":{"start_line":128,"start_character":26,"end_line":128,"end_character":41},"updated":"2018-01-03 19:01:02.000000000","message":"This bit could be removed now.","commit_id":"f8a653ed7a41af2ab1b036e29f3c47ecc5e39911"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"cc861729a813185dbc12ef740e72c90138a0a2f9","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @abc.abstractmethod"},{"line_number":127,"context_line":"    def list_limits(self, hints):"},{"line_number":128,"context_line":"        \"\"\"List all limits for project_id."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param hints: contains the list of filters yet to be satisfied."},{"line_number":131,"context_line":"                      Any filters satisfied here will be removed so that"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_afa23c4a","line":128,"range":{"start_line":128,"start_character":26,"end_line":128,"end_character":41},"in_reply_to":"9f91af0f_51f55c82","updated":"2018-01-04 02:33:01.000000000","message":"Done","commit_id":"f8a653ed7a41af2ab1b036e29f3c47ecc5e39911"}],"keystone/limit/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ca6c62b27c31bbc3acef527413e2f30e63b9c036","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    resource_name \u003d sql.Column(sql.String(255))"},{"line_number":41,"context_line":"    default_limit \u003d sql.Column(sql.Integer, nullable\u003dFalse)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    __table_args__ \u003d ("},{"line_number":44,"context_line":"        sqlalchemy.UniqueConstraint(\u0027service_id\u0027,"},{"line_number":45,"context_line":"                                    \u0027region_id\u0027,"},{"line_number":46,"context_line":"                                    \u0027resource_name\u0027),)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class LimitModel(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_bb4d3e3c","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":54},"updated":"2017-12-19 20:30:26.000000000","message":"Same concern here as in a previous patch set.","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"640be86b2f6a14da0ba80395917ec87c09cb5304","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    resource_name \u003d sql.Column(sql.String(255))"},{"line_number":41,"context_line":"    default_limit \u003d sql.Column(sql.Integer, nullable\u003dFalse)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    __table_args__ \u003d ("},{"line_number":44,"context_line":"        sqlalchemy.UniqueConstraint(\u0027service_id\u0027,"},{"line_number":45,"context_line":"                                    \u0027region_id\u0027,"},{"line_number":46,"context_line":"                                    \u0027resource_name\u0027),)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class LimitModel(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_6a6cb9cf","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":54},"in_reply_to":"df87a7cf_bb4d3e3c","updated":"2017-12-20 02:26:25.000000000","message":"Replied in the previous patch. Please take a look. Thanks.","commit_id":"6ac8b92cd8d9349087a8e96b5a65ef3227af7db0"},{"author":{"_account_id":27385,"name":"lvxianguo","email":"lvxianguo@inspur.com","username":"lvxianguo"},"change_message_id":"9cacc013d586b10d9d213a4cf49234e9b60a6acf","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        with sql.session_for_read() as session:"},{"line_number":207,"context_line":"            limits \u003d session.query(LimitModel)"},{"line_number":208,"context_line":"            limits \u003d sql.filter_limit_query(LimitModel, limits, hints)"},{"line_number":209,"context_line":"        if limits.all():"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Duplicate entry\u0027)"},{"line_number":211,"context_line":"            raise exception.Conflict(type\u003d\u0027limit\u0027, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df87a7cf_9d286486","line":208,"range":{"start_line":208,"start_character":25,"end_line":208,"end_character":43},"updated":"2017-12-20 08:40:44.000000000","message":"Is there a possibility of empty results here","commit_id":"73fcfadabdb5e4f0aca04726ddff274bf2d56533"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                                             registered_limit_id)"},{"line_number":131,"context_line":"            session.delete(ref)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def check_registered_limit_duplicated(self, registered_limit):"},{"line_number":134,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":135,"context_line":"        hints.add_filter(\u0027service_id\u0027, registered_limit[\u0027service_id\u0027])"},{"line_number":136,"context_line":"        hints.add_filter(\u0027resource_name\u0027, registered_limit[\u0027resource_name\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_143c8fc6","line":133,"range":{"start_line":133,"start_character":30,"end_line":133,"end_character":41},"updated":"2017-12-26 21:12:09.000000000","message":"We could make this method simpler and just have it check the limits based on the attributes passed in. If there is a match, return it. Then the manager can handle the duplicate error logic on line 144.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":135,"context_line":"        hints.add_filter(\u0027service_id\u0027, registered_limit[\u0027service_id\u0027])"},{"line_number":136,"context_line":"        hints.add_filter(\u0027resource_name\u0027, registered_limit[\u0027resource_name\u0027])"},{"line_number":137,"context_line":"        hints.add_filter(\u0027region_id\u0027, None)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        with sql.session_for_read() as session:"},{"line_number":140,"context_line":"            registered_limits \u003d session.query(RegisteredLimitModel)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_5409b729","line":137,"range":{"start_line":137,"start_character":38,"end_line":137,"end_character":42},"updated":"2017-12-26 21:12:09.000000000","message":"This is hardcoding the hints to always check for a region_id of None. We might want something like:\n\n  hints.add_filter(\u0027region_id\u0027, registered_limit.get(\u0027region_id\u0027))\n\nWhich should default to None if the registered limit passed in doesn\u0027t have a region_id attribute.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            msg \u003d _(\u0027Duplicate entry\u0027)"},{"line_number":146,"context_line":"            raise exception.Conflict(type\u003d\u0027registered_limit\u0027, details\u003dmsg)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def check_reference_exist(self, limit):"},{"line_number":149,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":150,"context_line":"        hints.add_filter(\u0027service_id\u0027, limit[\u0027service_id\u0027])"},{"line_number":151,"context_line":"        hints.add_filter(\u0027resource_name\u0027, limit[\u0027resource_name\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_d435c7db","line":148,"updated":"2017-12-26 21:12:09.000000000","message":"If we simplify the method above, then we might not need this method anymore. The manager layer could handle the cases where there is a duplicate and raise and error. It could also handle the case where nothing is returned from the backend and raise the NoLimitReference error.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                    session.add(ref)"},{"line_number":173,"context_line":"                    return_ref.append(ref.to_dict())"},{"line_number":174,"context_line":"                return return_ref"},{"line_number":175,"context_line":"        except db_exception.DBReferenceError:"},{"line_number":176,"context_line":"            raise exception.NoLimitReference()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027limit\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_b450430c","line":175,"range":{"start_line":175,"start_character":15,"end_line":175,"end_character":45},"updated":"2017-12-26 21:12:09.000000000","message":"Do we handle this because writing the limit fails because of FK constraints? If so - it might be tough for end users to know exactly why the request failed if we don\u0027t give them information about what is missing.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                                  limit_id)"},{"line_number":213,"context_line":"            session.delete(ref)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def check_limit_duplicated(self, limit):"},{"line_number":216,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":217,"context_line":"        hints.add_filter(\u0027project_id\u0027, limit[\u0027project_id\u0027])"},{"line_number":218,"context_line":"        hints.add_filter(\u0027service_id\u0027, limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_745abb2a","line":215,"range":{"start_line":215,"start_character":20,"end_line":215,"end_character":30},"updated":"2017-12-26 21:12:09.000000000","message":"Same comment here about pulling some of the duplication checking into the manager. We should strive to make the backends as simple as possible and push business logic into the managers.","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7ff7934f8cb447608f758c131000a76e7aac9f49","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        hints.add_filter(\u0027project_id\u0027, limit[\u0027project_id\u0027])"},{"line_number":218,"context_line":"        hints.add_filter(\u0027service_id\u0027, limit[\u0027service_id\u0027])"},{"line_number":219,"context_line":"        hints.add_filter(\u0027resource_name\u0027, limit[\u0027resource_name\u0027])"},{"line_number":220,"context_line":"        hints.add_filter(\u0027region_id\u0027, None)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        with sql.session_for_read() as session:"},{"line_number":223,"context_line":"            limits \u003d session.query(LimitModel)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf8cb3f7_f4456b44","line":220,"range":{"start_line":220,"start_character":8,"end_line":220,"end_character":43},"updated":"2017-12-26 21:12:09.000000000","message":"Same comment here as above. We might have to check the limit passed in and default to None if we don\u0027t find a region_id key:\n\n  hints.add_filter(\u0027region_id\u0027, limit.get(\u0027region_id\u0027))","commit_id":"37eb2c7dba2d89569ae7976d23825015b457c4bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":88,"context_line":"        with sql.session_for_write() as session:"},{"line_number":89,"context_line":"            return_ref \u003d []"},{"line_number":90,"context_line":"            for registered_limit in registered_limits:"},{"line_number":91,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":92,"context_line":"                session.add(ref)"},{"line_number":93,"context_line":"                return_ref.append(ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_4e859b59","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":54},"updated":"2017-12-27 20:04:55.000000000","message":"What happens if only one limit in the list of limits is a duplicate? Does the entire write fall for all limits, or does it fail halfway through processing the list?","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":88,"context_line":"        with sql.session_for_write() as session:"},{"line_number":89,"context_line":"            return_ref \u003d []"},{"line_number":90,"context_line":"            for registered_limit in registered_limits:"},{"line_number":91,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":92,"context_line":"                session.add(ref)"},{"line_number":93,"context_line":"                return_ref.append(ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_9f9d7368","line":90,"range":{"start_line":90,"start_character":11,"end_line":90,"end_character":54},"in_reply_to":"bf8cb3f7_4e859b59","updated":"2017-12-28 02:55:33.000000000","message":"I tested it before, it will fall for all limits. I think it\u0027s because that we use \"with session..\" here.\nI\u0027ll write a test in the \"Limit provider\" patch.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            return_ref \u003d []"},{"line_number":90,"context_line":"            for registered_limit in registered_limits:"},{"line_number":91,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":92,"context_line":"                session.add(ref)"},{"line_number":93,"context_line":"                return_ref.append(ref.to_dict())"},{"line_number":94,"context_line":"            return return_ref"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_0e7f9367","line":92,"range":{"start_line":92,"start_character":16,"end_line":92,"end_character":32},"updated":"2017-12-27 20:04:55.000000000","message":"Are all the references written when the session is closed?","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            return_ref \u003d []"},{"line_number":90,"context_line":"            for registered_limit in registered_limits:"},{"line_number":91,"context_line":"                ref \u003d RegisteredLimitModel.from_dict(registered_limit)"},{"line_number":92,"context_line":"                session.add(ref)"},{"line_number":93,"context_line":"                return_ref.append(ref.to_dict())"},{"line_number":94,"context_line":"            return return_ref"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_e272e87c","line":92,"range":{"start_line":92,"start_character":16,"end_line":92,"end_character":32},"in_reply_to":"bf8cb3f7_0e7f9367","updated":"2017-12-28 02:55:33.000000000","message":"yeah.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                ref.resource_limit \u003d new_limit.resource_limit"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    @driver_hints.truncated"},{"line_number":159,"context_line":"    def list_limits(self, hints, project_id):"},{"line_number":160,"context_line":"        with sql.session_for_read() as session:"},{"line_number":161,"context_line":"            limits \u003d session.query(LimitModel)"},{"line_number":162,"context_line":"            limits \u003d limits.filter_by(project_id\u003dproject_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_2e829750","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":19},"updated":"2017-12-27 20:04:55.000000000","message":"Would we ever want to just list all limits, without filtering by project id?","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                ref.resource_limit \u003d new_limit.resource_limit"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    @driver_hints.truncated"},{"line_number":159,"context_line":"    def list_limits(self, hints, project_id):"},{"line_number":160,"context_line":"        with sql.session_for_read() as session:"},{"line_number":161,"context_line":"            limits \u003d session.query(LimitModel)"},{"line_number":162,"context_line":"            limits \u003d limits.filter_by(project_id\u003dproject_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_ff791f2f","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":19},"in_reply_to":"bf8cb3f7_2e829750","updated":"2017-12-28 02:55:33.000000000","message":"Yeah, it should be. I added a TODO in the \"expose API\" patch. I\u0027ll try to support it later.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d4b81e923be213b97c2600d6d05d55998ca643e","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                                  limit_id)"},{"line_number":183,"context_line":"            session.delete(ref)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def check_unified_limit_without_region(self, unified_limit,"},{"line_number":186,"context_line":"                                           is_registered_limit\u003dTrue):"},{"line_number":187,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":188,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf8cb3f7_6e3bbf9b","line":185,"updated":"2017-12-27 20:04:55.000000000","message":"This seems like a manager method. Looking into the usage in a subsequent patch to see if we can simplify the backend by pulling this up to the manager somehow.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a5ceb27d4b1f423e372aefe35ca1bc1da492141a","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                                  limit_id)"},{"line_number":183,"context_line":"            session.delete(ref)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def check_unified_limit_without_region(self, unified_limit,"},{"line_number":186,"context_line":"                                           is_registered_limit\u003dTrue):"},{"line_number":187,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":188,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_a26ce09c","line":185,"in_reply_to":"bf8cb3f7_6e3bbf9b","updated":"2017-12-28 02:55:33.000000000","message":"hmm. Thinking.","commit_id":"581ab3aace3a6bed5e0d3d9a9481d983cc347b0d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"329351ed5b7a08e6bbf0c55b7102870ff71e016c","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                                  limit_id)"},{"line_number":183,"context_line":"            session.delete(ref)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def check_unified_limit_without_region(self, unified_limit,"},{"line_number":186,"context_line":"                                           is_registered_limit\u003dTrue):"},{"line_number":187,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":188,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_70943038","line":185,"updated":"2018-01-02 21:55:22.000000000","message":"Since this isn\u0027t called anywhere in this module, this must only be here to be called by a manager. In that case, why not just have the manager implement this as a method and keep limit business logic out of the driver?","commit_id":"9399909f902ade059a7605e88a0f3cfca86d8da3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b0e1cf2f4c6aeb04b2749b1cb36d7a739449ebba","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                                  limit_id)"},{"line_number":182,"context_line":"            session.delete(ref)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_unified_limit_without_region(self, unified_limit,"},{"line_number":185,"context_line":"                                           is_registered_limit\u003dTrue):"},{"line_number":186,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":187,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_710e608e","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":42},"updated":"2018-01-03 19:01:02.000000000","message":"This is a public method of the driver but it isn\u0027t part of the interface, which means it\u0027s possible to have code in the manager the relies on this but it might not be in the actual driver. We should either pull this logic into the manager or make this an official part of the driver.\n\nIf someone implements their own backend based on the abstract base class they won\u0027t know about this method until they run the code and something breaks because the manager calls check_unified_limit_without_region and the implementation doesn\u0027t support it.","commit_id":"f8a653ed7a41af2ab1b036e29f3c47ecc5e39911"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"cc861729a813185dbc12ef740e72c90138a0a2f9","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                                  limit_id)"},{"line_number":182,"context_line":"            session.delete(ref)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_unified_limit_without_region(self, unified_limit,"},{"line_number":185,"context_line":"                                           is_registered_limit\u003dTrue):"},{"line_number":186,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":187,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_6fad1430","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":42},"in_reply_to":"9f91af0f_710e608e","updated":"2018-01-04 02:33:01.000000000","message":"This function is only used for sql driver to fix the UK issue. So I make it private in the new patch set, and move the check logic from manager to sql driver. I think it\u0027s reasonable now. Please check again. Thanks.","commit_id":"f8a653ed7a41af2ab1b036e29f3c47ecc5e39911"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0d0cc52a5c345b726ef06c34db97c8f604065e75","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_08cd47b7","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"updated":"2018-01-05 02:39:53.000000000","message":"This still seems like it should belong in the manager, but the worst case is that we refactor it up a little later.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ccf5fefd2e6de0644c105fd53fe5deacc84ea967","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_b9e7c1e4","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_08cd47b7","updated":"2018-01-05 16:20:08.000000000","message":"++, the hint logic could be moved up to the manager.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1c9dc61201a740a180eb4041606c509b3ea2144a","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_dcbcae07","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_69960641","updated":"2018-01-09 15:36:42.000000000","message":"sure, we can leave it here for now.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9ca74485628d25b53ef6d4d324427c4786327372","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_69960641","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_83d9f557","updated":"2018-01-09 15:17:52.000000000","message":"Since there isn\u0027t anything stopping us from doing this in the future, we can keep it here. If someone comes to us and says it causes problems (for whatever reason) with their implementation then we can look at refactoring it.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"00b889f92d8e6fdf247246fc01cf61f1dc6af19d","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_83d9f557","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_9ff62f63","updated":"2018-01-09 07:26:22.000000000","message":"I add this function for the reason that UKs don\u0027t work for None db columns. I\u0027m not sure a third part driver will face this problem as well. I assume it\u0027s only a problem for sql so that I leave it here. We can move it to manager if others want it as well in the future.\n\nDo you agree?","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74fbc7ddf3fc82de331d5a0e367a7f57de96b92a","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_d4e5830a","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_b9e7c1e4","updated":"2018-01-08 17:41:28.000000000","message":"Yeah - then people implementing their own backends wouldn\u0027t have to duplicate logic.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e4d7463d5991f15a29fd8af9e8fb7f56d1b7d6e6","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_9ff62f63","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_d4e5830a","updated":"2018-01-08 22:47:55.000000000","message":"It\u0027s almost worth passing hint data down to the driver so it can be optimised (aka in SQL itself) but acted upon if it isn\u0027t acted upon by the driver.\n\nMore specifically, the current implementation is going to probably be a more efficient (SQL-based) than in code at the manager level.\n\nIf we implement filtering based upon hints in the manager, it should be bypassed if the driver is \"Hints Aware\".\n\nTL;DR, I disagree with exclusively moving this to the manager.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4f129474f8fd1f745d53e34fdb99087303f26468","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class UnifiedLimit(base.UnifiedLimitDriverBase):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _check_unified_limit_without_region(self, unified_limit,"},{"line_number":87,"context_line":"                                            is_registered_limit\u003dTrue):"},{"line_number":88,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":89,"context_line":"        hints.add_filter(\u0027service_id\u0027, unified_limit[\u0027service_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_15d2e900","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":43},"in_reply_to":"9f91af0f_dcbcae07","updated":"2018-01-10 17:19:27.000000000","message":"yeah lets leave it here.","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ccf5fefd2e6de0644c105fd53fe5deacc84ea967","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    def list_limits(self, hints):"},{"line_number":201,"context_line":"        with sql.session_for_read() as session:"},{"line_number":202,"context_line":"            limits \u003d session.query(LimitModel)"},{"line_number":203,"context_line":"            limits \u003d sql.filter_limit_query(LimitModel,"},{"line_number":204,"context_line":"                                            limits,"},{"line_number":205,"context_line":"                                            hints)"},{"line_number":206,"context_line":"            return [s.to_dict() for s in limits]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _get_limit(self, session, limit_id):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_b941010e","line":205,"range":{"start_line":203,"start_character":12,"end_line":205,"end_character":50},"updated":"2018-01-05 16:20:08.000000000","message":"nit: this could be on one line","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ccf5fefd2e6de0644c105fd53fe5deacc84ea967","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def get_limit(self, limit_id):"},{"line_number":215,"context_line":"        with sql.session_for_read() as session:"},{"line_number":216,"context_line":"            return self._get_limit(session,"},{"line_number":217,"context_line":"                                   limit_id).to_dict()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def delete_limit(self, limit_id):"},{"line_number":220,"context_line":"        with sql.session_for_write() as session:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_7974d968","line":217,"range":{"start_line":216,"start_character":12,"end_line":217,"end_character":54},"updated":"2018-01-05 16:20:08.000000000","message":"ditto","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ccf5fefd2e6de0644c105fd53fe5deacc84ea967","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def delete_limit(self, limit_id):"},{"line_number":220,"context_line":"        with sql.session_for_write() as session:"},{"line_number":221,"context_line":"            ref \u003d self._get_limit(session,"},{"line_number":222,"context_line":"                                  limit_id)"},{"line_number":223,"context_line":"            session.delete(ref)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_996f5d91","line":222,"range":{"start_line":221,"start_character":12,"end_line":222,"end_character":43},"updated":"2018-01-05 16:20:08.000000000","message":"ditto","commit_id":"709121bc8f57b824b1014396bd251ed4e2f7a5c6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ba1cc8a18c7cc78b36b66e597ce03f628da38e76","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    resource_name \u003d sql.Column(sql.String(255))"},{"line_number":69,"context_line":"    resource_limit \u003d sql.Column(sql.Integer, nullable\u003dFalse)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    __table_args__ \u003d ("},{"line_number":72,"context_line":"        sqlalchemy.ForeignKeyConstraint([\u0027service_id\u0027,"},{"line_number":73,"context_line":"                                         \u0027region_id\u0027,"},{"line_number":74,"context_line":"                                         \u0027resource_name\u0027],"},{"line_number":75,"context_line":"                                        [\u0027registered_limit.service_id\u0027,"},{"line_number":76,"context_line":"                                         \u0027registered_limit.region_id\u0027,"},{"line_number":77,"context_line":"                                         \u0027registered_limit.resource_name\u0027]),"},{"line_number":78,"context_line":"        sqlalchemy.UniqueConstraint(\u0027project_id\u0027,"},{"line_number":79,"context_line":"                                    \u0027service_id\u0027,"},{"line_number":80,"context_line":"                                    \u0027region_id\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f91af0f_3f6a83ec","line":77,"range":{"start_line":71,"start_character":0,"end_line":77,"end_character":76},"updated":"2018-01-08 22:52:34.000000000","message":"This would likely be more clear as explicit FKs on the column definitions. This doesn\u0027t need to be changed at this point.","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0a913598ae45ed8201f8fd07cf0e2b3401e6da5","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    resource_name \u003d sql.Column(sql.String(255))"},{"line_number":69,"context_line":"    resource_limit \u003d sql.Column(sql.Integer, nullable\u003dFalse)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    __table_args__ \u003d ("},{"line_number":72,"context_line":"        sqlalchemy.ForeignKeyConstraint([\u0027service_id\u0027,"},{"line_number":73,"context_line":"                                         \u0027region_id\u0027,"},{"line_number":74,"context_line":"                                         \u0027resource_name\u0027],"},{"line_number":75,"context_line":"                                        [\u0027registered_limit.service_id\u0027,"},{"line_number":76,"context_line":"                                         \u0027registered_limit.region_id\u0027,"},{"line_number":77,"context_line":"                                         \u0027registered_limit.resource_name\u0027]),"},{"line_number":78,"context_line":"        sqlalchemy.UniqueConstraint(\u0027project_id\u0027,"},{"line_number":79,"context_line":"                                    \u0027service_id\u0027,"},{"line_number":80,"context_line":"                                    \u0027region_id\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f91af0f_c9a712bd","line":77,"range":{"start_line":71,"start_character":0,"end_line":77,"end_character":76},"in_reply_to":"9f91af0f_3f6a83ec","updated":"2018-01-09 15:14:52.000000000","message":"Does this impact anything if it is defined or is it just redundant as this point?","commit_id":"7229381c38e071d7709d1cdc970ae7f954b061a1"}]}
