)]}'
{"neutron_lib/api/definitions/extraroute.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"0b0f2acfaa970d2cfab848aa351fd4ec63a1bd78","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    COLLECTION_NAME: {"},{"line_number":33,"context_line":"        ROUTES: {"},{"line_number":34,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: True,"},{"line_number":35,"context_line":"            \u0027validate\u0027: {\u0027type:routerroutes\u0027: None},"},{"line_number":36,"context_line":"            \u0027convert_to\u0027: converters.convert_none_to_empty_list,"},{"line_number":37,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":38,"context_line":"            \u0027default\u0027: constants.ATTR_NOT_SPECIFIED},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_80130401","line":35,"updated":"2019-02-27 17:46:02.000000000","message":"Generally we wouldn\u0027t change an existing API in-place, but rather add a new extension to signify the behavior.\nHowever if the change is 100% backwards compatible then perhaps this is OK as-is.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d05906dff556f6d6512bef910aea188060961282","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    COLLECTION_NAME: {"},{"line_number":33,"context_line":"        ROUTES: {"},{"line_number":34,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: True,"},{"line_number":35,"context_line":"            \u0027validate\u0027: {\u0027type:routerroutes\u0027: None},"},{"line_number":36,"context_line":"            \u0027convert_to\u0027: converters.convert_none_to_empty_list,"},{"line_number":37,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":38,"context_line":"            \u0027default\u0027: constants.ATTR_NOT_SPECIFIED},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_3e7a1e25","line":35,"in_reply_to":"9fdfeff1_4cb0e940","updated":"2019-03-04 14:57:36.000000000","message":"I agree with Boden, but seems to me that the change is backwards compatible.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"22125742129bbdbd4e9323e201edf3745c8b5d0c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    COLLECTION_NAME: {"},{"line_number":33,"context_line":"        ROUTES: {"},{"line_number":34,"context_line":"            \u0027allow_post\u0027: False, \u0027allow_put\u0027: True,"},{"line_number":35,"context_line":"            \u0027validate\u0027: {\u0027type:routerroutes\u0027: None},"},{"line_number":36,"context_line":"            \u0027convert_to\u0027: converters.convert_none_to_empty_list,"},{"line_number":37,"context_line":"            \u0027is_visible\u0027: True,"},{"line_number":38,"context_line":"            \u0027default\u0027: constants.ATTR_NOT_SPECIFIED},"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_4cb0e940","line":35,"in_reply_to":"9fdfeff1_80130401","updated":"2019-02-28 06:56:07.000000000","message":"Thanks for your review.\nFor this bug, will add metric for routes in router as below: \n\"--route destination\u003dCIDR,nexthop\u003dIP_ADDR,metric\u003dMETRIC\" in \"neutron router-update\".\n\nOriginal design is reusing validate \"hostroutes\" for router routes, it will need a new validate named \"routerroutes\" to support metric verify.\n\nSo this change not really change the existing API.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f1f97979ab524199f3bcbfc2e2898d1e7fa2da93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9fb8cfa7_e7aac36f","updated":"2019-06-18 11:57:36.000000000","message":"Why is this file changed?","commit_id":"011ca6dca6cfd3592e498ea0ba62ed24facd6cc1"}],"neutron_lib/api/validators/__init__.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"6f7471fa25f9174ea641690188a6d4b61f21c9b5","unresolved":false,"context_lines":[{"line_number":631,"context_line":"    routerroutes \u003d []"},{"line_number":632,"context_line":"    for routerroute in data:"},{"line_number":633,"context_line":"        if \u0027metric\u0027 not in routerroute:"},{"line_number":634,"context_line":"            routerroute[\u0027metric\u0027] \u003d 0"},{"line_number":635,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, routerroute)"},{"line_number":636,"context_line":"        if msg:"},{"line_number":637,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_89b95116","line":634,"updated":"2019-02-22 13:16:14.000000000","message":"Isn\u0027t this something that would be handled by a default value in the API definition for this API??","commit_id":"5aebdd38cc5104fdb122276b9e9657cfe5428900"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"6f7471fa25f9174ea641690188a6d4b61f21c9b5","unresolved":false,"context_lines":[{"line_number":767,"context_line":"        return validate_subnet_list(data, key_specs)"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"def validate_metric(data, valid_values\u003dNone):"},{"line_number":771,"context_line":"    \"\"\"Validate data is a valid metric value."},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"    :param data: The data to validate."}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a949b532","line":770,"range":{"start_line":770,"start_character":4,"end_line":770,"end_character":19},"updated":"2019-02-22 13:16:14.000000000","message":"Is this really needed?\nI mean couldn\u0027t we just use validate_range() instead?","commit_id":"5aebdd38cc5104fdb122276b9e9657cfe5428900"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d05906dff556f6d6512bef910aea188060961282","unresolved":false,"context_lines":[{"line_number":631,"context_line":"    routerroutes \u003d []"},{"line_number":632,"context_line":"    for routerroute in data:"},{"line_number":633,"context_line":"        if \u0027metric\u0027 not in routerroute:"},{"line_number":634,"context_line":"            routerroute[\u0027metric\u0027] \u003d 0"},{"line_number":635,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, routerroute)"},{"line_number":636,"context_line":"        if msg:"},{"line_number":637,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_fe73364d","line":634,"range":{"start_line":634,"start_character":36,"end_line":634,"end_character":37},"updated":"2019-03-04 14:57:36.000000000","message":"Why 0? A static route usually have metric 1 [1]\n\n[1] https://www.oreilly.com/library/view/cisco-ios-access/1565923855/ch04s03.html","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"b6158cfaf6ee9f396d8bf83c87754536dfb74ef5","unresolved":false,"context_lines":[{"line_number":631,"context_line":"    routerroutes \u003d []"},{"line_number":632,"context_line":"    for routerroute in data:"},{"line_number":633,"context_line":"        if \u0027metric\u0027 not in routerroute:"},{"line_number":634,"context_line":"            routerroute[\u0027metric\u0027] \u003d 0"},{"line_number":635,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, routerroute)"},{"line_number":636,"context_line":"        if msg:"},{"line_number":637,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_8a367ab4","line":634,"range":{"start_line":634,"start_character":36,"end_line":634,"end_character":37},"in_reply_to":"9fdfeff1_fe73364d","updated":"2019-03-06 08:28:49.000000000","message":"Thanks for your review.\n0 means direct connection and 1 means static route.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9af816c8e98f3cf4a3e545e288ad7fa3476c4f79","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, routerroute)"},{"line_number":636,"context_line":"        if msg:"},{"line_number":637,"context_line":"            return msg"},{"line_number":638,"context_line":"        msg \u003d validate_subnet(routerroute[\u0027destination\u0027])"},{"line_number":639,"context_line":"        if msg:"},{"line_number":640,"context_line":"            return msg"},{"line_number":641,"context_line":"        msg \u003d validate_ip_address(routerroute[\u0027nexthop\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_d706a686","line":638,"updated":"2019-04-10 09:04:55.000000000","message":"in \"old\" validator which was \"validate_hostroutes\" here \"validate_route_cidr()\" was used. Why You don\u0027t use the same here?","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9af816c8e98f3cf4a3e545e288ad7fa3476c4f79","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        return msg"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    expected_keys \u003d [\u0027destination\u0027, \u0027nexthop\u0027, \u0027metric\u0027]"},{"line_number":631,"context_line":"    routerroutes \u003d []"},{"line_number":632,"context_line":"    for routerroute in data:"},{"line_number":633,"context_line":"        if \u0027metric\u0027 not in routerroute:"},{"line_number":634,"context_line":"            routerroute[\u0027metric\u0027] \u003d 0"},{"line_number":635,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, routerroute)"},{"line_number":636,"context_line":"        if msg:"},{"line_number":637,"context_line":"            return msg"},{"line_number":638,"context_line":"        msg \u003d validate_subnet(routerroute[\u0027destination\u0027])"},{"line_number":639,"context_line":"        if msg:"},{"line_number":640,"context_line":"            return msg"},{"line_number":641,"context_line":"        msg \u003d validate_ip_address(routerroute[\u0027nexthop\u0027])"},{"line_number":642,"context_line":"        if msg:"},{"line_number":643,"context_line":"            return msg"},{"line_number":644,"context_line":"        msg \u003d validate_metric(routerroute[\u0027metric\u0027])"},{"line_number":645,"context_line":"        if msg:"},{"line_number":646,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_f71722a2","line":643,"range":{"start_line":631,"start_character":0,"end_line":643,"end_character":22},"updated":"2019-04-10 09:04:55.000000000","message":"all this part is the same as in validate_hostroutes(). Why You simply not reuse it and only add validation of metric as last step?","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9af816c8e98f3cf4a3e545e288ad7fa3476c4f79","unresolved":false,"context_lines":[{"line_number":771,"context_line":"    \"\"\"Validate data is a valid metric value."},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"    :param data: The data to validate."},{"line_number":774,"context_line":"    :param valid_values: Integer in range [0~255]."},{"line_number":775,"context_line":"    :return: None if data is a valid list of subnet dicts, otherwise a human"},{"line_number":776,"context_line":"        readable message as to why the data is invalid."},{"line_number":777,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_37eb6aa4","line":774,"range":{"start_line":774,"start_character":0,"end_line":774,"end_character":50},"updated":"2019-04-10 09:04:55.000000000","message":"I think that \"valid_values\" argument isn\u0027t used in this validator.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d05906dff556f6d6512bef910aea188060961282","unresolved":false,"context_lines":[{"line_number":776,"context_line":"        readable message as to why the data is invalid."},{"line_number":777,"context_line":"    \"\"\""},{"line_number":778,"context_line":"    try:"},{"line_number":779,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":780,"context_line":"            return"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_1eb95a14","line":779,"range":{"start_line":779,"start_character":36,"end_line":779,"end_character":39},"updated":"2019-03-04 14:57:36.000000000","message":"Can I ask you why this value? For example, in EIGRP, max value is a 32bit int.\n\n[1] https://www.oreilly.com/library/view/cisco-ios-access/1565923855/ch04s03.html","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9af816c8e98f3cf4a3e545e288ad7fa3476c4f79","unresolved":false,"context_lines":[{"line_number":776,"context_line":"        readable message as to why the data is invalid."},{"line_number":777,"context_line":"    \"\"\""},{"line_number":778,"context_line":"    try:"},{"line_number":779,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":780,"context_line":"            return"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_77233206","line":779,"range":{"start_line":779,"start_character":36,"end_line":779,"end_character":39},"in_reply_to":"5fc1f717_5bd06651","updated":"2019-04-10 09:04:55.000000000","message":"IMO You should define those things as constants and use them here. It would be more \"self descriptive\"","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"b6158cfaf6ee9f396d8bf83c87754536dfb74ef5","unresolved":false,"context_lines":[{"line_number":776,"context_line":"        readable message as to why the data is invalid."},{"line_number":777,"context_line":"    \"\"\""},{"line_number":778,"context_line":"    try:"},{"line_number":779,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":780,"context_line":"            return"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_5bd06651","line":779,"range":{"start_line":779,"start_character":36,"end_line":779,"end_character":39},"in_reply_to":"9fdfeff1_1eb95a14","updated":"2019-03-06 08:28:49.000000000","message":"The range of 0-255 is quote from \"Default administrative distance for routing protocols\" of Cisco. This range just restrict the value configure by user with static route. \nDynamic routes learned from other routers will not record in this database.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f1f97979ab524199f3bcbfc2e2898d1e7fa2da93","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        return validate_subnet_list(data, key_specs)"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"def validate_metric(data, valid_values\u003dNone):"},{"line_number":738,"context_line":"    \"\"\"Validate data is a valid metric value."},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    :param data: The data to validate."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_a7db6b1f","line":737,"range":{"start_line":737,"start_character":4,"end_line":737,"end_character":19},"updated":"2019-06-18 11:57:36.000000000","message":"Couldn\u0027t validate_range() just be used rather than adding a new validator?","commit_id":"011ca6dca6cfd3592e498ea0ba62ed24facd6cc1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fdafeb0bd0c1e17da0ad8eede1bd04b5ba577bd1","unresolved":false,"context_lines":[{"line_number":743,"context_line":"        readable message as to why the data is invalid."},{"line_number":744,"context_line":"    \"\"\""},{"line_number":745,"context_line":"    try:"},{"line_number":746,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":747,"context_line":"            return"},{"line_number":748,"context_line":"        else:"},{"line_number":749,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_56f58382","line":746,"range":{"start_line":746,"start_character":36,"end_line":746,"end_character":39},"updated":"2019-06-18 09:40:28.000000000","message":"As commented previously by Slawek. This should be a constant and there should be a description, similar to your reply in PS2 [1]\n\n[1] https://review.opendev.org/#/c/638605/2..6/neutron_lib/api/validators/__init__.py","commit_id":"011ca6dca6cfd3592e498ea0ba62ed24facd6cc1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f1f97979ab524199f3bcbfc2e2898d1e7fa2da93","unresolved":false,"context_lines":[{"line_number":746,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":747,"context_line":"            return"},{"line_number":748,"context_line":"        else:"},{"line_number":749,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""},{"line_number":750,"context_line":"                    \"between 0 to 255 are supported\") % data"},{"line_number":751,"context_line":"    except Exception:"},{"line_number":752,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a valid metric\") % data"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_c7bbffc1","line":749,"range":{"start_line":749,"start_character":21,"end_line":749,"end_character":27},"updated":"2019-06-18 11:57:36.000000000","message":"Nit: \"Metric\"","commit_id":"011ca6dca6cfd3592e498ea0ba62ed24facd6cc1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f1f97979ab524199f3bcbfc2e2898d1e7fa2da93","unresolved":false,"context_lines":[{"line_number":746,"context_line":"        if validate_range(data, [0, 255]) is None:"},{"line_number":747,"context_line":"            return"},{"line_number":748,"context_line":"        else:"},{"line_number":749,"context_line":"            msg \u003d _(\"metric \u0027%s\u0027 is not supported. Only integer \""},{"line_number":750,"context_line":"                    \"between 0 to 255 are supported\") % data"},{"line_number":751,"context_line":"    except Exception:"},{"line_number":752,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a valid metric\") % data"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_87b507d0","line":749,"range":{"start_line":749,"start_character":56,"end_line":749,"end_character":63},"updated":"2019-06-18 11:57:36.000000000","message":"Nit: \"integers\"","commit_id":"011ca6dca6cfd3592e498ea0ba62ed24facd6cc1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"89af40c1b5322158fb509d66ce7871f20a66bbea","unresolved":false,"context_lines":[{"line_number":605,"context_line":"            msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % hostroute"},{"line_number":606,"context_line":"            LOG.debug(msg)"},{"line_number":607,"context_line":"            return msg"},{"line_number":608,"context_line":"        if \u0027metric\u0027 not in hostroute:"},{"line_number":609,"context_line":"            hostroute[\u0027metric\u0027] \u003d CONNECTED"},{"line_number":610,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, hostroute)"},{"line_number":611,"context_line":"        if msg:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fb8cfa7_8bbd84b8","line":608,"range":{"start_line":608,"start_character":12,"end_line":608,"end_character":18},"updated":"2019-06-26 18:40:53.000000000","message":"Isn\u0027t there a way to default this value in the API parameters rather than in the validator? I don\u0027t see any other validators setting a default (maybe there is one somewhere and I missed it).","commit_id":"4616a96439661b3c7887883acf8859173ccbe10b"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"1fff925403a97632508e03b92d75cf8f8e8ff43a","unresolved":false,"context_lines":[{"line_number":605,"context_line":"            msg \u003d _(\"\u0027%s\u0027 is not a dictionary\") % hostroute"},{"line_number":606,"context_line":"            LOG.debug(msg)"},{"line_number":607,"context_line":"            return msg"},{"line_number":608,"context_line":"        if \u0027metric\u0027 not in hostroute:"},{"line_number":609,"context_line":"            hostroute[\u0027metric\u0027] \u003d CONNECTED"},{"line_number":610,"context_line":"        msg \u003d _verify_dict_keys(expected_keys, hostroute)"},{"line_number":611,"context_line":"        if msg:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fb8cfa7_4447431e","line":608,"range":{"start_line":608,"start_character":12,"end_line":608,"end_character":18},"in_reply_to":"9fb8cfa7_8bbd84b8","updated":"2019-07-01 09:49:07.000000000","message":"Hi boden, I\u0027m Xiaodan XU\u0027s colleague. She\u0027s on vacation now and I\u0027ll take over her job. Metric is an optional field when configuring hostroutes and will be assigned a default value 0 in neutron L3 plugin when it\u0027s not specified.","commit_id":"4616a96439661b3c7887883acf8859173ccbe10b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e63edd07cbd0f937e970b2bc5666fe7d84ebb09d","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# The metric valid range, refer to CISCO routing protocols."},{"line_number":38,"context_line":"CONNECTED \u003d 0"},{"line_number":39,"context_line":"UNKNOWN \u003d 255"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Note: In order to ensure that the MAC address is unicast the first byte"},{"line_number":42,"context_line":"# must be even."}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_8d92cc4a","line":39,"updated":"2019-07-10 10:43:15.000000000","message":"maybe https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py would be better place for those constants?","commit_id":"14d496f493a665de0e2e1c0c7f441cc82253f1f2"},{"author":{"_account_id":20787,"name":"Bin Lu","email":"369283883@qq.com","username":"LuBin"},"change_message_id":"27881fde401a9329e3d36ff2f0d0106701ab1a67","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# The metric valid range, refer to CISCO routing protocols."},{"line_number":38,"context_line":"CONNECTED \u003d 0"},{"line_number":39,"context_line":"UNKNOWN \u003d 255"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Note: In order to ensure that the MAC address is unicast the first byte"},{"line_number":42,"context_line":"# must be even."}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_601744ef","line":39,"in_reply_to":"7faddb67_8d92cc4a","updated":"2019-07-11 02:43:21.000000000","message":"OK, I\u0027ll discuss about the metric range with them first.If it\u0027s approved then I\u0027ll move the definition to \"neutron-lib\n/constants.py\". Thanks.","commit_id":"14d496f493a665de0e2e1c0c7f441cc82253f1f2"}],"neutron_lib/tests/unit/api/validators/test_validators.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d05906dff556f6d6512bef910aea188060961282","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":576,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":577,"context_line":"                               \u0027metric\u0027: \u0027256\u0027}],"},{"line_number":578,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":579,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":580,"context_line":"                               \u0027metric\u0027: \u0027100\u0027},"},{"line_number":581,"context_line":"                              {\u0027nexthop\u0027: \u002710.0.2.20\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_f9183077","line":578,"updated":"2019-03-04 14:57:36.000000000","message":"Why this one should fail?","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9af816c8e98f3cf4a3e545e288ad7fa3476c4f79","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":576,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":577,"context_line":"                               \u0027metric\u0027: \u0027256\u0027}],"},{"line_number":578,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":579,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":580,"context_line":"                               \u0027metric\u0027: \u0027100\u0027},"},{"line_number":581,"context_line":"                              {\u0027nexthop\u0027: \u002710.0.2.20\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_b782fac5","line":578,"in_reply_to":"5fc1f717_db69b68b","updated":"2019-04-10 09:04:55.000000000","message":"You can add comment with explanation of it","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":29923,"name":"XU Xiaodan","email":"xu.xiaodan1@zte.com.cn","username":"xiaodan"},"change_message_id":"b6158cfaf6ee9f396d8bf83c87754536dfb74ef5","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":576,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":577,"context_line":"                               \u0027metric\u0027: \u0027256\u0027}],"},{"line_number":578,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":579,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":580,"context_line":"                               \u0027metric\u0027: \u0027100\u0027},"},{"line_number":581,"context_line":"                              {\u0027nexthop\u0027: \u002710.0.2.20\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_db69b68b","line":578,"in_reply_to":"9fdfeff1_f9183077","updated":"2019-03-06 08:28:49.000000000","message":"For duplicate route is not allowed for one router, so this case is testing \"Duplicate routerroute\".","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d05906dff556f6d6512bef910aea188060961282","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                             [{\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":579,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":580,"context_line":"                               \u0027metric\u0027: \u0027100\u0027},"},{"line_number":581,"context_line":"                              {\u0027nexthop\u0027: \u002710.0.2.20\u0027,"},{"line_number":582,"context_line":"                               \u0027destination\u0027: \u0027100.0.0.0/8\u0027,"},{"line_number":583,"context_line":"                               \u0027metric\u0027: \u0027100\u0027}],"},{"line_number":584,"context_line":"                             None]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_79052010","line":581,"updated":"2019-03-04 14:57:36.000000000","message":"This one is a copy of the previous one.","commit_id":"1ebde7447aaf46c859d6c9f76477d710f757947b"}]}
