)]}'
{"neutron/conf/extensions/conntrack_helper.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38f3ad7082292754733b8267393cb4cba7a8fe9c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    {\u0027snmp\u0027: n_const.PROTO_NAME_UDP},"},{"line_number":35,"context_line":"                    {\u0027tftp\u0027: n_const.PROTO_NAME_UDP}],"},{"line_number":36,"context_line":"                item_type\u003dcfg.types.Dict(),"},{"line_number":37,"context_line":"                sample_default\u003d(\u0027tftp:udp,ftp:tcp,sip:tcp,sip:udp\u0027),"},{"line_number":38,"context_line":"                help\u003d_(\u0027Defines the conntrack helpers and helper protocol \u0027"},{"line_number":39,"context_line":"                       \u0027constraints. \u0027"},{"line_number":40,"context_line":"                       \u0027\u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_36981d69","line":37,"range":{"start_line":37,"start_character":16,"end_line":37,"end_character":30},"updated":"2019-04-22 08:18:27.000000000","message":"So, this is inconsistent with \u0027default\u0027?","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4ce28ed811bf3a40d5bef0cb76d33467fca0cc39","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    {\u0027snmp\u0027: n_const.PROTO_NAME_UDP},"},{"line_number":35,"context_line":"                    {\u0027tftp\u0027: n_const.PROTO_NAME_UDP}],"},{"line_number":36,"context_line":"                item_type\u003dcfg.types.Dict(),"},{"line_number":37,"context_line":"                sample_default\u003d(\u0027tftp:udp,ftp:tcp,sip:tcp,sip:udp\u0027),"},{"line_number":38,"context_line":"                help\u003d_(\u0027Defines the conntrack helpers and helper protocol \u0027"},{"line_number":39,"context_line":"                       \u0027constraints. \u0027"},{"line_number":40,"context_line":"                       \u0027\u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_a6b231e5","line":37,"range":{"start_line":37,"start_character":16,"end_line":37,"end_character":30},"in_reply_to":"ffb9cba7_36981d69","updated":"2019-04-26 17:24:02.000000000","message":"ooops, yes we should not put a string in the sample default. Thanks Liu!\n\n\nThe generated sample config file will contain:\n\n  # Defines the conntrack helpers and helper protocol constraints.\n  # \u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e (list value)\n  #\n  # This option has a sample default set, which means that\n  # its actual default value may vary from the one documented\n  # below.\n  #allowed_conntrack_helpers \u003d tftp:udp,ftp:tcp,sip:tcp,sip:udp\n\n\nWithout the sample default this will look like:\n\n  # Defines the conntrack helpers and helper protocol constraints.\n  # \u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e (list value)\n  #allowed_conntrack_helpers \u003d amanda:tcp,ftp:tcp,h323:udp,h323:tcp,irc:tcp,netbios-ns:udp,pptp:tcp,sane:tcp,sip:udp,sip:tcp,snmp:udp,tftp:udp\n\n\nThe reason for using sample_default is that it becomes a very long line in generated sample configs. Maby we don\u0027t care? And should just drop the use of sameple default?","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38f3ad7082292754733b8267393cb4cba7a8fe9c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                sample_default\u003d(\u0027tftp:udp,ftp:tcp,sip:tcp,sip:udp\u0027),"},{"line_number":38,"context_line":"                help\u003d_(\u0027Defines the conntrack helpers and helper protocol \u0027"},{"line_number":39,"context_line":"                       \u0027constraints. \u0027"},{"line_number":40,"context_line":"                       \u0027\u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e\u0027))"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_36e9fd7f","line":40,"range":{"start_line":40,"start_character":24,"end_line":40,"end_character":63},"updated":"2019-04-22 08:18:27.000000000","message":"List of \u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e ？","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4ce28ed811bf3a40d5bef0cb76d33467fca0cc39","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                sample_default\u003d(\u0027tftp:udp,ftp:tcp,sip:tcp,sip:udp\u0027),"},{"line_number":38,"context_line":"                help\u003d_(\u0027Defines the conntrack helpers and helper protocol \u0027"},{"line_number":39,"context_line":"                       \u0027constraints. \u0027"},{"line_number":40,"context_line":"                       \u0027\u003chelper\u003e\u003d\u003cprotocol\u003e,\u003chelper\u003e\u003d\u003cprotocol\u003e\u0027))"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_668999c8","line":40,"range":{"start_line":40,"start_character":24,"end_line":40,"end_character":63},"in_reply_to":"ffb9cba7_36e9fd7f","updated":"2019-04-26 17:24:02.000000000","message":"I removed this the sample/default is enough.","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"39e9977f4c74152826eb8bd9e849a47e1e03cafe","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                    {\u0027sip\u0027: \u0027tcp\u0027},"},{"line_number":42,"context_line":"                    {\u0027sip\u0027: \u0027udp\u0027}"},{"line_number":43,"context_line":"                ],"},{"line_number":44,"context_line":"                help\u003d_(\u0027Defines the allowed conntrack helpers, and\u0027"},{"line_number":45,"context_line":"                       \u0027conntack helper module protocol constraints.\u0027)"},{"line_number":46,"context_line":"                )"},{"line_number":47,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_72188174","line":44,"range":{"start_line":44,"start_character":63,"end_line":44,"end_character":66},"updated":"2019-07-10 19:39:38.000000000","message":"missing trailing space :(","commit_id":"b25324e0a1171083ba22d50b02c23d2107fdaa39"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"dd9504f82e11db1cfbb579774f518a061d97dfd0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                    {\u0027sip\u0027: \u0027tcp\u0027},"},{"line_number":42,"context_line":"                    {\u0027sip\u0027: \u0027udp\u0027}"},{"line_number":43,"context_line":"                ],"},{"line_number":44,"context_line":"                help\u003d_(\u0027Defines the allowed conntrack helpers, and\u0027"},{"line_number":45,"context_line":"                       \u0027conntack helper module protocol constraints.\u0027)"},{"line_number":46,"context_line":"                )"},{"line_number":47,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_c75de7e9","line":44,"range":{"start_line":44,"start_character":63,"end_line":44,"end_character":66},"in_reply_to":"7faddb67_72188174","updated":"2019-07-11 13:49:40.000000000","message":"Good catch, thanks Brian.\n\nDone.","commit_id":"b25324e0a1171083ba22d50b02c23d2107fdaa39"}],"neutron/extensions/_expose_l3_conntrack_helper_lib.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"df177db739c7930a8b4f2406f29e4b8981fa6151","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"TODO(hjensas): This module should be deleted once neutron-lib containing"},{"line_number":18,"context_line":"Change-Id: I55d659c47f3e9a65af78509fbd63416373a501f3 is released."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_1d783228","line":17,"updated":"2019-07-11 15:27:13.000000000","message":"Hi Harald. Those modules are in neutron-lib 1.28.0.\n\nI think you can remove them.\n\nIMO, the patch, without these temporary modules and pointing to n-lib, is ready.","commit_id":"c782e474be0ba4edf4e992d6f1cd0e695ffe9b99"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"e4c89d14a8bcd6bcd5266f90d5c099057ed5aeed","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"TODO(hjensas): This module should be deleted once neutron-lib containing"},{"line_number":18,"context_line":"Change-Id: I55d659c47f3e9a65af78509fbd63416373a501f3 is released."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_40731d4e","line":17,"in_reply_to":"7faddb67_1d783228","updated":"2019-07-11 16:10:39.000000000","message":"oh, I tought I had alredy removed these. Must have done it in a local copy, and then held off pushing it while waiting for the neutron-lib release.\n\nDone.","commit_id":"c782e474be0ba4edf4e992d6f1cd0e695ffe9b99"}],"neutron/extensions/expose_l3_conntrack_helper.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"78c8ee649eb11b5a9e66c47bb355cea39d705103","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Expose_l3_conntrack_helper(extensions.APIExtensionDescriptor):"},{"line_number":21,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"bfb3d3c7_8b087fd9","line":21,"updated":"2019-05-22 09:46:59.000000000","message":"Do we need 2 extensions? Can\u0027t it all be done in one?","commit_id":"b8a5841aebe06571113260676ed2280798be5849"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2e525c75b58fc87824db7dfb79e48087d861f300","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Expose_l3_conntrack_helper(extensions.APIExtensionDescriptor):"},{"line_number":21,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"bfb3d3c7_c2ff1f32","line":21,"in_reply_to":"bfb3d3c7_8b087fd9","updated":"2019-05-23 10:17:18.000000000","message":"I think we need 2 because the other one is extending a subresource? It may be possible with one extension, but since the change in neutron-lib (https://review.opendev.org/650271) already merged I think it\u0027s a bit late to change it now?","commit_id":"b8a5841aebe06571113260676ed2280798be5849"}],"neutron/extensions/l3_conntrack_helper.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7b5cbbefba09b9a68610f06768c4ac7bbe5b4d98","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                plural_mappings,"},{"line_number":50,"context_line":"                apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":51,"context_line":"                # TODO(hjensas): Add CONNTRACKHELPER to neutron-lib Well-known"},{"line_number":52,"context_line":"                #  service type constants."},{"line_number":53,"context_line":"                \u0027CONNTRACKHELPER\u0027,"},{"line_number":54,"context_line":"                translate_name\u003dTrue,"},{"line_number":55,"context_line":"                allow_bulk\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_a5369750","line":52,"range":{"start_line":52,"start_character":18,"end_line":52,"end_character":19},"updated":"2019-04-05 13:58:17.000000000","message":"nit: extra space","commit_id":"dd5c5bfe6a50545b549dd7c83b5e2a5217123d23"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4400f184aa8ff91ab896d8df5bc532e43a586351","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                plural_mappings,"},{"line_number":50,"context_line":"                apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":51,"context_line":"                # TODO(hjensas): Add CONNTRACKHELPER to neutron-lib Well-known"},{"line_number":52,"context_line":"                #  service type constants."},{"line_number":53,"context_line":"                \u0027CONNTRACKHELPER\u0027,"},{"line_number":54,"context_line":"                translate_name\u003dTrue,"},{"line_number":55,"context_line":"                allow_bulk\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_a900a835","line":52,"range":{"start_line":52,"start_character":18,"end_line":52,"end_character":19},"in_reply_to":"5fc1f717_a5369750","updated":"2019-04-08 10:47:40.000000000","message":"Done","commit_id":"dd5c5bfe6a50545b549dd7c83b5e2a5217123d23"}],"neutron/services/conntrack_helper/common/exceptions.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"78c8ee649eb11b5a9e66c47bb355cea39d705103","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    message \u003d _(\"Conntrack Helper %(id)s could not be found.\")"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class HelperNotAllowed(n_exc.BadRequest):"},{"line_number":25,"context_line":"    message \u003d _(\"Conntrack Helper %(helper)s is not allowed.\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bfb3d3c7_4be047fb","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":22},"updated":"2019-05-22 09:46:59.000000000","message":"maybe \"ConntracHelperNotAllowed\" to be consistent with exception above","commit_id":"b8a5841aebe06571113260676ed2280798be5849"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2e525c75b58fc87824db7dfb79e48087d861f300","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    message \u003d _(\"Conntrack Helper %(id)s could not be found.\")"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class HelperNotAllowed(n_exc.BadRequest):"},{"line_number":25,"context_line":"    message \u003d _(\"Conntrack Helper %(helper)s is not allowed.\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bfb3d3c7_028777d9","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":22},"in_reply_to":"bfb3d3c7_4be047fb","updated":"2019-05-23 10:17:18.000000000","message":"Done","commit_id":"b8a5841aebe06571113260676ed2280798be5849"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"11fd5d8ce62c5c55fc208a5e457e2a0be13eecce","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class InvalidProtocolForHelper(n_exc.BadRequest):"},{"line_number":29,"context_line":"    message \u003d _(\"Conntrack Helper %(helper)s does not support: %(protocol)s. \""},{"line_number":30,"context_line":"                \"Supported protocols are: %(supported_protos)s\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_10cf93b0","line":30,"range":{"start_line":30,"start_character":54,"end_line":30,"end_character":60},"updated":"2019-07-15 07:59:54.000000000","message":"protos? why not protocols?","commit_id":"0665c2efbb4d387c1af1a05cda0c6f761e447b75"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"c5b3817dd0b45fa5bc60a8bb122f87087dd37eb1","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class InvalidProtocolForHelper(n_exc.BadRequest):"},{"line_number":29,"context_line":"    message \u003d _(\"Conntrack Helper %(helper)s does not support: %(protocol)s. \""},{"line_number":30,"context_line":"                \"Supported protocols are: %(supported_protos)s\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_c345b0b5","line":30,"range":{"start_line":30,"start_character":54,"end_line":30,"end_character":60},"in_reply_to":"7faddb67_10cf93b0","updated":"2019-07-15 13:50:17.000000000","message":"Done","commit_id":"0665c2efbb4d387c1af1a05cda0c6f761e447b75"}],"neutron/services/conntrack_helper/plugin.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7b5cbbefba09b9a68610f06768c4ac7bbe5b4d98","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            with db_api.CONTEXT_WRITER.using(context):"},{"line_number":146,"context_line":"                cth_obj \u003d cth.ConntrackHelper.get_object(context, id\u003did)"},{"line_number":147,"context_line":"                if not cth_obj:"},{"line_number":148,"context_line":"                    raise cth_exc.ConntrackHelperNotFound(id\u003did)"},{"line_number":149,"context_line":"                cth_obj.update_fields(conntrack_helper, reset_changes\u003dTrue)"},{"line_number":150,"context_line":"                cth_obj.update()"},{"line_number":151,"context_line":"        except oslo_db_exc.DBDuplicateEntry:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_455ed345","line":148,"updated":"2019-04-05 13:58:17.000000000","message":"nit: you could create a helper called _get_conntrack_helper() that is basically these three lines and use it here and in get() and delete() below.  Was just comparing to trunk plugin...","commit_id":"dd5c5bfe6a50545b549dd7c83b5e2a5217123d23"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4400f184aa8ff91ab896d8df5bc532e43a586351","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            with db_api.CONTEXT_WRITER.using(context):"},{"line_number":146,"context_line":"                cth_obj \u003d cth.ConntrackHelper.get_object(context, id\u003did)"},{"line_number":147,"context_line":"                if not cth_obj:"},{"line_number":148,"context_line":"                    raise cth_exc.ConntrackHelperNotFound(id\u003did)"},{"line_number":149,"context_line":"                cth_obj.update_fields(conntrack_helper, reset_changes\u003dTrue)"},{"line_number":150,"context_line":"                cth_obj.update()"},{"line_number":151,"context_line":"        except oslo_db_exc.DBDuplicateEntry:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_89036c42","line":148,"in_reply_to":"5fc1f717_455ed345","updated":"2019-04-08 10:47:40.000000000","message":"Done","commit_id":"dd5c5bfe6a50545b549dd7c83b5e2a5217123d23"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4400f184aa8ff91ab896d8df5bc532e43a586351","unresolved":false,"context_lines":[{"line_number":38,"context_line":"from neutron.services.conntrack_helper.common import exceptions as cth_exc"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CTH_CONSTRAINTS \u003d {"},{"line_number":42,"context_line":"    \u0027amanda\u0027: {n_const.PROTO_NAME_TCP},"},{"line_number":43,"context_line":"    \u0027ftp\u0027: {n_const.PROTO_NAME_TCP},"},{"line_number":44,"context_line":"    \u0027h323\u0027: {n_const.PROTO_NAME_UDP, n_const.PROTO_NAME_TCP},"},{"line_number":45,"context_line":"    \u0027irc\u0027: {n_const.PROTO_NAME_TCP},"},{"line_number":46,"context_line":"    \u0027netbios-ns\u0027: {n_const.PROTO_NAME_UDP},"},{"line_number":47,"context_line":"    \u0027sane\u0027: {n_const.PROTO_NAME_TCP},"},{"line_number":48,"context_line":"    \u0027sip\u0027: {n_const.PROTO_NAME_UDP, n_const.PROTO_NAME_TCP},"},{"line_number":49,"context_line":"    \u0027tftp\u0027: {n_const.PROTO_NAME_UDP}"},{"line_number":50,"context_line":"}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"@resource_extend.has_resource_extenders"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_03e3c7d9","line":50,"range":{"start_line":41,"start_character":0,"end_line":50,"end_character":1},"updated":"2019-04-08 10:47:40.000000000","message":"Would it be better to make this an option?\n\nFor example the operator need to set:\n allowed_ct_helpers \u003d [{ftp: [tcp]}, {tftp: [udp]}, {sip: [tcp, udp]}]\n\nthis would enable anyone using a vendor nf_conntrack helper module to use this feature?","commit_id":"26686a68a46b8e94d8855e03cbc117dfe94a8390"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"395bc65bf88868c05a6cb555b27e5f01f7f9c7e6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.core_plugin \u003d directory.get_plugin()"},{"line_number":63,"context_line":"        self.constraints \u003d collections.defaultdict(list)"},{"line_number":64,"context_line":"        for x in cfg.CONF.allowed_conntrack_helpers:"},{"line_number":65,"context_line":"            self.constraints[x.keys()[0]].append(x.values()[0])"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    @resource_extend.extends([l3.ROUTERS])"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_f84321ae","line":65,"updated":"2019-04-15 12:36:09.000000000","message":"keys() and values() are generators in Python3.\n\nThe fastest way to retrieve the first item (Pytjon2 and Python3) is:\n next(iter(x.keys()))\n next(iter(x.values()))","commit_id":"91d53cb2a300a0ef0d1c96e8479a6651d7fc8f45"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"27b07f2fe1805b29d94aa02192fba2b1a8cf972b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.core_plugin \u003d directory.get_plugin()"},{"line_number":63,"context_line":"        self.constraints \u003d collections.defaultdict(list)"},{"line_number":64,"context_line":"        for x in cfg.CONF.allowed_conntrack_helpers:"},{"line_number":65,"context_line":"            self.constraints[x.keys()[0]].append(x.values()[0])"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    @resource_extend.extends([l3.ROUTERS])"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_bbf0cc92","line":65,"in_reply_to":"3fce034c_f84321ae","updated":"2019-04-19 14:23:04.000000000","message":"Thanks Rodolfo. \n\nDone.","commit_id":"91d53cb2a300a0ef0d1c96e8479a6651d7fc8f45"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38f3ad7082292754733b8267393cb4cba7a8fe9c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.l3_plugin \u003d directory.get_plugin(constants.L3)"},{"line_number":62,"context_line":"        self.core_plugin \u003d directory.get_plugin()"},{"line_number":63,"context_line":"        self.constraints \u003d collections.defaultdict(list)"},{"line_number":64,"context_line":"        for x in cfg.CONF.allowed_conntrack_helpers:"},{"line_number":65,"context_line":"            self.constraints[next(iter(x.keys()))].append("},{"line_number":66,"context_line":"                next(iter(x.values())))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @staticmethod"},{"line_number":69,"context_line":"    @resource_extend.extends([l3.ROUTERS])"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_b6d96d23","line":66,"range":{"start_line":64,"start_character":8,"end_line":66,"end_character":39},"updated":"2019-04-22 08:18:27.000000000","message":"Seems lack readability... So what does it look like eventually?","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"4ce28ed811bf3a40d5bef0cb76d33467fca0cc39","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.l3_plugin \u003d directory.get_plugin(constants.L3)"},{"line_number":62,"context_line":"        self.core_plugin \u003d directory.get_plugin()"},{"line_number":63,"context_line":"        self.constraints \u003d collections.defaultdict(list)"},{"line_number":64,"context_line":"        for x in cfg.CONF.allowed_conntrack_helpers:"},{"line_number":65,"context_line":"            self.constraints[next(iter(x.keys()))].append("},{"line_number":66,"context_line":"                next(iter(x.values())))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @staticmethod"},{"line_number":69,"context_line":"    @resource_extend.extends([l3.ROUTERS])"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffb9cba7_99dd1244","line":66,"range":{"start_line":64,"start_character":8,"end_line":66,"end_character":39},"in_reply_to":"ffb9cba7_b6d96d23","updated":"2019-04-26 17:24:02.000000000","message":"The config option is a list of k,v pairs. k can be the same multiple times. This merges into  k, [v]. i.e key once and values become a list. I added a comment in code to explain.","commit_id":"9060b069949078366b2e40bde1d2bae8fb6f95a3"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e0a3769b947f88dfdedcddbc54dc9034627904e1","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@resource_extend.has_resource_extenders"},{"line_number":44,"context_line":"@registry.has_registry_receivers"},{"line_number":45,"context_line":"class Plugin(l3_conntrack_helper.ConntrackHelperPluginBase):"},{"line_number":46,"context_line":"    \"\"\"Implementation of the Neutron Conntrack Helper Service Plugin."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    This class implements a Conntrack Helper plugin."}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_c2806849","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":12},"updated":"2019-05-10 16:41:33.000000000","message":"I wonder why we always add new plugin for such L3 related functionality?  If there are more and more related resource added, seems the service_plugins may run out of control.","commit_id":"b6835c0cf389f31e9a39ebbaafbf2b69fc0068c4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"11fd5d8ce62c5c55fc208a5e457e2a0be13eecce","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @db_base_plugin_common.make_result_with_fields"},{"line_number":170,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":171,"context_line":"    def get_router_conntrack_helper(self, context, id, router_id, fields\u003dNone):"},{"line_number":172,"context_line":"        obj \u003d self._get_conntrack_helper(context, id)"},{"line_number":173,"context_line":"        return obj"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @db_base_plugin_common.make_result_with_fields"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_30072fcd","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":14},"updated":"2019-07-15 07:59:54.000000000","message":"nitty nit: could be \"return\" just here :)","commit_id":"0665c2efbb4d387c1af1a05cda0c6f761e447b75"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"c5b3817dd0b45fa5bc60a8bb122f87087dd37eb1","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @db_base_plugin_common.make_result_with_fields"},{"line_number":170,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":171,"context_line":"    def get_router_conntrack_helper(self, context, id, router_id, fields\u003dNone):"},{"line_number":172,"context_line":"        obj \u003d self._get_conntrack_helper(context, id)"},{"line_number":173,"context_line":"        return obj"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @db_base_plugin_common.make_result_with_fields"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_430b007c","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":14},"in_reply_to":"7faddb67_30072fcd","updated":"2019-07-15 13:50:17.000000000","message":"Done","commit_id":"0665c2efbb4d387c1af1a05cda0c6f761e447b75"}],"neutron/tests/contrib/hooks/api_all_extensions":[{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"31de69b80d80f1e04358103d4d36f60b0ff90d01","unresolved":false,"context_lines":[{"line_number":22,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",flavors\""},{"line_number":23,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",floatingip-pools\""},{"line_number":24,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",ip-substring-filtering\""},{"line_number":25,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-conntrack-helper\""},{"line_number":26,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-flavors\""},{"line_number":27,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-ha\""},{"line_number":28,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3_agent_scheduler\""}],"source_content_type":"application/octet-stream","patch_set":24,"id":"7faddb67_7544b9b8","line":25,"updated":"2019-08-16 02:54:48.000000000","message":"You want to add \u0027expose-l3-conntrack-helper\u0027 as well?","commit_id":"e819bcbff0517e80176fe9d7128045e7a94f6567"}]}
