)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Networking-bgpvpn API extension [0] brings new API calls. That patch"},{"line_number":10,"context_line":"adds command to OSC CLI to support them. It does not implement all the"},{"line_number":11,"context_line":"API extension, still missing new router attribute \u0027advertise_extra_routes\u0027."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#port-associations"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9f91af0f_cc05e512","line":11,"updated":"2018-01-09 13:56:18.000000000","message":"\"still missing new attributes on existing resources.\"\n\n(there is the new \u0027local_pref\u0027 attribute on BGPVPN as well)","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"bb2c2381f7bbfabd60bf2f44c287195fd78b8c68","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Networking-bgpvpn API extension [0] brings new API calls. That patch"},{"line_number":10,"context_line":"adds command to OSC CLI to support them. It does not implement all the"},{"line_number":11,"context_line":"API extension, still missing new router attribute \u0027advertise_extra_routes\u0027."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#port-associations"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7f96bb07_cb241ab2","line":11,"in_reply_to":"7f96bb07_0285185a","updated":"2018-01-16 08:34:26.000000000","message":"Ok I missed that","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Networking-bgpvpn API extension [0] brings new API calls. That patch"},{"line_number":10,"context_line":"adds command to OSC CLI to support them. It does not implement all the"},{"line_number":11,"context_line":"API extension, still missing new router attribute \u0027advertise_extra_routes\u0027."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#port-associations"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7f96bb07_0285185a","line":11,"in_reply_to":"7f96bb07_d79cd45e","updated":"2018-01-15 20:16:33.000000000","message":"There is a Port Associations / routes / local_pref, but also a BGPVPN / local_pref that is can be used as a default value.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Networking-bgpvpn API extension [0] brings new API calls. That patch"},{"line_number":10,"context_line":"adds command to OSC CLI to support them. It does not implement all the"},{"line_number":11,"context_line":"API extension, still missing new router attribute \u0027advertise_extra_routes\u0027."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#port-associations"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7f96bb07_d79cd45e","line":11,"in_reply_to":"9f91af0f_cc05e512","updated":"2018-01-15 19:24:23.000000000","message":"Not sure to understand your comment. \u0027local_pref\u0027 route attribute is supported with that patch.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"}],"neutronclient/osc/v2/networking_bgpvpn/bgpvpn.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                parsed_args.project,"},{"line_number":244,"context_line":"                parsed_args.project_domain,"},{"line_number":245,"context_line":"            ).id"},{"line_number":246,"context_line":"            attrs[\u0027project_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_6c6db9ca","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":44},"updated":"2018-01-09 13:56:18.000000000","message":"I\u0027m wondering if all the changes related to project/tenant are  backwards compatible (working when using an old neutron server still having only tenant_id).\n\nSince some of these change don\u0027t seem to be too much present elsewhere in python-neutronclient, I\u0027m wondering if we are doing the right thing. It typically looks like something that should be fixed once for everyone.\n\nDo we need to have these modifications in this change ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"bb2c2381f7bbfabd60bf2f44c287195fd78b8c68","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                parsed_args.project,"},{"line_number":244,"context_line":"                parsed_args.project_domain,"},{"line_number":245,"context_line":"            ).id"},{"line_number":246,"context_line":"            attrs[\u0027project_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_eb77969f","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":44},"in_reply_to":"7f96bb07_02d3d861","updated":"2018-01-16 08:34:26.000000000","message":"Ok I\u0027m trying to remove it","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                parsed_args.project,"},{"line_number":244,"context_line":"                parsed_args.project_domain,"},{"line_number":245,"context_line":"            ).id"},{"line_number":246,"context_line":"            attrs[\u0027project_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_02d3d861","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":44},"in_reply_to":"7f96bb07_4b0906db","updated":"2018-01-15 20:16:33.000000000","message":"It\u0027s true that someone using an old EOL client should not legitimately expect to access a recent OpenStack.\n\nLet\u0027s assume that a user does the right thing and uses the most recent python-neutronclient; shouldn\u0027t him expect to be able to access all openstack deployments, including a deployment he does not manage and where possible someone hasn\u0027t yet done the right thing and migrated to keystone v3 compatible components ?\n\nIndependently of this discussion, I think that:\n- we should split the change, if unrelated\n- we should avoid making the bgpvpn osc code different from the rest without a reason: if the project/tenant transition is relevant, we should tackle it for all osc extensions","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                parsed_args.project,"},{"line_number":244,"context_line":"                parsed_args.project_domain,"},{"line_number":245,"context_line":"            ).id"},{"line_number":246,"context_line":"            attrs[\u0027project_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_4b0906db","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":44},"in_reply_to":"9f91af0f_6c6db9ca","updated":"2018-01-15 19:24:23.000000000","message":"It should not have any backward compatibility problem as Neutron supports Keystone v3 since the release Newton [1] which is close to be unsupported (EoL). Most of the other OSC commands use term \u0027project\u0027 in place of \u0027tenant\u0027. I think we can safety move on that way.\n\nI don\u0027t remember if that modification was necessary for that patch. Do you prefer I remove it?\n\nhttps://review.openstack.org/#/q/topic:bp/keystone-v3+(status:open+OR+status:merged)+project:openstack/neutron","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"56e6b2c8e11257a0ced3b028f3d1c172e2a0daff","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"},{"line_number":250,"context_line":"        columns, display_columns \u003d nc_osc_utils.get_columns(obj, _attr_map)"},{"line_number":251,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns,"},{"line_number":252,"context_line":"                                             formatters\u003d_formatters)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_2a99cac2","line":249,"updated":"2018-01-17 12:48:02.000000000","message":"This is to map tenant_id to project_id but I don\u0027t understand why this is related to the port association support. If this is a separate thing could you send a separate patch?","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":247,"context_line":"        body \u003d {constants.BGPVPN: attrs}"},{"line_number":248,"context_line":"        obj \u003d client.create_bgpvpn(body)[constants.BGPVPN]"},{"line_number":249,"context_line":"        obj.setdefault(\u0027project_id\u0027, obj.pop(\u0027tenant_id\u0027, \u0027\u0027))"},{"line_number":250,"context_line":"        columns, display_columns \u003d nc_osc_utils.get_columns(obj, _attr_map)"},{"line_number":251,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns,"},{"line_number":252,"context_line":"                                             formatters\u003d_formatters)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_2c200248","line":249,"in_reply_to":"7f96bb07_2a99cac2","updated":"2018-01-17 16:27:56.000000000","message":"Removed","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"}],"neutronclient/osc/v2/networking_bgpvpn/network_association.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"56e6b2c8e11257a0ced3b028f3d1c172e2a0daff","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class CreateBgpvpnNetAssoc(BgpvpnNetAssoc, CreateBgpvpnResAssoc):"},{"line_number":46,"context_line":"    _description \u003d _(\"Create a BGP VPN network association\")"},{"line_number":47,"context_line":"    pass"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DeleteBgpvpnNetAssoc(BgpvpnNetAssoc, DeleteBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_ca0b86d3","side":"PARENT","line":47,"updated":"2018-01-17 12:48:02.000000000","message":"I would like to see this clean up in a separate patch too.","commit_id":"86e90cfb8611b59e97b13839376f31c6363f56e9"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class CreateBgpvpnNetAssoc(BgpvpnNetAssoc, CreateBgpvpnResAssoc):"},{"line_number":46,"context_line":"    _description \u003d _(\"Create a BGP VPN network association\")"},{"line_number":47,"context_line":"    pass"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DeleteBgpvpnNetAssoc(BgpvpnNetAssoc, DeleteBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_4cb30e0b","side":"PARENT","line":47,"in_reply_to":"7f96bb07_ca0b86d3","updated":"2018-01-17 16:27:56.000000000","message":"revert","commit_id":"86e90cfb8611b59e97b13839376f31c6363f56e9"}],"neutronclient/osc/v2/networking_bgpvpn/port_association.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            elif route[\u0027type\u0027] \u003d\u003d \u0027bgpvpn\u0027:"},{"line_number":70,"context_line":"                data.setdefault(\u0027bgpvpn_routes\u0027, []).append("},{"line_number":71,"context_line":"                    \u0027%s%s\u0027 % (route[\u0027bgpvpn_id\u0027], local_pref)"},{"line_number":72,"context_line":"                )"},{"line_number":73,"context_line":"        data.pop(\u0027routes\u0027, None)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_common_parser(self, parser, update\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_cc340596","line":72,"updated":"2018-01-09 13:56:18.000000000","message":"Perhaps add:\n\n  else:\n      LOG.warning(\"unknown route type %s (%s)\", route[\u0027type\u0027], route)\n\n...?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            elif route[\u0027type\u0027] \u003d\u003d \u0027bgpvpn\u0027:"},{"line_number":70,"context_line":"                data.setdefault(\u0027bgpvpn_routes\u0027, []).append("},{"line_number":71,"context_line":"                    \u0027%s%s\u0027 % (route[\u0027bgpvpn_id\u0027], local_pref)"},{"line_number":72,"context_line":"                )"},{"line_number":73,"context_line":"        data.pop(\u0027routes\u0027, None)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_common_parser(self, parser, update\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_ab252ac4","line":72,"in_reply_to":"9f91af0f_cc340596","updated":"2018-01-15 19:24:23.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            LOCAL_PREF_VALUE"},{"line_number":90,"context_line":"        REMOVE_PREFIX_ROUTE \u003d _(\"Remove prefix route in CIDR notation\")"},{"line_number":91,"context_line":"        REPEAT_PREFIX_ROUTE \u003d _(\"repeat option for multiple prefix routes\")"},{"line_number":92,"context_line":"        ADD_BGVPVPN_ROUTE \u003d _(\"Add BGP VPN route%s\") % LOCAL_PREF_VALUE"},{"line_number":93,"context_line":"        REMOVE_BGPVPN_ROUTE \u003d _(\"Remove BGP VPN route\")"},{"line_number":94,"context_line":"        REPEAT_BGPVPN_ROUTE \u003d _(\"repeat option for multiple BGP VPN routes\")"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_6cda994b","line":92,"updated":"2018-01-09 13:56:18.000000000","message":"add \"for route leaking\"","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            LOCAL_PREF_VALUE"},{"line_number":90,"context_line":"        REMOVE_PREFIX_ROUTE \u003d _(\"Remove prefix route in CIDR notation\")"},{"line_number":91,"context_line":"        REPEAT_PREFIX_ROUTE \u003d _(\"repeat option for multiple prefix routes\")"},{"line_number":92,"context_line":"        ADD_BGVPVPN_ROUTE \u003d _(\"Add BGP VPN route%s\") % LOCAL_PREF_VALUE"},{"line_number":93,"context_line":"        REMOVE_BGPVPN_ROUTE \u003d _(\"Remove BGP VPN route\")"},{"line_number":94,"context_line":"        REPEAT_BGPVPN_ROUTE \u003d _(\"repeat option for multiple BGP VPN routes\")"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_86b4e336","line":92,"in_reply_to":"9f91af0f_6cda994b","updated":"2018-01-15 19:24:23.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        REMOVE_BGPVPN_ROUTE \u003d _(\"Remove BGP VPN route\")"},{"line_number":94,"context_line":"        REPEAT_BGPVPN_ROUTE \u003d _(\"repeat option for multiple BGP VPN routes\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_6cb3790b","line":97,"range":{"start_line":96,"start_character":1,"end_line":97,"end_character":52},"updated":"2018-01-09 13:56:18.000000000","message":"It seems like this could be a boolean, rather than a function, doesn\u0027t it ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        REMOVE_BGPVPN_ROUTE \u003d _(\"Remove BGP VPN route\")"},{"line_number":94,"context_line":"        REPEAT_BGPVPN_ROUTE \u003d _(\"repeat option for multiple BGP VPN routes\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_06ee9387","line":97,"range":{"start_line":96,"start_character":1,"end_line":97,"end_character":52},"in_reply_to":"9f91af0f_6cb3790b","updated":"2018-01-15 19:24:23.000000000","message":"Done. I removed that \u0027update\u0027 parameter and used the class property \u0027_action\u0027 to determine if the command is appending routes.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"},{"line_number":101,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":102,"context_line":"            help\u003d_(\"Fixed IPs of the port will be advertised to the BGP VPN \""},{"line_number":103,"context_line":"                   \"(default: True)\"),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":"        parser.add_argument("},{"line_number":106,"context_line":"            \u0027--no-advertise-fixed-ips\u0027,"},{"line_number":107,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":108,"context_line":"            help\u003d_(\"Fixed IPs of the port will not be advertised to the BGP \""},{"line_number":109,"context_line":"                   \"VPN (default: True)\"),"},{"line_number":110,"context_line":"        )"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        parser.add_argument("},{"line_number":113,"context_line":"            \u0027--prefix-route\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_4c6b151d","line":110,"range":{"start_line":99,"start_character":0,"end_line":110,"end_character":9},"updated":"2018-01-09 13:56:18.000000000","message":"A few comments:\n\n- it\u0027s often better to say \"default: %default\", to avoid putting in the help a default value different from the actual one\n\n- the argparse doc says this about store_true: \n\n   \u0027store_true\u0027 and \u0027store_false\u0027 - These are special cases of \u0027store_const\u0027 using for storing the values True and False respectively. In addition, they create default values of False and True respectively.\n\n  \u003d\u003e I think that the default for these options, as defined, would be False\n\n- since the options define contrary behavior, we can\u0027t have both ase default, it seems that adding \"default\u003dTrue\" for --advertise-fixed-ips is what should be done (this is what is done in [1] for instance)\n\n- since the options define contrary behavior, I believe they should be in a mutually exclusive group, like [1]\n\n\n[1] https://github.com/openstack/python-neutronclient/blob/master/neutronclient/osc/v2/trunk/network_trunk.py#L68","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"bb2c2381f7bbfabd60bf2f44c287195fd78b8c68","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"},{"line_number":101,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":102,"context_line":"            help\u003d_(\"Fixed IPs of the port will be advertised to the BGP VPN \""},{"line_number":103,"context_line":"                   \"(default: True)\"),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":"        parser.add_argument("},{"line_number":106,"context_line":"            \u0027--no-advertise-fixed-ips\u0027,"},{"line_number":107,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":108,"context_line":"            help\u003d_(\"Fixed IPs of the port will not be advertised to the BGP \""},{"line_number":109,"context_line":"                   \"VPN (default: True)\"),"},{"line_number":110,"context_line":"        )"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        parser.add_argument("},{"line_number":113,"context_line":"            \u0027--prefix-route\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_38f15696","line":110,"range":{"start_line":99,"start_character":0,"end_line":110,"end_character":9},"in_reply_to":"7f96bb07_020678cf","updated":"2018-01-16 08:34:26.000000000","message":"In PS5, if none of the two flags are set, the CLI does not set the \u0027advertise_fixed_ips\u0027 property and lets neutron server and bgpvpn plugin set the default value.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"},{"line_number":101,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":102,"context_line":"            help\u003d_(\"Fixed IPs of the port will be advertised to the BGP VPN \""},{"line_number":103,"context_line":"                   \"(default: True)\"),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":"        parser.add_argument("},{"line_number":106,"context_line":"            \u0027--no-advertise-fixed-ips\u0027,"},{"line_number":107,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":108,"context_line":"            help\u003d_(\"Fixed IPs of the port will not be advertised to the BGP \""},{"line_number":109,"context_line":"                   \"VPN (default: True)\"),"},{"line_number":110,"context_line":"        )"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        parser.add_argument("},{"line_number":113,"context_line":"            \u0027--prefix-route\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_020678cf","line":110,"range":{"start_line":99,"start_character":0,"end_line":110,"end_character":9},"in_reply_to":"7f96bb07_2bf4b75a","updated":"2018-01-15 20:16:33.000000000","message":"- store_true wasn\u0027t removed for no-advertise-fixed-ips in PS5; this mean that the default for these two options are not compatible\n- why stop documenting the default values ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"2409fd950dcfec9f06b5289ff017cfbffe190d35","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"},{"line_number":101,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":102,"context_line":"            help\u003d_(\"Fixed IPs of the port will be advertised to the BGP VPN \""},{"line_number":103,"context_line":"                   \"(default: True)\"),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":"        parser.add_argument("},{"line_number":106,"context_line":"            \u0027--no-advertise-fixed-ips\u0027,"},{"line_number":107,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":108,"context_line":"            help\u003d_(\"Fixed IPs of the port will not be advertised to the BGP \""},{"line_number":109,"context_line":"                   \"VPN (default: True)\"),"},{"line_number":110,"context_line":"        )"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        parser.add_argument("},{"line_number":113,"context_line":"            \u0027--prefix-route\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_8b93725b","line":110,"range":{"start_line":99,"start_character":0,"end_line":110,"end_character":9},"in_reply_to":"7f96bb07_38f15696","updated":"2018-01-16 08:41:57.000000000","message":"Ok. I agree this is not incorrect.\n\nOn the other hand, the CLI does not document anymore which one will be the default if none is chosen, which isn\u0027t great.\n\nWhy not have the CLI have a default that matches the API default, and have it documented in the CLI help ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        def is_appended():"},{"line_number":97,"context_line":"            return update is None or update \u003d\u003d \u0027set\u0027"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        parser.add_argument("},{"line_number":100,"context_line":"            \u0027--advertise-fixed-ips\u0027,"},{"line_number":101,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":102,"context_line":"            help\u003d_(\"Fixed IPs of the port will be advertised to the BGP VPN \""},{"line_number":103,"context_line":"                   \"(default: True)\"),"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":"        parser.add_argument("},{"line_number":106,"context_line":"            \u0027--no-advertise-fixed-ips\u0027,"},{"line_number":107,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":108,"context_line":"            help\u003d_(\"Fixed IPs of the port will not be advertised to the BGP \""},{"line_number":109,"context_line":"                   \"VPN (default: True)\"),"},{"line_number":110,"context_line":"        )"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        parser.add_argument("},{"line_number":113,"context_line":"            \u0027--prefix-route\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_2bf4b75a","line":110,"range":{"start_line":99,"start_character":0,"end_line":110,"end_character":9},"in_reply_to":"9f91af0f_4c6b151d","updated":"2018-01-15 19:24:23.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"class CreateBgpvpnPortAssoc(BgpvpnPortAssoc, CreateBgpvpnResAssoc):"},{"line_number":230,"context_line":"    _description \u003d _(\"Create a BGP VPN port association\")"},{"line_number":231,"context_line":"    pass"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class SetBgpvpnPortAssoc(BgpvpnPortAssoc, SetBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_4c02353f","line":231,"range":{"start_line":231,"start_character":4,"end_line":231,"end_character":8},"updated":"2018-01-09 13:56:18.000000000","message":"We don\u0027t need \"pass\" here, and same below (unless I missed something ??).","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"class CreateBgpvpnPortAssoc(BgpvpnPortAssoc, CreateBgpvpnResAssoc):"},{"line_number":230,"context_line":"    _description \u003d _(\"Create a BGP VPN port association\")"},{"line_number":231,"context_line":"    pass"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class SetBgpvpnPortAssoc(BgpvpnPortAssoc, SetBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_4bfee337","line":231,"range":{"start_line":231,"start_character":4,"end_line":231,"end_character":8},"in_reply_to":"9f91af0f_4c02353f","updated":"2018-01-15 19:24:23.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        if self._action !\u003d \u0027create\u0027:"},{"line_number":129,"context_line":"            parser.add_argument("},{"line_number":130,"context_line":"                \u0027--no-prefix-route\u0027 if self._action \u003d\u003d \u0027set\u0027 else"},{"line_number":131,"context_line":"                \u0027--all-prefix-route\u0027,"},{"line_number":132,"context_line":"                dest\u003d\u0027purge_prefix_route\u0027,"},{"line_number":133,"context_line":"                action\u003d\u0027store_true\u0027,"},{"line_number":134,"context_line":"                help\u003d_(\u0027Empty prefix route list\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_c20f30df","line":131,"range":{"start_line":131,"start_character":30,"end_line":131,"end_character":35},"updated":"2018-01-15 20:16:33.000000000","message":"\u0027routes\u0027 ?","commit_id":"e49a14c473561a7cbe9c5a16cb8c1323f97af86a"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        if self._action !\u003d \u0027create\u0027:"},{"line_number":129,"context_line":"            parser.add_argument("},{"line_number":130,"context_line":"                \u0027--no-prefix-route\u0027 if self._action \u003d\u003d \u0027set\u0027 else"},{"line_number":131,"context_line":"                \u0027--all-prefix-route\u0027,"},{"line_number":132,"context_line":"                dest\u003d\u0027purge_prefix_route\u0027,"},{"line_number":133,"context_line":"                action\u003d\u0027store_true\u0027,"},{"line_number":134,"context_line":"                help\u003d_(\u0027Empty prefix route list\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_4958dd54","line":131,"range":{"start_line":131,"start_character":30,"end_line":131,"end_character":35},"in_reply_to":"7f96bb07_c20f30df","updated":"2018-01-17 16:27:56.000000000","message":"Done","commit_id":"e49a14c473561a7cbe9c5a16cb8c1323f97af86a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b50b6c408c2405655eb76b5e2bf60dd13269f08","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                   \"VPN\"),"},{"line_number":154,"context_line":"        )"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        if route_added():"},{"line_number":157,"context_line":"            parser.add_argument("},{"line_number":158,"context_line":"                \u0027--prefix-route\u0027,"},{"line_number":159,"context_line":"                metavar\u003d\"prefix\u003d\u003ccidr\u003e[,local_pref\u003d\u003cinteger\u003e]\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_9acf3a55","line":156,"range":{"start_line":156,"start_character":11,"end_line":156,"end_character":25},"updated":"2018-01-16 11:21:41.000000000","message":"why is this a method call ? why not simply compute a value at line 140/141 and use it elsewhere ?","commit_id":"3c68f8b7e3f5e7eba21ea3df00f2a698b08c69e7"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"d5589741559b268994f0ea6565093e19cc16457c","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                   \"VPN\"),"},{"line_number":154,"context_line":"        )"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        if route_added():"},{"line_number":157,"context_line":"            parser.add_argument("},{"line_number":158,"context_line":"                \u0027--prefix-route\u0027,"},{"line_number":159,"context_line":"                metavar\u003d\"prefix\u003d\u003ccidr\u003e[,local_pref\u003d\u003cinteger\u003e]\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7f96bb07_2bf013fe","line":156,"range":{"start_line":156,"start_character":11,"end_line":156,"end_character":25},"in_reply_to":"7f96bb07_9acf3a55","updated":"2018-01-16 14:44:15.000000000","message":"It was use few times in the precedent patch sets but I re-work the code and effectively is used only here. I remove it.","commit_id":"3c68f8b7e3f5e7eba21ea3df00f2a698b08c69e7"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"56e6b2c8e11257a0ced3b028f3d1c172e2a0daff","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from neutronclient.osc.v2.networking_bgpvpn.resource_association import\\"},{"line_number":34,"context_line":"    ShowBgpvpnResAssoc"},{"line_number":35,"context_line":"from neutronclient.osc.v2.networking_bgpvpn.resource_association import\\"},{"line_number":36,"context_line":"    UnsetBgpvpnResAssoc"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_aad39a5f","line":36,"updated":"2018-01-17 12:48:02.000000000","message":"In the OpenStack hacking guideline, we don\u0027t use attribute-level import. Could you use module-level import instead?","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from neutronclient.osc.v2.networking_bgpvpn.resource_association import\\"},{"line_number":34,"context_line":"    ShowBgpvpnResAssoc"},{"line_number":35,"context_line":"from neutronclient.osc.v2.networking_bgpvpn.resource_association import\\"},{"line_number":36,"context_line":"    UnsetBgpvpnResAssoc"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_4c81cefa","line":36,"in_reply_to":"7f96bb07_aad39a5f","updated":"2018-01-17 16:27:56.000000000","message":"Done","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"136a908c28323a9830002237b88336a2a506c683","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                {"},{"line_number":61,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":62,"context_line":"                    \u0027local_pref\u0027: 100,"},{"line_number":63,"context_line":"                    \u0027prefix_routes\u0027: ["},{"line_number":64,"context_line":"                        \u00278.8.8.0/27\u0027,"},{"line_number":65,"context_line":"                        \u002780.50.30.0/28\u0027,"},{"line_number":66,"context_line":"                    ],"},{"line_number":67,"context_line":"                },"},{"line_number":68,"context_line":"                {"},{"line_number":69,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_be12e060","line":66,"range":{"start_line":63,"start_character":0,"end_line":66,"end_character":22},"updated":"2018-01-18 07:33:46.000000000","message":"This should be:\n\n  prefix: \"8.8.8.0/27\"\n\nwith one item in routes for each prefix","commit_id":"cdd1ce1dc1ca6606b2a25281d51d700895433c23"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"cce9287b5a7c052b736350714966474da63b1aed","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                {"},{"line_number":61,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":62,"context_line":"                    \u0027local_pref\u0027: 100,"},{"line_number":63,"context_line":"                    \u0027prefix_routes\u0027: ["},{"line_number":64,"context_line":"                        \u00278.8.8.0/27\u0027,"},{"line_number":65,"context_line":"                        \u002780.50.30.0/28\u0027,"},{"line_number":66,"context_line":"                    ],"},{"line_number":67,"context_line":"                },"},{"line_number":68,"context_line":"                {"},{"line_number":69,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_54b29b4a","line":66,"range":{"start_line":63,"start_character":0,"end_line":66,"end_character":22},"in_reply_to":"7f96bb07_be12e060","updated":"2018-01-18 08:16:12.000000000","message":"Done","commit_id":"cdd1ce1dc1ca6606b2a25281d51d700895433c23"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"136a908c28323a9830002237b88336a2a506c683","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                {"},{"line_number":69,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":70,"context_line":"                    \u0027local_pref\u0027: 50,"},{"line_number":71,"context_line":"                    \u0027bgpvpn_routes\u0027: ["},{"line_number":72,"context_line":"                        \u0027157d72a9-9968-48e7-8087-6c9a9bc7a181\u0027,"},{"line_number":73,"context_line":"                        \u0027d5c7aaab-c7e8-48b3-85ca-a115c00d3603\u0027,"},{"line_number":74,"context_line":"                    ],"},{"line_number":75,"context_line":"                },"},{"line_number":76,"context_line":"            ],"},{"line_number":77,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_11050511","line":74,"range":{"start_line":71,"start_character":20,"end_line":74,"end_character":22},"updated":"2018-01-18 07:33:46.000000000","message":"Similar issue. This is \"\u0027bgpvpn\u0027: 1.2.3.4/32\" with one item in routes per BGPVPN.","commit_id":"cdd1ce1dc1ca6606b2a25281d51d700895433c23"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"cce9287b5a7c052b736350714966474da63b1aed","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                {"},{"line_number":69,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":70,"context_line":"                    \u0027local_pref\u0027: 50,"},{"line_number":71,"context_line":"                    \u0027bgpvpn_routes\u0027: ["},{"line_number":72,"context_line":"                        \u0027157d72a9-9968-48e7-8087-6c9a9bc7a181\u0027,"},{"line_number":73,"context_line":"                        \u0027d5c7aaab-c7e8-48b3-85ca-a115c00d3603\u0027,"},{"line_number":74,"context_line":"                    ],"},{"line_number":75,"context_line":"                },"},{"line_number":76,"context_line":"            ],"},{"line_number":77,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_f4864766","line":74,"range":{"start_line":71,"start_character":20,"end_line":74,"end_character":22},"in_reply_to":"7f96bb07_11050511","updated":"2018-01-18 08:16:12.000000000","message":"Done","commit_id":"cdd1ce1dc1ca6606b2a25281d51d700895433c23"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dc62a01bb07b3c03e2c84a2aee5a2c8fd1aaef68","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                {"},{"line_number":61,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":62,"context_line":"                    \u0027local_pref\u0027: 100,"},{"line_number":63,"context_line":"                    \u0027prefix_routes\u0027: \u00278.8.8.0/27\u0027,"},{"line_number":64,"context_line":"                },"},{"line_number":65,"context_line":"                {"},{"line_number":66,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_24e0f225","line":63,"range":{"start_line":63,"start_character":21,"end_line":63,"end_character":34},"updated":"2018-01-18 14:13:59.000000000","message":"This is \"prefix\" not \"prefix_routes\" here.","commit_id":"7f18e4a4202989272995738c962bcce50e73bb82"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"4d354e4d229c29f386ddb46316e09579e266378e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                {"},{"line_number":61,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":62,"context_line":"                    \u0027local_pref\u0027: 100,"},{"line_number":63,"context_line":"                    \u0027prefix_routes\u0027: \u00278.8.8.0/27\u0027,"},{"line_number":64,"context_line":"                },"},{"line_number":65,"context_line":"                {"},{"line_number":66,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_ffc37736","line":63,"range":{"start_line":63,"start_character":21,"end_line":63,"end_character":34},"in_reply_to":"7f96bb07_24e0f225","updated":"2018-01-18 15:20:09.000000000","message":"Done","commit_id":"7f18e4a4202989272995738c962bcce50e73bb82"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dc62a01bb07b3c03e2c84a2aee5a2c8fd1aaef68","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                {"},{"line_number":71,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":72,"context_line":"                    \u0027local_pref\u0027: 50,"},{"line_number":73,"context_line":"                    \u0027bgpvpn_routes\u0027: \u0027157d72a9-9968-48e7-8087-6c9a9bc7a181\u0027,"},{"line_number":74,"context_line":"                },"},{"line_number":75,"context_line":"                {"},{"line_number":76,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_04be16fe","line":73,"range":{"start_line":73,"start_character":21,"end_line":73,"end_character":34},"updated":"2018-01-18 14:13:59.000000000","message":"This is \"bgpvpn\" here, not \"bgpvpn_routes\".","commit_id":"7f18e4a4202989272995738c962bcce50e73bb82"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"4d354e4d229c29f386ddb46316e09579e266378e","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                {"},{"line_number":71,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":72,"context_line":"                    \u0027local_pref\u0027: 50,"},{"line_number":73,"context_line":"                    \u0027bgpvpn_routes\u0027: \u0027157d72a9-9968-48e7-8087-6c9a9bc7a181\u0027,"},{"line_number":74,"context_line":"                },"},{"line_number":75,"context_line":"                {"},{"line_number":76,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_1fbf43aa","line":73,"range":{"start_line":73,"start_character":21,"end_line":73,"end_character":34},"in_reply_to":"7f96bb07_04be16fe","updated":"2018-01-18 15:20:09.000000000","message":"Done","commit_id":"7f18e4a4202989272995738c962bcce50e73bb82"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c1f4c8ac3e66e95970462938d3d7824d1cce7b4f","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        REMOVE_PREFIX_ROUTE \u003d _(\"Remove prefix route in CIDR notation\")"},{"line_number":132,"context_line":"        REPEAT_PREFIX_ROUTE \u003d _(\"repeat option for multiple prefix routes\")"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        ADD_BGVPVPN_ROUTE \u003d _(\"Add BGP VPN route for route leaking%s\") %\\"},{"line_number":135,"context_line":"            LOCAL_PREF_VALUE"},{"line_number":136,"context_line":"        REMOVE_BGPVPN_ROUTE \u003d _(\"Remove BGP VPN route\")"},{"line_number":137,"context_line":"        REPEAT_BGPVPN_ROUTE \u003d _(\"repeat option for multiple BGP VPN routes\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_97b549f1","line":134,"range":{"start_line":134,"start_character":12,"end_line":134,"end_character":14},"updated":"2018-01-25 08:06:06.000000000","message":"missing \"P\"","commit_id":"0e61b3ba1c54be7ae7a218513d30800723a26524"}],"neutronclient/osc/v2/networking_bgpvpn/resource_association.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_parser(self, prog_name):"},{"line_number":35,"context_line":"        parser \u003d super(CreateBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":39,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_37961a4e","line":36,"updated":"2018-01-09 13:56:18.000000000","message":"why is \"        nc_osc_utils.add_project_owner_option_to_parser(parser)\n\" removed ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_parser(self, prog_name):"},{"line_number":35,"context_line":"        parser \u003d super(CreateBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":39,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_c2ddf042","line":36,"in_reply_to":"7f96bb07_1ce103d1","updated":"2018-01-15 20:16:33.000000000","message":"Ok.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_parser(self, prog_name):"},{"line_number":35,"context_line":"        parser \u003d super(CreateBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":39,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_1ce103d1","line":36,"in_reply_to":"9f91af0f_37961a4e","updated":"2018-01-15 19:24:23.000000000","message":"I think there is no use case to specify the project owner of a bgpvpn resource association as the bgpvpn resource and associated resource must have the same project owner.\n\nFurthermore, the bgpvpn plugin code also enforces the association project ID is equal to the project ID of the bgpvpn resource. So on line 64, I determine that project ID from the bgpvpn or the associated resource.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_parser(self, prog_name):"},{"line_number":91,"context_line":"        parser \u003d super(SetBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":95,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"},{"line_number":96,"context_line":"                  self._assoc_res_name),"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":100,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":101,"context_line":"            help\u003d(_(\"%s association ID to update\") %"},{"line_number":102,"context_line":"                  self._assoc_res_name.capitalize()),"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        get_common_parser \u003d getattr(self, \u0027_get_common_parser\u0027, None)"},{"line_number":106,"context_line":"        if callable(get_common_parser):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_e2034c72","line":103,"range":{"start_line":92,"start_character":0,"end_line":103,"end_character":9},"updated":"2018-01-15 20:16:33.000000000","message":"I think we need to reverse the order, and put bgpvpn second: not because this is a better order (it isn\u0027t) but because we choose one, can\u0027t change it without possibly breaking users, and we want consistency across the different update/show/delete commands.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_parser(self, prog_name):"},{"line_number":91,"context_line":"        parser \u003d super(SetBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":95,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"},{"line_number":96,"context_line":"                  self._assoc_res_name),"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":100,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":101,"context_line":"            help\u003d(_(\"%s association ID to update\") %"},{"line_number":102,"context_line":"                  self._assoc_res_name.capitalize()),"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        get_common_parser \u003d getattr(self, \u0027_get_common_parser\u0027, None)"},{"line_number":106,"context_line":"        if callable(get_common_parser):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_979b6664","line":103,"range":{"start_line":92,"start_character":0,"end_line":103,"end_character":9},"updated":"2018-01-09 13:56:18.000000000","message":"These aren\u0027t attribute that can be updated, so why put them here in this SetBgpvpnResAssoc ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_parser(self, prog_name):"},{"line_number":91,"context_line":"        parser \u003d super(SetBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":95,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"},{"line_number":96,"context_line":"                  self._assoc_res_name),"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":100,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":101,"context_line":"            help\u003d(_(\"%s association ID to update\") %"},{"line_number":102,"context_line":"                  self._assoc_res_name.capitalize()),"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        get_common_parser \u003d getattr(self, \u0027_get_common_parser\u0027, None)"},{"line_number":106,"context_line":"        if callable(get_common_parser):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_02bd18d7","line":103,"range":{"start_line":92,"start_character":0,"end_line":103,"end_character":9},"in_reply_to":"7f96bb07_3c5abf4e","updated":"2018-01-15 20:16:33.000000000","message":"Ah yes, ok.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"bb2c2381f7bbfabd60bf2f44c287195fd78b8c68","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_parser(self, prog_name):"},{"line_number":91,"context_line":"        parser \u003d super(SetBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":95,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"},{"line_number":96,"context_line":"                  self._assoc_res_name),"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":100,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":101,"context_line":"            help\u003d(_(\"%s association ID to update\") %"},{"line_number":102,"context_line":"                  self._assoc_res_name.capitalize()),"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        get_common_parser \u003d getattr(self, \u0027_get_common_parser\u0027, None)"},{"line_number":106,"context_line":"        if callable(get_common_parser):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_584302b0","line":103,"range":{"start_line":92,"start_character":0,"end_line":103,"end_character":9},"in_reply_to":"7f96bb07_e2034c72","updated":"2018-01-16 08:34:26.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_parser(self, prog_name):"},{"line_number":91,"context_line":"        parser \u003d super(SetBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":95,"context_line":"            help\u003d(_(\"BGP VPN to apply the %s association (name or ID)\") %"},{"line_number":96,"context_line":"                  self._assoc_res_name),"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        parser.add_argument("},{"line_number":99,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":100,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":101,"context_line":"            help\u003d(_(\"%s association ID to update\") %"},{"line_number":102,"context_line":"                  self._assoc_res_name.capitalize()),"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        get_common_parser \u003d getattr(self, \u0027_get_common_parser\u0027, None)"},{"line_number":106,"context_line":"        if callable(get_common_parser):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_3c5abf4e","line":103,"range":{"start_line":92,"start_character":0,"end_line":103,"end_character":9},"in_reply_to":"9f91af0f_979b6664","updated":"2018-01-15 19:24:23.000000000","message":"There not there to be updated but to identified the bgpvpn resource association like in the delete case. But help messages are not clear, I\u0027ll update them.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_parser(self, prog_name):"},{"line_number":132,"context_line":"        parser \u003d super(DeleteBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":133,"context_line":"        parser.add_argument("},{"line_number":134,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":135,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":136,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        parser.add_argument("},{"line_number":139,"context_line":"            \u0027resource_association_ids\u0027,"},{"line_number":140,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":141,"context_line":"            nargs\u003d\"+\","}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_57263e17","line":138,"range":{"start_line":133,"start_character":0,"end_line":138,"end_character":28},"updated":"2018-01-09 13:56:18.000000000","message":"useful to move this piece of code ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_parser(self, prog_name):"},{"line_number":132,"context_line":"        parser \u003d super(DeleteBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":133,"context_line":"        parser.add_argument("},{"line_number":134,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":135,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":136,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        parser.add_argument("},{"line_number":139,"context_line":"            \u0027resource_association_ids\u0027,"},{"line_number":140,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":141,"context_line":"            nargs\u003d\"+\","}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_c284100f","line":138,"range":{"start_line":133,"start_character":0,"end_line":138,"end_character":28},"in_reply_to":"7f96bb07_b7282834","updated":"2018-01-15 20:16:33.000000000","message":"Oh, I hadn\u0027t realized: we can\u0027t change the order of positional attributes without possibly breaking existing scripts !\n\nI agree with you that bgpvpn first would be more natural, but we can change that anymore... :-(","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"bb2c2381f7bbfabd60bf2f44c287195fd78b8c68","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_parser(self, prog_name):"},{"line_number":132,"context_line":"        parser \u003d super(DeleteBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":133,"context_line":"        parser.add_argument("},{"line_number":134,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":135,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":136,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        parser.add_argument("},{"line_number":139,"context_line":"            \u0027resource_association_ids\u0027,"},{"line_number":140,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":141,"context_line":"            nargs\u003d\"+\","}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_ab7bce78","line":138,"range":{"start_line":133,"start_character":0,"end_line":138,"end_character":28},"in_reply_to":"7f96bb07_c284100f","updated":"2018-01-16 08:34:26.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_parser(self, prog_name):"},{"line_number":132,"context_line":"        parser \u003d super(DeleteBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":133,"context_line":"        parser.add_argument("},{"line_number":134,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":135,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":136,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        parser.add_argument("},{"line_number":139,"context_line":"            \u0027resource_association_ids\u0027,"},{"line_number":140,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"},{"line_number":141,"context_line":"            nargs\u003d\"+\","}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_b7282834","line":138,"range":{"start_line":133,"start_character":0,"end_line":138,"end_character":28},"in_reply_to":"9f91af0f_57263e17","updated":"2018-01-15 19:24:23.000000000","message":"I though I follow the OSC spirit but I looked in the other commands and not sure which is better (not so much case with sub resources like bgpvpn associations). IMO, it\u0027s clearer to put the bgpvpn ID which the association belongs to before the association ID.","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def get_parser(self, prog_name):"},{"line_number":224,"context_line":"        parser \u003d super(ShowBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":225,"context_line":"        parser.add_argument("},{"line_number":226,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":227,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":228,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":229,"context_line":"        )"},{"line_number":230,"context_line":"        parser.add_argument("},{"line_number":231,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":232,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_d77faedd","line":229,"range":{"start_line":225,"start_character":0,"end_line":229,"end_character":9},"updated":"2018-01-09 13:56:18.000000000","message":"ditto (useful to move this ?)","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"146daea652c893373470177ce547ce5a4cf5dd59","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def get_parser(self, prog_name):"},{"line_number":224,"context_line":"        parser \u003d super(ShowBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":225,"context_line":"        parser.add_argument("},{"line_number":226,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":227,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","},{"line_number":228,"context_line":"            help\u003d_(\"BGP VPN the association belongs to (name or ID)\"),"},{"line_number":229,"context_line":"        )"},{"line_number":230,"context_line":"        parser.add_argument("},{"line_number":231,"context_line":"            \u0027resource_association_id\u0027,"},{"line_number":232,"context_line":"            metavar\u003d\"\u003c%s association ID\u003e\" % self._assoc_res_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f96bb07_62a89c76","line":229,"range":{"start_line":225,"start_character":0,"end_line":229,"end_character":9},"in_reply_to":"9f91af0f_d77faedd","updated":"2018-01-15 20:16:33.000000000","message":"Ditto: can\u0027t change...","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"56e6b2c8e11257a0ced3b028f3d1c172e2a0daff","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def get_parser(self, prog_name):"},{"line_number":34,"context_line":"        parser \u003d super(CreateBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":35,"context_line":"        nc_osc_utils.add_project_owner_option_to_parser(parser)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_0ac40e5e","side":"PARENT","line":35,"updated":"2018-01-17 12:48:02.000000000","message":"I believe this is a separate bug on router/network association as well.\nI would like to see a bug on this and hope you fix it separately.","commit_id":"86e90cfb8611b59e97b13839376f31c6363f56e9"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def get_parser(self, prog_name):"},{"line_number":34,"context_line":"        parser \u003d super(CreateBgpvpnResAssoc, self).get_parser(prog_name)"},{"line_number":35,"context_line":"        nc_osc_utils.add_project_owner_option_to_parser(parser)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027bgpvpn\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\"\u003cbgpvpn\u003e\","}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_2ca1e294","side":"PARENT","line":35,"in_reply_to":"7f96bb07_0ac40e5e","updated":"2018-01-17 16:27:56.000000000","message":"Done","commit_id":"86e90cfb8611b59e97b13839376f31c6363f56e9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"56e6b2c8e11257a0ced3b028f3d1c172e2a0daff","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from osc_lib.cli.parseractions import KeyValueAction"},{"line_number":20,"context_line":"from osc_lib.command import command"},{"line_number":21,"context_line":"from osc_lib import exceptions"},{"line_number":22,"context_line":"from osc_lib import utils as osc_utils"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_eaff62a8","line":19,"updated":"2018-01-17 12:48:02.000000000","message":"Could you use module-level import?","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"c70c7f69d472aa1d66ae904c6ec3ee430f34fae3","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from osc_lib.cli.parseractions import KeyValueAction"},{"line_number":20,"context_line":"from osc_lib.command import command"},{"line_number":21,"context_line":"from osc_lib import exceptions"},{"line_number":22,"context_line":"from osc_lib import utils as osc_utils"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_0ca426a5","line":19,"in_reply_to":"7f96bb07_eaff62a8","updated":"2018-01-17 16:27:56.000000000","message":"Done","commit_id":"41cb83c28a267e8f45529c295820d39c02e945d9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"39a1a50118916b0b424d90e734620f2de7493df3","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        parser.add_argument("},{"line_number":200,"context_line":"            \u0027--property\u0027,"},{"line_number":201,"context_line":"            metavar\u003d\"\u003ckey\u003dvalue\u003e\","},{"line_number":202,"context_line":"            default\u003ddict(),"},{"line_number":203,"context_line":"            help\u003d_(\"Filter property to apply on returned BGP VPNs (repeat to \""},{"line_number":204,"context_line":"                   \"filter on multiple properties)\"),"},{"line_number":205,"context_line":"            action\u003dparseractions.KeyValueAction,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f96bb07_67c1e780","line":202,"range":{"start_line":202,"start_character":12,"end_line":202,"end_character":27},"updated":"2018-01-20 07:35:42.000000000","message":"This is unnecessary because the default value of KeyValueAction is {}.","commit_id":"17342afae98e3b1a2ee8b748993f683b4839b0bd"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"7cd78d09de5128e97bed219becbb80c0cc1ffc5b","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        parser.add_argument("},{"line_number":200,"context_line":"            \u0027--property\u0027,"},{"line_number":201,"context_line":"            metavar\u003d\"\u003ckey\u003dvalue\u003e\","},{"line_number":202,"context_line":"            default\u003ddict(),"},{"line_number":203,"context_line":"            help\u003d_(\"Filter property to apply on returned BGP VPNs (repeat to \""},{"line_number":204,"context_line":"                   \"filter on multiple properties)\"),"},{"line_number":205,"context_line":"            action\u003dparseractions.KeyValueAction,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f96bb07_5336dcb6","line":202,"range":{"start_line":202,"start_character":12,"end_line":202,"end_character":27},"in_reply_to":"7f96bb07_67c1e780","updated":"2018-01-22 09:17:15.000000000","message":"Done","commit_id":"17342afae98e3b1a2ee8b748993f683b4839b0bd"}],"neutronclient/tests/unit/osc/v2/networking_bgpvpn/test_resource_association.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.neutronclient.delete_bgpvpn_fake_resource_assoc \u003d mock.Mock()"},{"line_number":159,"context_line":"        arglist \u003d [fake_bgpvpn[\u0027id\u0027]] + fake_res_assoc_ids"},{"line_number":160,"context_line":"        verifylist \u003d ["},{"line_number":161,"context_line":"            (\u0027bgpvpn\u0027, fake_bgpvpn[\u0027id\u0027]),"},{"line_number":162,"context_line":"            (\u0027resource_association_ids\u0027, fake_res_assoc_ids),"},{"line_number":163,"context_line":"        ]"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f91af0f_975e0674","line":162,"range":{"start_line":161,"start_character":12,"end_line":162,"end_character":61},"updated":"2018-01-09 13:56:18.000000000","message":"why change the order ?","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"}],"releasenotes/notes/support-bgpvpn-route-control-aeda3e698486f73b.yaml":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5f57cd07dce6ed8c54898192bf1a0f9dcf715158","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add BGP VPN `port association \u003chttps://developer.openstack.org/api-ref/network/v2/index.html#port-associations\u003e`_"},{"line_number":5,"context_line":"    support to the CLI. That permits to partially support BGP VPN extension"},{"line_number":6,"context_line":"    ``bgpvpn-routes-control`` (still missing control extra routes of a router)."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9f91af0f_f7faf240","line":6,"range":{"start_line":5,"start_character":37,"end_line":6,"end_character":29},"updated":"2018-01-09 13:56:18.000000000","message":"I would suggest:\n\n  Add BGP VPN `port association \u003chttps://developer.openstack.org/api-ref/network/v2/index.html#port-associations\u003e`_\n    support to the CLI, which are introduced for BGP VPN interconnections by the \n    ``bgpvpn-routes-control`` API extension.\n\n(we can skip the \"(still missing...\")","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"},{"author":{"_account_id":55,"name":"Édouard Thuleau","email":"ethuleau@juniper.net","username":"ethuleau"},"change_message_id":"f84f8bbab3dcd78ac86ba786654ef5fb99bb3b4e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add BGP VPN `port association \u003chttps://developer.openstack.org/api-ref/network/v2/index.html#port-associations\u003e`_"},{"line_number":5,"context_line":"    support to the CLI. That permits to partially support BGP VPN extension"},{"line_number":6,"context_line":"    ``bgpvpn-routes-control`` (still missing control extra routes of a router)."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7f96bb07_f7d31037","line":6,"range":{"start_line":5,"start_character":37,"end_line":6,"end_character":29},"in_reply_to":"9f91af0f_f7faf240","updated":"2018-01-15 19:24:23.000000000","message":"Done","commit_id":"aeede6b0f9321f83092a70f9282822755beaed07"}]}
