)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b1f5f08dc4bcc452d246a6c348c94c52548fa95e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7f99e435_1f3a842e","updated":"2026-03-30 09:56:00.000000000","message":"The code looks ok. Same as in the original patch [1], add a release note including the new feature\n\n[1]https://review.opendev.org/c/openstack/neutron/+/846422","commit_id":"8849d34c4503d5b14a575774c51bd406008eed4d"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"bba29cf71542fd7539f8a9ac0293f89e302373b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b8a61dc6_40d1d43a","in_reply_to":"7f99e435_1f3a842e","updated":"2026-03-31 02:26:39.000000000","message":"Thank you for the review. I\u0027ve added the release note as suggested.","commit_id":"8849d34c4503d5b14a575774c51bd406008eed4d"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"b3a0d67f78a42c2928e9524eee307b56b08f1999","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"14c5b929_13d5fa10","updated":"2026-05-08 12:55:25.000000000","message":"thanks","commit_id":"f380bf866e5a614748d1e3487a52b0e845750a20"}],"neutron/cmd/remove_duplicated_port_bindings.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6a2cec5e8ddd083971802943fd5d729c0af9ff71","unresolved":true,"context_lines":[{"line_number":60,"context_line":"    conf \u003d cfg.CONF"},{"line_number":61,"context_line":"    setup_conf(conf)"},{"line_number":62,"context_line":"    _dry_run \u003d conf.cli_script.dry_run"},{"line_number":63,"context_line":"    _port_id \u003d conf.port"},{"line_number":64,"context_line":"    admin_ctx \u003d context.get_admin_context()"},{"line_number":65,"context_line":"    with db_api.CONTEXT_WRITER.using(admin_ctx):"},{"line_number":66,"context_line":"        dup_pbindings \u003d ports_obj.PortBinding.get_duplicated_port_bindings("}],"source_content_type":"text/x-python","patch_set":4,"id":"44bb1789_70cbb0ec","line":63,"range":{"start_line":63,"start_character":4,"end_line":63,"end_character":24},"updated":"2026-04-02 07:26:48.000000000","message":"Can you please check to add a uuid validation like uuidutils.is_uuid_like ?","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"5f7ed112c8c00bf85014b35b57794b475afe2def","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    conf \u003d cfg.CONF"},{"line_number":61,"context_line":"    setup_conf(conf)"},{"line_number":62,"context_line":"    _dry_run \u003d conf.cli_script.dry_run"},{"line_number":63,"context_line":"    _port_id \u003d conf.port"},{"line_number":64,"context_line":"    admin_ctx \u003d context.get_admin_context()"},{"line_number":65,"context_line":"    with db_api.CONTEXT_WRITER.using(admin_ctx):"},{"line_number":66,"context_line":"        dup_pbindings \u003d ports_obj.PortBinding.get_duplicated_port_bindings("}],"source_content_type":"text/x-python","patch_set":4,"id":"64b8b294_161b6a96","line":63,"range":{"start_line":63,"start_character":4,"end_line":63,"end_character":24},"in_reply_to":"44bb1789_70cbb0ec","updated":"2026-04-03 02:17:55.000000000","message":"Thank you for the review. I\u0027ve added UUID validation using `uuidutils.is_uuid_like()` to ensure the provided port ID is a valid UUID format.\nIf an invalid port ID is provided, the script will log an error and exit with status code 1.","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"}],"neutron/objects/ports.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"723775bbf90d1aec47ab7fbb5eaf5c0ee981e951","unresolved":true,"context_lines":[{"line_number":116,"context_line":"            _filter \u003d and_(cls.db_model.port_id \u003d\u003d port_id,"},{"line_number":117,"context_line":"                           cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":118,"context_line":"            return context.session.query(cls.db_model).filter(_filter).all()"},{"line_number":119,"context_line":"        select \u003d ("},{"line_number":120,"context_line":"            sqlalchemy.select(cls.db_model.port_id)."},{"line_number":121,"context_line":"            select_from(cls.db_model)."},{"line_number":122,"context_line":"            group_by(cls.db_model.port_id)."},{"line_number":123,"context_line":"            having(sqlalchemy.func.count(cls.db_model.port_id) \u003e 1))"},{"line_number":124,"context_line":"        _filter \u003d and_(cls.db_model.port_id.in_(select),"},{"line_number":125,"context_line":"                       cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":126,"context_line":"        return context.session.query(cls.db_model).filter(_filter).all()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"c3063d2d_d9fa5a86","line":125,"range":{"start_line":119,"start_character":8,"end_line":125,"end_character":65},"updated":"2026-04-01 16:59:10.000000000","message":"nit: I guess this could have all been in an \u0027else\u0027 block, then we just have a single return since they are both the same","commit_id":"c1c647bf598eda16a96b6f8c52ca46c6548792de"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"d381998644fc30f196af17e37ae8128c5690e806","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            _filter \u003d and_(cls.db_model.port_id \u003d\u003d port_id,"},{"line_number":117,"context_line":"                           cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":118,"context_line":"            return context.session.query(cls.db_model).filter(_filter).all()"},{"line_number":119,"context_line":"        select \u003d ("},{"line_number":120,"context_line":"            sqlalchemy.select(cls.db_model.port_id)."},{"line_number":121,"context_line":"            select_from(cls.db_model)."},{"line_number":122,"context_line":"            group_by(cls.db_model.port_id)."},{"line_number":123,"context_line":"            having(sqlalchemy.func.count(cls.db_model.port_id) \u003e 1))"},{"line_number":124,"context_line":"        _filter \u003d and_(cls.db_model.port_id.in_(select),"},{"line_number":125,"context_line":"                       cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":126,"context_line":"        return context.session.query(cls.db_model).filter(_filter).all()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"98033cb7_72db46f2","line":125,"range":{"start_line":119,"start_character":8,"end_line":125,"end_character":65},"in_reply_to":"c3063d2d_d9fa5a86","updated":"2026-04-02 01:14:01.000000000","message":"Thank you for the review, Brian. I\u0027ve updated the code to use an if-else block with a single return statement as suggested.","commit_id":"c1c647bf598eda16a96b6f8c52ca46c6548792de"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6a2cec5e8ddd083971802943fd5d729c0af9ff71","unresolved":true,"context_lines":[{"line_number":106,"context_line":"    @classmethod"},{"line_number":107,"context_line":"    @db_api.CONTEXT_READER"},{"line_number":108,"context_line":"    def get_duplicated_port_bindings(cls, context, port_id\u003dNone):"},{"line_number":109,"context_line":"        \"\"\"Get duplicated port bindings."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Returns all INACTIVE port bindings that are duplicated (appear more"},{"line_number":112,"context_line":"        than once for the same port_id). If ``port_id`` is provided, only"}],"source_content_type":"text/x-python","patch_set":4,"id":"126a875e_7a7cd4f7","line":109,"range":{"start_line":109,"start_character":11,"end_line":109,"end_character":40},"updated":"2026-04-02 07:26:48.000000000","message":"The docstring looks much better by the way and more 2020\u0027s :-)\n\nnit: if port_id is there not the duplicates are hunted, so the should be highlighted\nGet duplicated p. bindings or inactive bindings for given port\n\nor similar docstring.","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"4f4f6b3c55401fdc206acc727588e44e1075bcde","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    @classmethod"},{"line_number":107,"context_line":"    @db_api.CONTEXT_READER"},{"line_number":108,"context_line":"    def get_duplicated_port_bindings(cls, context, port_id\u003dNone):"},{"line_number":109,"context_line":"        \"\"\"Get duplicated port bindings."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Returns all INACTIVE port bindings that are duplicated (appear more"},{"line_number":112,"context_line":"        than once for the same port_id). If ``port_id`` is provided, only"}],"source_content_type":"text/x-python","patch_set":4,"id":"0fc17a45_24e9cf82","line":109,"range":{"start_line":109,"start_character":11,"end_line":109,"end_character":40},"in_reply_to":"126a875e_7a7cd4f7","updated":"2026-04-03 02:41:33.000000000","message":"Thank you for the review!\nI\u0027ve updated the docstring to clarify that the method returns either duplicated port bindings or INACTIVE bindings for a given port, depending on whether port_id is provided.","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"89c9ceef632893437dfba31338f120803be6cde5","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":"        if port_id:"},{"line_number":116,"context_line":"            _filter \u003d and_(cls.db_model.port_id \u003d\u003d port_id,"},{"line_number":117,"context_line":"                           cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            select \u003d ("},{"line_number":120,"context_line":"                sqlalchemy.select(cls.db_model.port_id)."}],"source_content_type":"text/x-python","patch_set":6,"id":"87ed9e7b_09ee3606","line":117,"updated":"2026-04-08 01:55:22.000000000","message":"Just one question on this. If this port doesn\u0027t have a duplicated port binding, should it still be returned?","commit_id":"f380bf866e5a614748d1e3487a52b0e845750a20"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"42e6e951bd23e2602e24a48095c8e4770680e083","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":"        if port_id:"},{"line_number":116,"context_line":"            _filter \u003d and_(cls.db_model.port_id \u003d\u003d port_id,"},{"line_number":117,"context_line":"                           cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            select \u003d ("},{"line_number":120,"context_line":"                sqlalchemy.select(cls.db_model.port_id)."}],"source_content_type":"text/x-python","patch_set":6,"id":"9c819748_45a4fe08","line":117,"in_reply_to":"87ed9e7b_09ee3606","updated":"2026-04-08 03:41:04.000000000","message":"Yes, that\u0027s correct. When port_id is provided, all INACTIVE bindings for that port are returned, regardless of duplication.","commit_id":"f380bf866e5a614748d1e3487a52b0e845750a20"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"ccaf23fc67c3842d1fad5f4352b39dae3c1e3ec3","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":"        if port_id:"},{"line_number":116,"context_line":"            _filter \u003d and_(cls.db_model.port_id \u003d\u003d port_id,"},{"line_number":117,"context_line":"                           cls.db_model.status \u003d\u003d constants.INACTIVE)"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            select \u003d ("},{"line_number":120,"context_line":"                sqlalchemy.select(cls.db_model.port_id)."}],"source_content_type":"text/x-python","patch_set":6,"id":"aec5d87c_cf3d3026","line":117,"in_reply_to":"9c819748_45a4fe08","updated":"2026-04-14 09:29:36.000000000","message":"Done","commit_id":"f380bf866e5a614748d1e3487a52b0e845750a20"}],"releasenotes/notes/add-port-option-to-remove-duplicated-port-bindings-ea660c574b35d0ec.yaml":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6a2cec5e8ddd083971802943fd5d729c0af9ff71","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``remove-duplicated-port-bindings`` script now supports a new"},{"line_number":5,"context_line":"    ``--port`` CLI option. When specified, only the INACTIVE bindings for"},{"line_number":6,"context_line":"    the specific port ID provided will be removed, leaving all other ports"},{"line_number":7,"context_line":"    unaffected. This provides better control for operators who need to fix"},{"line_number":8,"context_line":"    individual ports without risking unintended changes to other ports."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9cad68ce_168f5dc3","line":5,"range":{"start_line":5,"start_character":43,"end_line":5,"end_character":60},"updated":"2026-04-02 07:26:48.000000000","message":"thanks for highlighting it here also","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"f160353db020635fa76b0c1d1204c027a23ece13","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``remove-duplicated-port-bindings`` script now supports a new"},{"line_number":5,"context_line":"    ``--port`` CLI option. When specified, only the INACTIVE bindings for"},{"line_number":6,"context_line":"    the specific port ID provided will be removed, leaving all other ports"},{"line_number":7,"context_line":"    unaffected. This provides better control for operators who need to fix"},{"line_number":8,"context_line":"    individual ports without risking unintended changes to other ports."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3c5947e6_95ba30c6","line":5,"range":{"start_line":5,"start_character":43,"end_line":5,"end_character":60},"in_reply_to":"9cad68ce_168f5dc3","updated":"2026-04-03 02:45:29.000000000","message":"Thank you 😊","commit_id":"0b52a04bfd12518a8ad42e79ecc83e85b5250137"}]}
