)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cf8cdd6a7da84e04b0a636ca5983355e5fb5cda7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4998164f_5e126856","updated":"2026-04-22 14:50:14.000000000","message":"can you add UTs for _is_pool_erasure_coded \n_caps_include_pool \n_do_setup_data_pool_check \n_diagnose_rbd_eperm \n_looks_like_eperm","commit_id":"bb9e04e438c033911ccb4f082ac91ee5bffef2c2"}],"cinder/volume/drivers/rbd.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cf8cdd6a7da84e04b0a636ca5983355e5fb5cda7","unresolved":true,"context_lines":[{"line_number":65,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def six_text_fallback(x):"},{"line_number":69,"context_line":"    try:"},{"line_number":70,"context_line":"        if isinstance(x, bytes):"},{"line_number":71,"context_line":"            return encodeutils.safe_decode(x)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b4894de7_78fdfb82","line":68,"updated":"2026-04-22 14:50:14.000000000","message":"why six_text_fallback placed hear. Usage is limited to this file. can you mark start with _ and move to appropriate location.","commit_id":"bb9e04e438c033911ccb4f082ac91ee5bffef2c2"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def six_text_fallback(x):"},{"line_number":69,"context_line":"    try:"},{"line_number":70,"context_line":"        if isinstance(x, bytes):"},{"line_number":71,"context_line":"            return encodeutils.safe_decode(x)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ef7182e7_17767014","line":68,"in_reply_to":"b4894de7_78fdfb82","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"bb9e04e438c033911ccb4f082ac91ee5bffef2c2"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"cf8cdd6a7da84e04b0a636ca5983355e5fb5cda7","unresolved":true,"context_lines":[{"line_number":472,"context_line":"    # create hot path."},{"line_number":473,"context_line":"    # ------------------------------------------------------------------"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    _data_pool_config: Optional[str] \u003d None"},{"line_number":476,"context_line":"    _metadata_pool_is_ec: bool \u003d False"},{"line_number":477,"context_line":"    _data_pool_caps_ok: Optional[bool] \u003d None"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7148e149_8d93959a","line":475,"updated":"2026-04-22 14:50:14.000000000","message":"Three state variables are defined as class attributes rather than instance attributes set in __init__","commit_id":"bb9e04e438c033911ccb4f082ac91ee5bffef2c2"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":472,"context_line":"    # create hot path."},{"line_number":473,"context_line":"    # ------------------------------------------------------------------"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    _data_pool_config: Optional[str] \u003d None"},{"line_number":476,"context_line":"    _metadata_pool_is_ec: bool \u003d False"},{"line_number":477,"context_line":"    _data_pool_caps_ok: Optional[bool] \u003d None"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d34d6418_2ee25bcc","line":475,"in_reply_to":"7148e149_8d93959a","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"bb9e04e438c033911ccb4f082ac91ee5bffef2c2"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"3640825b6430abf0c5e3539614ba3b9b01c3b8b4","unresolved":true,"context_lines":[{"line_number":505,"context_line":"        entity \u003d user if user.startswith(\u0027client.\u0027) else \u0027client.\u0027 + user"},{"line_number":506,"context_line":"        try:"},{"line_number":507,"context_line":"            ret, outbuf, _err \u003d client.cluster.mon_command("},{"line_number":508,"context_line":"                json.dumps({\u0027prefix\u0027: \u0027auth get\u0027,"},{"line_number":509,"context_line":"                            \u0027entity\u0027: entity,"},{"line_number":510,"context_line":"                            \u0027format\u0027: \u0027json\u0027}), b\u0027\u0027)"},{"line_number":511,"context_line":"            if ret !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8c56effd_da850457","line":508,"updated":"2026-07-10 06:21:14.000000000","message":"A normal client.cinder with mon profile rbd cannot run auth get. The live backend identity returned -13 access denied here, so this method returns None and the missing-data-pool-cap diagnostic never fires in the standard least-privilege deployment it is intended to diagnose. Please replace this with a proven non-mutating probe available to the backend identity, or drop the capability-parsing claim and keep only the configuration diagnostics.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"01242b953c8182dfdb067b437c7b88e8f10cab6c","unresolved":true,"context_lines":[{"line_number":505,"context_line":"        entity \u003d user if user.startswith(\u0027client.\u0027) else \u0027client.\u0027 + user"},{"line_number":506,"context_line":"        try:"},{"line_number":507,"context_line":"            ret, outbuf, _err \u003d client.cluster.mon_command("},{"line_number":508,"context_line":"                json.dumps({\u0027prefix\u0027: \u0027auth get\u0027,"},{"line_number":509,"context_line":"                            \u0027entity\u0027: entity,"},{"line_number":510,"context_line":"                            \u0027format\u0027: \u0027json\u0027}), b\u0027\u0027)"},{"line_number":511,"context_line":"            if ret !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"30e2494a_d0a1099b","line":508,"updated":"2026-07-10 06:30:01.000000000","message":"The auth get command requires monitor authorization that is not granted by the normal mon profile rbd capability. A least-privilege backend client therefore returns None here, so the capability hint cannot distinguish missing data-pool caps. Please replace this with a proven non-mutating probe available to the backend identity, or remove the capability parser and retain only the configuration diagnostics.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"fbfd61981f1f14b5c0340e30179ccae93318dfc8","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        entity \u003d user if user.startswith(\u0027client.\u0027) else \u0027client.\u0027 + user"},{"line_number":506,"context_line":"        try:"},{"line_number":507,"context_line":"            ret, outbuf, _err \u003d client.cluster.mon_command("},{"line_number":508,"context_line":"                json.dumps({\u0027prefix\u0027: \u0027auth get\u0027,"},{"line_number":509,"context_line":"                            \u0027entity\u0027: entity,"},{"line_number":510,"context_line":"                            \u0027format\u0027: \u0027json\u0027}), b\u0027\u0027)"},{"line_number":511,"context_line":"            if ret !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"379cf4d3_e81e8466","line":508,"in_reply_to":"30e2494a_d0a1099b","updated":"2026-07-10 08:34:40.000000000","message":"Done","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        entity \u003d user if user.startswith(\u0027client.\u0027) else \u0027client.\u0027 + user"},{"line_number":506,"context_line":"        try:"},{"line_number":507,"context_line":"            ret, outbuf, _err \u003d client.cluster.mon_command("},{"line_number":508,"context_line":"                json.dumps({\u0027prefix\u0027: \u0027auth get\u0027,"},{"line_number":509,"context_line":"                            \u0027entity\u0027: entity,"},{"line_number":510,"context_line":"                            \u0027format\u0027: \u0027json\u0027}), b\u0027\u0027)"},{"line_number":511,"context_line":"            if ret !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"2506a8b5_7f98070d","line":508,"in_reply_to":"8c56effd_da850457","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"01242b953c8182dfdb067b437c7b88e8f10cab6c","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        entity \u003d user if user.startswith(\u0027client.\u0027) else \u0027client.\u0027 + user"},{"line_number":506,"context_line":"        try:"},{"line_number":507,"context_line":"            ret, outbuf, _err \u003d client.cluster.mon_command("},{"line_number":508,"context_line":"                json.dumps({\u0027prefix\u0027: \u0027auth get\u0027,"},{"line_number":509,"context_line":"                            \u0027entity\u0027: entity,"},{"line_number":510,"context_line":"                            \u0027format\u0027: \u0027json\u0027}), b\u0027\u0027)"},{"line_number":511,"context_line":"            if ret !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7fb0269c_18dfbab4","line":508,"in_reply_to":"8c56effd_da850457","updated":"2026-07-10 06:30:01.000000000","message":"Superseded by the implementation-focused review comment on this line.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"3640825b6430abf0c5e3539614ba3b9b01c3b8b4","unresolved":true,"context_lines":[{"line_number":541,"context_line":"        try:"},{"line_number":542,"context_line":"            with RADOSClient(self) as client:"},{"line_number":543,"context_line":"                pool \u003d self.configuration.rbd_pool"},{"line_number":544,"context_line":"                user \u003d self.configuration.rbd_user"},{"line_number":545,"context_line":"                self._data_pool_config \u003d self._get_rbd_default_data_pool("},{"line_number":546,"context_line":"                    client)"},{"line_number":547,"context_line":"                self._metadata_pool_is_ec \u003d self._is_pool_erasure_coded("}],"source_content_type":"text/x-python","patch_set":5,"id":"9d758568_df3c2944","line":544,"updated":"2026-07-10 06:21:14.000000000","message":"This should use the active connection user from _get_config_tuple(), not configuration.rbd_user. A replication target may override user, so a driver started failed over can query and report on the primary entity instead of the active target entity.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        try:"},{"line_number":542,"context_line":"            with RADOSClient(self) as client:"},{"line_number":543,"context_line":"                pool \u003d self.configuration.rbd_pool"},{"line_number":544,"context_line":"                user \u003d self.configuration.rbd_user"},{"line_number":545,"context_line":"                self._data_pool_config \u003d self._get_rbd_default_data_pool("},{"line_number":546,"context_line":"                    client)"},{"line_number":547,"context_line":"                self._metadata_pool_is_ec \u003d self._is_pool_erasure_coded("}],"source_content_type":"text/x-python","patch_set":5,"id":"14cd9f26_49290fbf","line":544,"in_reply_to":"9d758568_df3c2944","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"3640825b6430abf0c5e3539614ba3b9b01c3b8b4","unresolved":true,"context_lines":[{"line_number":588,"context_line":"        if self._data_pool_config and self._data_pool_caps_ok is False:"},{"line_number":589,"context_line":"            return ("},{"line_number":590,"context_line":"                \u0027rbd_default_data_pool\u003d%s is set but %s lacks \u0027"},{"line_number":591,"context_line":"                \u0027caps on that pool.  Run: \u0027"},{"line_number":592,"context_line":"                \u0027\"ceph auth caps %s mon \\\u0027profile rbd\\\u0027 \u0027"},{"line_number":593,"context_line":"                \u0027osd \\\u0027profile rbd pool\u003d%s, profile rbd pool\u003d%s, ...\\\u0027\".\u0027"},{"line_number":594,"context_line":"                % (self._data_pool_config, entity, entity, pool,"}],"source_content_type":"text/x-python","patch_set":5,"id":"629af3a1_c03e7e25","line":591,"updated":"2026-07-10 06:21:14.000000000","message":"Please do not present this incomplete ceph auth caps command as Run:. The literal ellipsis is not executable, and ceph auth caps replaces the entity capability set, so operator guidance must explicitly preserve all existing caps. A descriptive hint plus ceph auth get for an administrator is safer.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        if self._data_pool_config and self._data_pool_caps_ok is False:"},{"line_number":589,"context_line":"            return ("},{"line_number":590,"context_line":"                \u0027rbd_default_data_pool\u003d%s is set but %s lacks \u0027"},{"line_number":591,"context_line":"                \u0027caps on that pool.  Run: \u0027"},{"line_number":592,"context_line":"                \u0027\"ceph auth caps %s mon \\\u0027profile rbd\\\u0027 \u0027"},{"line_number":593,"context_line":"                \u0027osd \\\u0027profile rbd pool\u003d%s, profile rbd pool\u003d%s, ...\\\u0027\".\u0027"},{"line_number":594,"context_line":"                % (self._data_pool_config, entity, entity, pool,"}],"source_content_type":"text/x-python","patch_set":5,"id":"971ac92d_9ed4f131","line":591,"in_reply_to":"629af3a1_c03e7e25","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"3640825b6430abf0c5e3539614ba3b9b01c3b8b4","unresolved":true,"context_lines":[{"line_number":2015,"context_line":""},{"line_number":2016,"context_line":"        self._active_backend_id \u003d secondary_id"},{"line_number":2017,"context_line":"        self._active_config \u003d remote"},{"line_number":2018,"context_line":"        self._set_default_secret_uuid()"},{"line_number":2019,"context_line":"        LOG.info(\u0027RBD driver failover completion completed.\u0027)"},{"line_number":2020,"context_line":""},{"line_number":2021,"context_line":"    def failover_host(self,"}],"source_content_type":"text/x-python","patch_set":5,"id":"203d9037_50de2db6","line":2018,"updated":"2026-07-10 06:21:14.000000000","message":"The cached data-pool, EC, and caps state is populated only during do_setup(). After failover this changes _active_config but leaves the cache describing the previous cluster. Please refresh _do_setup_data_pool_check() after selecting the remote target and add a test where primary and secondary data-pool settings differ.","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"5bb35db4141e8c53b106769018a7334078e102a1","unresolved":false,"context_lines":[{"line_number":2015,"context_line":""},{"line_number":2016,"context_line":"        self._active_backend_id \u003d secondary_id"},{"line_number":2017,"context_line":"        self._active_config \u003d remote"},{"line_number":2018,"context_line":"        self._set_default_secret_uuid()"},{"line_number":2019,"context_line":"        LOG.info(\u0027RBD driver failover completion completed.\u0027)"},{"line_number":2020,"context_line":""},{"line_number":2021,"context_line":"    def failover_host(self,"}],"source_content_type":"text/x-python","patch_set":5,"id":"d8a1c086_240f011d","line":2018,"in_reply_to":"203d9037_50de2db6","updated":"2026-07-10 06:29:01.000000000","message":"Done","commit_id":"b67f2954ac432b6d9210e4a62d3c8f6a6244c9ed"}]}
