)]}'
{"neutron/db/extraroute_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e3b216b4b7533ffb214486f482e359127504d36a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                    destination\u003ddestination,"},{"line_number":135,"context_line":"                    nexthop\u003dnexthop,"},{"line_number":136,"context_line":"                    metric\u003dmetric).create()"},{"line_number":137,"context_line":"            except o_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":138,"context_line":"                # if find duplicateEntry,"},{"line_number":139,"context_line":"                # need update the metric for this route."},{"line_number":140,"context_line":"                # first delete this route entry, and add a new entry in."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_8ebf57fb","line":137,"updated":"2019-03-04 17:25:58.000000000","message":"When is this going to happen? If a route matches router id, destination and metric (\"_get_extra_routes_by_router_id\" will return this new parameter), won\u0027t be in removed nor added.","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"2ba08c0f77b1242be0a2021f75101701dc22ff93","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                    destination\u003ddestination,"},{"line_number":135,"context_line":"                    nexthop\u003dnexthop,"},{"line_number":136,"context_line":"                    metric\u003dmetric).create()"},{"line_number":137,"context_line":"            except o_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":138,"context_line":"                # if find duplicateEntry,"},{"line_number":139,"context_line":"                # need update the metric for this route."},{"line_number":140,"context_line":"                # first delete this route entry, and add a new entry in."}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_41b90777","line":137,"in_reply_to":"9fdfeff1_8ebf57fb","updated":"2019-04-04 06:54:07.000000000","message":"For table \u0027RouterRoute\u0027, primary_keys \u003d [\u0027router_id\u0027, \u0027destination\u0027, \u0027nexthop\u0027]. So if router id, destination, nexthop match, but metric different, will remove the old entry, and add the new entry.","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e3b216b4b7533ffb214486f482e359127504d36a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        # NOTE(yamamoto): the extra_routes argument is either object or db row"},{"line_number":157,"context_line":"        return [{\u0027destination\u0027: str(route[\u0027destination\u0027]),"},{"line_number":158,"context_line":"                 \u0027nexthop\u0027: str(route[\u0027nexthop\u0027]),"},{"line_number":159,"context_line":"                 \u0027metric\u0027: str(route[\u0027metric\u0027])}"},{"line_number":160,"context_line":"                for route in extra_routes]"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _get_extra_routes_by_router_id(self, context, id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_ae56dbcd","line":159,"updated":"2019-03-04 17:25:58.000000000","message":"Why do we need to convert this parameter to string? This is a built-in type, integer.","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"786e5c03eae1f193d4520fcbfb62727f6f44fc68","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            router_id \u003d router[\u0027id\u0027]"},{"line_number":127,"context_line":"            destination \u003d utils.AuthenticIPNetwork(route[\u0027destination\u0027])"},{"line_number":128,"context_line":"            nexthop \u003d netaddr.IPAddress(route[\u0027nexthop\u0027])"},{"line_number":129,"context_line":"\t    if \"metric\" in route:"},{"line_number":130,"context_line":"\t\t    metric \u003d route[\u0027metric\u0027]"},{"line_number":131,"context_line":"\t    else:"},{"line_number":132,"context_line":"\t\t    metric \u003d 0"},{"line_number":133,"context_line":"            try:"},{"line_number":134,"context_line":"                l3_obj.RouterRoute("},{"line_number":135,"context_line":"                    context,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_a3a91e91","line":132,"range":{"start_line":129,"start_character":0,"end_line":132,"end_character":16},"updated":"2019-06-18 13:00:17.000000000","message":"1) Please, remove the tabs\n2) Those 4 lines could be just:\n metric \u003d route.get(\u0027metric\u0027, 0)","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"713ed6887a80842b4ed9dd8625126080d9943e54","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            router_id \u003d router[\u0027id\u0027]"},{"line_number":127,"context_line":"            destination \u003d utils.AuthenticIPNetwork(route[\u0027destination\u0027])"},{"line_number":128,"context_line":"            nexthop \u003d netaddr.IPAddress(route[\u0027nexthop\u0027])"},{"line_number":129,"context_line":"\t    if \"metric\" in route:"},{"line_number":130,"context_line":"\t\t    metric \u003d route[\u0027metric\u0027]"},{"line_number":131,"context_line":"\t    else:"},{"line_number":132,"context_line":"\t\t    metric \u003d 0"},{"line_number":133,"context_line":"            try:"},{"line_number":134,"context_line":"                l3_obj.RouterRoute("},{"line_number":135,"context_line":"                    context,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_f5506434","line":132,"range":{"start_line":129,"start_character":0,"end_line":132,"end_character":16},"in_reply_to":"9fb8cfa7_a3a91e91","updated":"2019-07-01 08:51:43.000000000","message":"Done","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"786e5c03eae1f193d4520fcbfb62727f6f44fc68","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    destination\u003ddestination,"},{"line_number":138,"context_line":"                    nexthop\u003dnexthop,"},{"line_number":139,"context_line":"                    metric\u003dmetric).create()"},{"line_number":140,"context_line":"            except exceptions.NeutronDbObjectDuplicateEntry:"},{"line_number":141,"context_line":"                # For id+dest+nexthop is primary key, if find duplicateEntry,"},{"line_number":142,"context_line":"                # need update the metric for this route."},{"line_number":143,"context_line":"                # first delete this route entry, and add a new entry in."}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_e3db961e","line":140,"range":{"start_line":140,"start_character":12,"end_line":140,"end_character":60},"updated":"2019-06-18 13:00:17.000000000","message":"Please, do not use exceptions as flow control. If you need to check if there is a route with id+dest+nexthop+metric, get it, do not try to create first and if NeutronDbObjectDuplicateEntry, then delete and create again.","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"713ed6887a80842b4ed9dd8625126080d9943e54","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    destination\u003ddestination,"},{"line_number":138,"context_line":"                    nexthop\u003dnexthop,"},{"line_number":139,"context_line":"                    metric\u003dmetric).create()"},{"line_number":140,"context_line":"            except exceptions.NeutronDbObjectDuplicateEntry:"},{"line_number":141,"context_line":"                # For id+dest+nexthop is primary key, if find duplicateEntry,"},{"line_number":142,"context_line":"                # need update the metric for this route."},{"line_number":143,"context_line":"                # first delete this route entry, and add a new entry in."}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_7521d4b3","line":140,"range":{"start_line":140,"start_character":12,"end_line":140,"end_character":60},"in_reply_to":"9fb8cfa7_e3db961e","updated":"2019-07-01 08:51:43.000000000","message":"Done","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"786e5c03eae1f193d4520fcbfb62727f6f44fc68","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        # NOTE(yamamoto): the extra_routes argument is either object or db row"},{"line_number":160,"context_line":"        return [{\u0027destination\u0027: str(route[\u0027destination\u0027]),"},{"line_number":161,"context_line":"                 \u0027nexthop\u0027: str(route[\u0027nexthop\u0027]),"},{"line_number":162,"context_line":"\t\t \u0027metric\u0027: 0 if \u0027metric\u0027 not in route else route[\u0027metric\u0027]}"},{"line_number":163,"context_line":"                for route in extra_routes]"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _get_extra_routes_by_router_id(self, context, id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_23d9ae21","line":162,"range":{"start_line":162,"start_character":13,"end_line":162,"end_character":60},"updated":"2019-06-18 13:00:17.000000000","message":"route.get(\u0027metric\u0027, 0)","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"713ed6887a80842b4ed9dd8625126080d9943e54","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        # NOTE(yamamoto): the extra_routes argument is either object or db row"},{"line_number":160,"context_line":"        return [{\u0027destination\u0027: str(route[\u0027destination\u0027]),"},{"line_number":161,"context_line":"                 \u0027nexthop\u0027: str(route[\u0027nexthop\u0027]),"},{"line_number":162,"context_line":"\t\t \u0027metric\u0027: 0 if \u0027metric\u0027 not in route else route[\u0027metric\u0027]}"},{"line_number":163,"context_line":"                for route in extra_routes]"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _get_extra_routes_by_router_id(self, context, id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_152c18aa","line":162,"range":{"start_line":162,"start_character":13,"end_line":162,"end_character":60},"in_reply_to":"9fb8cfa7_23d9ae21","updated":"2019-07-01 08:51:43.000000000","message":"Done","commit_id":"c33f89b1094bd2ec46b831168c6804fa9de40f4e"}],"neutron/db/migration/alembic_migrations/versions/stein/expand/9ea0a33b2062_add_metric_to_routerroutes.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"ed986d4b968d4b76a88df812dec33dd22dbc3b32","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def upgrade():"},{"line_number":34,"context_line":"    if not migration.schema_has_column(\u0027routerroutes\u0027, \u0027metric\u0027):"},{"line_number":35,"context_line":"        op.add_column(\u0027routerroutes\u0027,"},{"line_number":36,"context_line":"                  sa.Column(\u0027metric\u0027, sa.Integer(),"},{"line_number":37,"context_line":"                            nullable\u003dFalse, server_default\u003d\u00270\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b6d1c0ce","line":34,"range":{"start_line":34,"start_character":4,"end_line":34,"end_character":65},"updated":"2019-02-27 08:10:40.000000000","message":"How this column can exist in db if it is added with this change?\nI don\u0027t think this is needed.","commit_id":"26f6e56c7dc57f259ec420dd91ccaa12d4db839a"}],"neutron/db/models/l3.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"567c76c1733201389c797c4e1b12d76022235771","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027,"},{"line_number":118,"context_line":"                                        ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                          primary_key\u003dTrue)"},{"line_number":120,"context_line":"    metric \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    router \u003d orm.relationship(Router, load_on_pending\u003dTrue,"},{"line_number":123,"context_line":"                              backref\u003dorm.backref(\"route_list\","}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_32edbcef","line":120,"range":{"start_line":120,"start_character":22,"end_line":120,"end_character":50},"updated":"2019-02-28 08:47:47.000000000","message":"add server_default\u003d\u00270\u0027 here as well - required for modelmigration sync tests.","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"2ba08c0f77b1242be0a2021f75101701dc22ff93","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                          sa.ForeignKey(\u0027routers.id\u0027,"},{"line_number":118,"context_line":"                                        ondelete\u003d\"CASCADE\"),"},{"line_number":119,"context_line":"                          primary_key\u003dTrue)"},{"line_number":120,"context_line":"    metric \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    router \u003d orm.relationship(Router, load_on_pending\u003dTrue,"},{"line_number":123,"context_line":"                              backref\u003dorm.backref(\"route_list\","}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_9a34704c","line":120,"range":{"start_line":120,"start_character":22,"end_line":120,"end_character":50},"in_reply_to":"9fdfeff1_32edbcef","updated":"2019-04-04 06:54:07.000000000","message":"Done","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"}],"neutron/objects/router.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e3b216b4b7533ffb214486f482e359127504d36a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":35,"context_line":"class RouterRoute(base.NeutronDbObject):"},{"line_number":36,"context_line":"    # Version 1.0: Initial version"},{"line_number":37,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    db_model \u003d l3.RouterRoute"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_74d9a754","line":37,"updated":"2019-03-04 17:25:58.000000000","message":"You should bump the version","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e3b216b4b7533ffb214486f482e359127504d36a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                result[\u0027destination\u0027])"},{"line_number":57,"context_line":"        if \u0027nexthop\u0027 in result:"},{"line_number":58,"context_line":"            result[\u0027nexthop\u0027] \u003d netaddr.IPAddress(result[\u0027nexthop\u0027])"},{"line_number":59,"context_line":"        if \u0027metric\u0027 in result:"},{"line_number":60,"context_line":"            result[\u0027metric\u0027] \u003d cls.filter_to_str(result[\u0027metric\u0027])"},{"line_number":61,"context_line":"        return result"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_14ea9bd7","line":59,"updated":"2019-03-04 17:25:58.000000000","message":"Why do we need this integer value converted to string?","commit_id":"80d4e1a237045b2b1bde480548ffd8171ca292c0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3e6c30b34d05d98d39db57e3fc5bd4800206146a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":35,"context_line":"class RouterRoute(base.NeutronDbObject):"},{"line_number":36,"context_line":"    # Version 1.0: Initial version"},{"line_number":37,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    db_model \u003d l3.RouterRoute"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_9d5e2574","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":19},"updated":"2019-07-16 13:06:28.000000000","message":"This should be added to a new version: 1.1","commit_id":"6f8e58718c7eeefb6fd2ef8b281aff88723536f2"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"d299b5e2ed2d1f1736c446952348439961cb33f6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":35,"context_line":"class RouterRoute(base.NeutronDbObject):"},{"line_number":36,"context_line":"    # Version 1.0: Initial version"},{"line_number":37,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    db_model \u003d l3.RouterRoute"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_d2255c0a","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":19},"in_reply_to":"7faddb67_9d5e2574","updated":"2019-07-17 06:46:02.000000000","message":"Done","commit_id":"6f8e58718c7eeefb6fd2ef8b281aff88723536f2"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"882a1e823615a1e4d2b5651ec7b273da08af11b9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027router_id\u0027: common_types.UUIDField(),"},{"line_number":44,"context_line":"        \u0027destination\u0027: common_types.IPNetworkField(),"},{"line_number":45,"context_line":"        \u0027nexthop\u0027: obj_fields.IPAddressField(),"},{"line_number":46,"context_line":"        \u0027metric\u0027: obj_fields.IntegerField(default\u003d0)"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    primary_keys \u003d [\u0027router_id\u0027, \u0027destination\u0027, \u0027nexthop\u0027]"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_9872654a","line":46,"updated":"2019-11-26 13:54:07.000000000","message":"When introducing a new version for an Oslo Versioned Object (OVO) you always need to provide a method to convert (i.e. to downgrade) between possible versions. For example see \u0027obj_make_compatible\u0027 methods in this file:\n\nhttps://opendev.org/openstack/neutron/src/commit/2a8b70d2db93eb27ef2b1483cbb2ff0757c1adf5/neutron/objects/ports.py#L150","commit_id":"da87c6da3ac4d93f7215f37ab1725450780f665f"}]}
