)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"671929b00e282741febc2d4285f77e27c8673bb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0b34f743_9544e12a","updated":"2026-03-02 13:04:33.000000000","message":"LGTM","commit_id":"465b815ee8e2be38f7db0af94e26323b31806aa1"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"29f88a91f702b112b12a4eaf280529ed16743b46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5c3e1385_19d3cc7c","updated":"2026-03-02 12:55:14.000000000","message":"recheck rocky 10 podman unrelated failure","commit_id":"465b815ee8e2be38f7db0af94e26323b31806aa1"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3ce3154cddeb91195ea0397e3528189e63f2a760","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"e007900f_235ba841","updated":"2026-03-25 07:56:49.000000000","message":"I can +2 now hehe","commit_id":"c1d2b5d33743da7d9a06051dca33659728558511"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"8e90e02caa336d9182d9cc39e5b80cea7b300830","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"52e9dbd1_e6b8dce2","updated":"2026-03-25 09:49:42.000000000","message":"let\u0027s get this in","commit_id":"c1d2b5d33743da7d9a06051dca33659728558511"},{"author":{"_account_id":14200,"name":"Maksim Malchuk","email":"maksim.malchuk@gmail.com","username":"mmalchuk"},"change_message_id":"1e510466144657473eecd8094a89ab76be281b99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"14c4cac4_e257ecb2","updated":"2026-03-26 07:50:08.000000000","message":"recheck","commit_id":"c1d2b5d33743da7d9a06051dca33659728558511"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"4679dab637304a6a5eaee646253f4291565cb9d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"09ce9a3a_a6c9707a","updated":"2026-04-29 17:51:14.000000000","message":"This exposed a bug in `compare_labels` that was previously hidden because all checks run regardless.\n\n`del current_labels[k]` in `compare_labels` throws if the image is missing a label that the variables declare\n\n\nshould probbly replace by `current_labels.pop(k, None)`.","commit_id":"60146e05a04bfffa2af38e53c768c35d8b2d6ad7"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"571d5f7a1b719c9af131924d40f335e504a33385","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"7085c1fa_2551a269","in_reply_to":"09ce9a3a_a6c9707a","updated":"2026-04-30 06:54:07.000000000","message":"unresolved whoops","commit_id":"60146e05a04bfffa2af38e53c768c35d8b2d6ad7"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"461b99a19856880153743b3a7a2a648bf0786912","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3a64b224_99f7b2a5","in_reply_to":"7085c1fa_2551a269","updated":"2026-05-05 17:20:41.000000000","message":"Done","commit_id":"60146e05a04bfffa2af38e53c768c35d8b2d6ad7"}],"ansible/module_utils/kolla_container_worker.py":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"0d1b441ffb9a7483f3d628ad91e76e6143b09af0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            return [{\u0027name\u0027: \u0027container_info_missing\u0027,"},{"line_number":99,"context_line":"                     \u0027current\u0027: None, \u0027desired\u0027: None}]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        checks \u003d ["},{"line_number":102,"context_line":"            \u0027cap_add\u0027,"},{"line_number":103,"context_line":"            \u0027security_opt\u0027,"},{"line_number":104,"context_line":"            \u0027image\u0027,"},{"line_number":105,"context_line":"            \u0027ipc_mode\u0027,"},{"line_number":106,"context_line":"            \u0027labels\u0027,"},{"line_number":107,"context_line":"            \u0027privileged\u0027,"},{"line_number":108,"context_line":"            \u0027pid_mode\u0027,"},{"line_number":109,"context_line":"            \u0027cgroupns_mode\u0027,"},{"line_number":110,"context_line":"            \u0027tmpfs\u0027,"},{"line_number":111,"context_line":"            \u0027volumes\u0027,"},{"line_number":112,"context_line":"            \u0027volumes_from\u0027,"},{"line_number":113,"context_line":"            \u0027environment\u0027,"},{"line_number":114,"context_line":"            \u0027container_state\u0027,"},{"line_number":115,"context_line":"            \u0027dimensions\u0027,"},{"line_number":116,"context_line":"            \u0027command\u0027,"},{"line_number":117,"context_line":"            \u0027healthcheck\u0027,"},{"line_number":118,"context_line":"        ]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        failures \u003d []"},{"line_number":121,"context_line":"        for name in checks:"},{"line_number":122,"context_line":"            if getattr(self, \u0027compare_\u0027 + name)(container_info):"},{"line_number":123,"context_line":"                diff \u003d getattr(self, \u0027diff_\u0027 + name)(container_info)"},{"line_number":124,"context_line":"                failures.append({\u0027name\u0027: name,"},{"line_number":125,"context_line":"                                 \u0027current\u0027: diff[0],"},{"line_number":126,"context_line":"                                 \u0027desired\u0027: diff[1]})"},{"line_number":127,"context_line":"        return failures"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # ------------------------------------------------------------------"},{"line_number":130,"context_line":"    # diff_* methods: return (current, desired) for each comparison."}],"source_content_type":"text/x-python","patch_set":8,"id":"5ce44580_92cdb784","line":127,"range":{"start_line":101,"start_character":0,"end_line":127,"end_character":23},"updated":"2026-02-27 17:18:13.000000000","message":"I really like this","commit_id":"cd32af8f50787ca437db902610f7c2afa4487883"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"0d1b441ffb9a7483f3d628ad91e76e6143b09af0","unresolved":true,"context_lines":[{"line_number":195,"context_line":"        desired \u003d list(self.params.get(\u0027volumes_from\u0027) or [])"},{"line_number":196,"context_line":"        return sorted(current), sorted(desired)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def diff_environment(self, container_info):"},{"line_number":199,"context_line":"        current_env \u003d {}"},{"line_number":200,"context_line":"        for kv in container_info[\u0027Config\u0027].get(\u0027Env\u0027, []):"},{"line_number":201,"context_line":"            k, v \u003d kv.split(\u0027\u003d\u0027, 1)"},{"line_number":202,"context_line":"            current_env[k] \u003d v"},{"line_number":203,"context_line":"        desired_env \u003d self.params.get(\u0027environment\u0027, {})"},{"line_number":204,"context_line":"        # Only show keys that are actually different"},{"line_number":205,"context_line":"        differing \u003d {k: {\u0027current\u0027: current_env.get(k), \u0027desired\u0027: v}"},{"line_number":206,"context_line":"                     for k, v in desired_env.items()"},{"line_number":207,"context_line":"                     if current_env.get(k) !\u003d v}"},{"line_number":208,"context_line":"        return differing, None  # detail is in \u0027current\u0027 as a dict"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def diff_container_state(self, container_info):"},{"line_number":211,"context_line":"        current \u003d container_info[\u0027State\u0027].get(\u0027Status\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"177e6f39_a75e581d","line":208,"range":{"start_line":198,"start_character":0,"end_line":208,"end_character":66},"updated":"2026-02-27 17:18:13.000000000","message":"inconsistent interface. Every other diff_* returns (current_value, desired_value). But diff_environment returns (differing_dict, None). Maybe split it back into (current, desired)","commit_id":"cd32af8f50787ca437db902610f7c2afa4487883"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"82522855f79dce07482fb3c762b42862ccc47060","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        desired \u003d list(self.params.get(\u0027volumes_from\u0027) or [])"},{"line_number":196,"context_line":"        return sorted(current), sorted(desired)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def diff_environment(self, container_info):"},{"line_number":199,"context_line":"        current_env \u003d {}"},{"line_number":200,"context_line":"        for kv in container_info[\u0027Config\u0027].get(\u0027Env\u0027, []):"},{"line_number":201,"context_line":"            k, v \u003d kv.split(\u0027\u003d\u0027, 1)"},{"line_number":202,"context_line":"            current_env[k] \u003d v"},{"line_number":203,"context_line":"        desired_env \u003d self.params.get(\u0027environment\u0027, {})"},{"line_number":204,"context_line":"        # Only show keys that are actually different"},{"line_number":205,"context_line":"        differing \u003d {k: {\u0027current\u0027: current_env.get(k), \u0027desired\u0027: v}"},{"line_number":206,"context_line":"                     for k, v in desired_env.items()"},{"line_number":207,"context_line":"                     if current_env.get(k) !\u003d v}"},{"line_number":208,"context_line":"        return differing, None  # detail is in \u0027current\u0027 as a dict"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def diff_container_state(self, container_info):"},{"line_number":211,"context_line":"        current \u003d container_info[\u0027State\u0027].get(\u0027Status\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ffd9355_16e5a13e","line":208,"range":{"start_line":198,"start_character":0,"end_line":208,"end_character":66},"in_reply_to":"177e6f39_a75e581d","updated":"2026-03-02 09:18:20.000000000","message":"Done","commit_id":"cd32af8f50787ca437db902610f7c2afa4487883"}],"ansible/module_utils/kolla_podman_worker.py":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"0d1b441ffb9a7483f3d628ad91e76e6143b09af0","unresolved":true,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        return container.attrs"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def compare_container(self):"},{"line_number":302,"context_line":"        container \u003d self.check_container()"},{"line_number":303,"context_line":"        failures \u003d []"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        if not container:"},{"line_number":306,"context_line":"            failures.append({\u0027name\u0027: \u0027container_missing\u0027,"},{"line_number":307,"context_line":"                             \u0027current\u0027: None, \u0027desired\u0027: self.params.get(\u0027name\u0027)})"},{"line_number":308,"context_line":"        else:"},{"line_number":309,"context_line":"            container_info \u003d self.get_container_info()"},{"line_number":310,"context_line":"            failures.extend(self.check_container_differs(container_info))"},{"line_number":311,"context_line":"            if self.compare_config():"},{"line_number":312,"context_line":"                failures.append({\u0027name\u0027: \u0027config\u0027,"},{"line_number":313,"context_line":"                                 \u0027current\u0027: self._config_diff,"},{"line_number":314,"context_line":"                                 \u0027desired\u0027: \u0027up_to_date\u0027})"},{"line_number":315,"context_line":"            if self.systemd.check_unit_change():"},{"line_number":316,"context_line":"                failures.append({\u0027name\u0027: \u0027systemd_unit\u0027,"},{"line_number":317,"context_line":"                                 \u0027current\u0027: \u0027out_of_date\u0027, \u0027desired\u0027: \u0027up_to_date\u0027})"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        if failures:"},{"line_number":320,"context_line":"            self.changed \u003d True"},{"line_number":321,"context_line":"            self.result[\u0027comparison_failures\u0027] \u003d failures"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        return self.changed"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def compare_cap_add(self, container_info):"},{"line_number":326,"context_line":"        new_cap_add \u003d self.params.get(\u0027cap_add\u0027, list()).copy()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7dff07ee_fd5d730b","line":323,"range":{"start_line":301,"start_character":0,"end_line":323,"end_character":27},"updated":"2026-02-27 17:18:13.000000000","message":"This is the exact same method as its parent, so we could remove it entirely.","commit_id":"cd32af8f50787ca437db902610f7c2afa4487883"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"bf5ebd00a0247441e95376593d2959400c864299","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        return container.attrs"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    def compare_container(self):"},{"line_number":302,"context_line":"        container \u003d self.check_container()"},{"line_number":303,"context_line":"        failures \u003d []"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        if not container:"},{"line_number":306,"context_line":"            failures.append({\u0027name\u0027: \u0027container_missing\u0027,"},{"line_number":307,"context_line":"                             \u0027current\u0027: None, \u0027desired\u0027: self.params.get(\u0027name\u0027)})"},{"line_number":308,"context_line":"        else:"},{"line_number":309,"context_line":"            container_info \u003d self.get_container_info()"},{"line_number":310,"context_line":"            failures.extend(self.check_container_differs(container_info))"},{"line_number":311,"context_line":"            if self.compare_config():"},{"line_number":312,"context_line":"                failures.append({\u0027name\u0027: \u0027config\u0027,"},{"line_number":313,"context_line":"                                 \u0027current\u0027: self._config_diff,"},{"line_number":314,"context_line":"                                 \u0027desired\u0027: \u0027up_to_date\u0027})"},{"line_number":315,"context_line":"            if self.systemd.check_unit_change():"},{"line_number":316,"context_line":"                failures.append({\u0027name\u0027: \u0027systemd_unit\u0027,"},{"line_number":317,"context_line":"                                 \u0027current\u0027: \u0027out_of_date\u0027, \u0027desired\u0027: \u0027up_to_date\u0027})"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        if failures:"},{"line_number":320,"context_line":"            self.changed \u003d True"},{"line_number":321,"context_line":"            self.result[\u0027comparison_failures\u0027] \u003d failures"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        return self.changed"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def compare_cap_add(self, container_info):"},{"line_number":326,"context_line":"        new_cap_add \u003d self.params.get(\u0027cap_add\u0027, list()).copy()"}],"source_content_type":"text/x-python","patch_set":8,"id":"0670ae24_48cfb9a7","line":323,"range":{"start_line":301,"start_character":0,"end_line":323,"end_character":27},"in_reply_to":"7dff07ee_fd5d730b","updated":"2026-03-02 09:14:29.000000000","message":"Done","commit_id":"cd32af8f50787ca437db902610f7c2afa4487883"}]}
