)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"eeacac79e45211a9767e0b17ed8a7347bfc00cf5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"33591605_044771b5","updated":"2026-01-19 15:37:27.000000000","message":"What happens if I run `juju run keystone/0 pause` and then, the user does `k8s kubectl delete -n openstack keystone-0`?\n\nThis will re-create the pod, and we\u0027ll lose any notion of the pod being in maintenance.\n\nI\u0027m not sure we have a better way except using the peer relation in that case.\n\nWhat do you think should be the proper solution here?","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"6b154600e4e4eb07d2879a1a34557021a710609e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8c9a88d5_cbe32034","updated":"2026-01-27 12:45:27.000000000","message":"@gabriel.cocenza@canonical.com\nyou can run `tox -e py3` (for all) or `tox -e py3 -- keystone-k8s` or `tox -e py3 -- ops-sunbeam` for specific targets.\n\n\nThis will make it easier to review failures locally before uploading multiple revisions.","commit_id":"6fd8fea8a657d6e85b9ac9f51417a6356116559d"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"86986c91f5dc5ad9ed346562842bbb9dd4aea8e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1027c85a_b14ce4ca","updated":"2026-01-30 18:45:27.000000000","message":"recheck","commit_id":"ddfca42dc390f5d908465151c21fbc8d6076cc51"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"6c3451e38ebd2904fb5e6fc69915603589908afd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"14364a98_79828af7","updated":"2026-01-28 18:49:03.000000000","message":"recheck","commit_id":"ddfca42dc390f5d908465151c21fbc8d6076cc51"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"1dc078aa5ea14bc6ad7db6d6b4c663ea8fec4b70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"961e2542_77bcfcb5","updated":"2026-03-03 13:29:36.000000000","message":"Please; do not include .stestr artifacts into the code base :)","commit_id":"b23aa98707e2fbb31e59f4cd285dc7236c16e94d"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"b6532205e3748c37dd6d0844746190962553aa47","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"1510b0b9_6e2c06a3","updated":"2026-03-05 17:38:41.000000000","message":"recheck","commit_id":"85fa7813f605d18d73134f8647b2dcce5df281f1"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"e1fc43af_7092fa2b","updated":"2026-08-31 04:11:03.000000000","message":"Yurii, thanks for the new update.\n\nThe only concern i have is the traefik takes around ~30s to determine the service is down and sends the requests to the paused/stopped service.\n\nWe need a mechanism to remove the dead backend from the traefik.\n\nI am doing a PoC [1] to reduce the healthcheck timeout for certain operations so that traefik removes the dead backend sooner. This is not yet reviewed and approach is not finalized.\nIf you have any other ideas, please feel free to chime in\n\n[1] https://review.opendev.org/c/openstack/sunbeam-charms/+/1000817","commit_id":"65a1457f6e884462fc77f9e45a4d8d6c17f1b030"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"b58c62b2e718ae068e972e3aa8a081a4fe8748da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"abe2d447_27962f3b","updated":"2026-09-04 05:59:00.000000000","message":"pause/resume will be used for mysql restore and the traefik still seeing backends for paused services for ~30s should be fine for now. This problem will be investigated further as part of cluster upgrade. \n\nLGTM, thanks for the PR","commit_id":"65a1457f6e884462fc77f9e45a4d8d6c17f1b030"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"2fc5f569c8c22cdd4d678c19d7ff21c105af1893","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":18,"id":"c19a9e2b_1afd2a41","in_reply_to":"e1fc43af_7092fa2b","updated":"2026-09-01 00:08:38.000000000","message":"In the current backup/restore PR[1] workflow, all related API units pause first, then the related `mysql-router` applications scale to zero before the MySQL restore begins. Scaling the routers down closes the database paths and prevents further writes independently of Traefik’s backend convergence. The ~30s Traefik delay can cause transient HTTP failures during pause/resume, but it should not affect restore consistency. Faster health-check work would improve availability/convergence and seems useful as a follow-up, but I don\u0027t think it needs to block the pause/resume primitive.\n\n[1] https://github.com/canonical/snap-openstack/pull/876\n\nOne possible solution is to reduce the health check timeout, but 30s already seems reasonable. Another approach could be to add a field in Traefik\u0027s databag indicating that the application entered `maintenance`, or some state that signals Traefik to stop routing right away when that field is posted to the app databag. But that would require much more work and coordination than a simple timeout decrease.","commit_id":"65a1457f6e884462fc77f9e45a4d8d6c17f1b030"}],"ops-sunbeam/ops_sunbeam/charm.py":[{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"eeacac79e45211a9767e0b17ed8a7347bfc00cf5","unresolved":true,"context_lines":[{"line_number":867,"context_line":"                self.on[\"resume\"].action, self._on_resume_action"},{"line_number":868,"context_line":"            )"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def _on_pause_action(self, event: ops.ActionEvent) -\u003e None:"},{"line_number":871,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":872,"context_line":"        for ph in self.pebble_handlers:"},{"line_number":873,"context_line":"            ph.stop_healthcheck(\"up\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"779cbbc8_b8ef441d","line":870,"range":{"start_line":870,"start_character":8,"end_line":870,"end_character":24},"updated":"2026-01-19 15:37:27.000000000","message":"I wonder if we should have a main workload status about the whole unit being in maintenance, what do you think?\n\nWe can defer that if having multiple pebble handlers in maintenance shows well.","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"7225afe7be7790d54cfee367bf5f30443d095952","unresolved":true,"context_lines":[{"line_number":867,"context_line":"                self.on[\"resume\"].action, self._on_resume_action"},{"line_number":868,"context_line":"            )"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def _on_pause_action(self, event: ops.ActionEvent) -\u003e None:"},{"line_number":871,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":872,"context_line":"        for ph in self.pebble_handlers:"},{"line_number":873,"context_line":"            ph.stop_healthcheck(\"up\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"f35dfcef_026efd38","line":870,"range":{"start_line":870,"start_character":8,"end_line":870,"end_character":24},"in_reply_to":"779cbbc8_b8ef441d","updated":"2026-01-27 20:50:59.000000000","message":"Makes sense. I\u0027ve changed to act in the workload because has the highest priority. Now charms with multiple containers, e.g nova, will still be marked as maintenance even after update_status","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":false,"context_lines":[{"line_number":867,"context_line":"                self.on[\"resume\"].action, self._on_resume_action"},{"line_number":868,"context_line":"            )"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def _on_pause_action(self, event: ops.ActionEvent) -\u003e None:"},{"line_number":871,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":872,"context_line":"        for ph in self.pebble_handlers:"},{"line_number":873,"context_line":"            ph.stop_healthcheck(\"up\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"80889273_fed72d36","line":870,"range":{"start_line":870,"start_character":8,"end_line":870,"end_character":24},"in_reply_to":"f35dfcef_026efd38","updated":"2026-08-29 22:02:51.000000000","message":"Done","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"bd5585ac3ecb9b239dc052fb79871fbce100cbea","unresolved":true,"context_lines":[{"line_number":234,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":235,"context_line":"        \"\"\"Whether the service is paused.\"\"\""},{"line_number":236,"context_line":"        services_paused \u003d False"},{"line_number":237,"context_line":"        if self.supports_peer_relation:"},{"line_number":238,"context_line":"            services_paused \u003d self.peers.is_unit_paused()"},{"line_number":239,"context_line":"        return services_paused"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7fc14bb8_7654f4a8","line":237,"updated":"2026-02-04 15:00:15.000000000","message":"We agreed to use peer relation to ensure that we can durably now if the unit is paused.\n\nYou\u0027ve rightly noticed that not all units will support peer relation.\nIn that case we should fall back to local storage.\n\n\nIt is safe to use local storage in this instance, because the charms that do not support peer relation are machine charms, where the local storage won\u0027t go away for the same unit on a whim.","commit_id":"ddfca42dc390f5d908465151c21fbc8d6076cc51"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"418d850112d51bc86e5d8aef6b23464d4e74ba46","unresolved":true,"context_lines":[{"line_number":234,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":235,"context_line":"        \"\"\"Whether the service is paused.\"\"\""},{"line_number":236,"context_line":"        services_paused \u003d False"},{"line_number":237,"context_line":"        if self.supports_peer_relation:"},{"line_number":238,"context_line":"            services_paused \u003d self.peers.is_unit_paused()"},{"line_number":239,"context_line":"        return services_paused"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ffee89b8_232f4f3e","line":237,"in_reply_to":"7fc14bb8_7654f4a8","updated":"2026-03-11 20:49:26.000000000","message":"Implementation now is using the StoredState for machine charms","commit_id":"ddfca42dc390f5d908465151c21fbc8d6076cc51"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":235,"context_line":"        \"\"\"Whether the service is paused.\"\"\""},{"line_number":236,"context_line":"        services_paused \u003d False"},{"line_number":237,"context_line":"        if self.supports_peer_relation:"},{"line_number":238,"context_line":"            services_paused \u003d self.peers.is_unit_paused()"},{"line_number":239,"context_line":"        return services_paused"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f7c427c7_0592ae81","line":237,"in_reply_to":"ffee89b8_232f4f3e","updated":"2026-08-29 22:02:51.000000000","message":"Done","commit_id":"ddfca42dc390f5d908465151c21fbc8d6076cc51"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"39a86f55d0fcd176d69a398051238df2c92d1da3","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        # charms should handle the event if required"},{"line_number":494,"context_line":"        pass"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":497,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":498,"context_line":"        self.stop_services()"},{"line_number":499,"context_line":"        self.status.set("}],"source_content_type":"text/x-python","patch_set":16,"id":"3253d417_a631459c","line":496,"updated":"2026-08-21 07:21:59.000000000","message":"Can you send some action result for both pause/resume actions","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        # charms should handle the event if required"},{"line_number":494,"context_line":"        pass"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":497,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":498,"context_line":"        self.stop_services()"},{"line_number":499,"context_line":"        self.status.set("}],"source_content_type":"text/x-python","patch_set":16,"id":"83376e2d_c3df1cc7","line":496,"in_reply_to":"3253d417_a631459c","updated":"2026-08-29 22:02:51.000000000","message":"Addressed in PS17, pause/resume now return { \"ok\": true } on success and `even.fail` on failure.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[{"line_number":493,"context_line":"        # charms should handle the event if required"},{"line_number":494,"context_line":"        pass"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":497,"context_line":"        \"\"\"Handle pause action.\"\"\""},{"line_number":498,"context_line":"        self.stop_services()"},{"line_number":499,"context_line":"        self.status.set("}],"source_content_type":"text/x-python","patch_set":16,"id":"5d8caf08_6ffc695f","line":496,"in_reply_to":"83376e2d_c3df1cc7","updated":"2026-08-31 04:11:03.000000000","message":"Marked as resolved.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"39a86f55d0fcd176d69a398051238df2c92d1da3","unresolved":true,"context_lines":[{"line_number":506,"context_line":"    def _on_resume_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":507,"context_line":"        \"\"\"Handle resume action.\"\"\""},{"line_number":508,"context_line":"        self.configure_charm(event)"},{"line_number":509,"context_line":"        self._state.paused \u003d False"},{"line_number":510,"context_line":"        self.status.set(ActiveStatus(\"\"))"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def check_broken_relations("}],"source_content_type":"text/x-python","patch_set":16,"id":"2180315c_7da051ae","line":509,"updated":"2026-08-21 07:21:59.000000000","message":"Does the self._state.paused should be before configure_charm()? Is there a case where configure_charm() looks at _state.paused and returns without doing anything?","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":true,"context_lines":[{"line_number":506,"context_line":"    def _on_resume_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":507,"context_line":"        \"\"\"Handle resume action.\"\"\""},{"line_number":508,"context_line":"        self.configure_charm(event)"},{"line_number":509,"context_line":"        self._state.paused \u003d False"},{"line_number":510,"context_line":"        self.status.set(ActiveStatus(\"\"))"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def check_broken_relations("}],"source_content_type":"text/x-python","patch_set":16,"id":"702050c0_df30d5b0","line":509,"in_reply_to":"2180315c_7da051ae","updated":"2026-08-29 22:02:51.000000000","message":"Addressed in PS17, the paused state is cleared before configure_charm(), and the action fails if reconciliation does not complete.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[{"line_number":506,"context_line":"    def _on_resume_action(self, event: ops.framework.EventBase) -\u003e None:"},{"line_number":507,"context_line":"        \"\"\"Handle resume action.\"\"\""},{"line_number":508,"context_line":"        self.configure_charm(event)"},{"line_number":509,"context_line":"        self._state.paused \u003d False"},{"line_number":510,"context_line":"        self.status.set(ActiveStatus(\"\"))"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def check_broken_relations("}],"source_content_type":"text/x-python","patch_set":16,"id":"4bfe614f_4e2ce1db","line":509,"in_reply_to":"702050c0_df30d5b0","updated":"2026-08-31 04:11:03.000000000","message":"Marked as resolved.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"39a86f55d0fcd176d69a398051238df2c92d1da3","unresolved":true,"context_lines":[{"line_number":952,"context_line":"    wsgi_admin_script: str"},{"line_number":953,"context_line":"    wsgi_public_script: str"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":"    def __init__(self, framework):"},{"line_number":956,"context_line":"        super().__init__(framework)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"415b3ef9_eca57c17","line":955,"updated":"2026-08-21 07:21:59.000000000","message":"nit: not adding any value, just calling the base class __init__ which happens without this function","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":true,"context_lines":[{"line_number":952,"context_line":"    wsgi_admin_script: str"},{"line_number":953,"context_line":"    wsgi_public_script: str"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":"    def __init__(self, framework):"},{"line_number":956,"context_line":"        super().__init__(framework)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"a549847b_b9d300c6","line":955,"in_reply_to":"415b3ef9_eca57c17","updated":"2026-08-29 22:02:51.000000000","message":"Addressed in PS17, removed the `init` from the class.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[{"line_number":952,"context_line":"    wsgi_admin_script: str"},{"line_number":953,"context_line":"    wsgi_public_script: str"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":"    def __init__(self, framework):"},{"line_number":956,"context_line":"        super().__init__(framework)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"    def _on_pause_action(self, event: ops.framework.EventBase) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"676b3276_8a456eeb","line":955,"in_reply_to":"a549847b_b9d300c6","updated":"2026-08-31 04:11:03.000000000","message":"Marked as resolved.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"}],"ops-sunbeam/ops_sunbeam/container_handlers.py":[{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"eeacac79e45211a9767e0b17ed8a7347bfc00cf5","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        \"\"\""},{"line_number":315,"context_line":"        if self.is_service_paused():"},{"line_number":316,"context_line":"            self.status.set("},{"line_number":317,"context_line":"                MaintenanceStatus("},{"line_number":318,"context_line":"                    \"Paused. Use \u0027resume\u0027 action to resume normal service.\""},{"line_number":319,"context_line":"                )"},{"line_number":320,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":4,"id":"05024ba2_9cb69287","line":317,"updated":"2026-01-19 15:37:27.000000000","message":"Does the status behave well when a charm has multiple containers? (such as nova-k8s)","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"7225afe7be7790d54cfee367bf5f30443d095952","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        \"\"\""},{"line_number":315,"context_line":"        if self.is_service_paused():"},{"line_number":316,"context_line":"            self.status.set("},{"line_number":317,"context_line":"                MaintenanceStatus("},{"line_number":318,"context_line":"                    \"Paused. Use \u0027resume\u0027 action to resume normal service.\""},{"line_number":319,"context_line":"                )"},{"line_number":320,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":4,"id":"d7a1f0e6_dce974b7","line":317,"in_reply_to":"05024ba2_9cb69287","updated":"2026-01-27 20:50:59.000000000","message":"See the last patch. Now it\u0027s behaving as expected.\n\nThanks for catching it","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        \"\"\""},{"line_number":315,"context_line":"        if self.is_service_paused():"},{"line_number":316,"context_line":"            self.status.set("},{"line_number":317,"context_line":"                MaintenanceStatus("},{"line_number":318,"context_line":"                    \"Paused. Use \u0027resume\u0027 action to resume normal service.\""},{"line_number":319,"context_line":"                )"},{"line_number":320,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":4,"id":"fe46b6d3_6604c529","line":317,"in_reply_to":"d7a1f0e6_dce974b7","updated":"2026-08-29 22:02:51.000000000","message":"Done","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":35761,"name":"Guillaume Boutry","display_name":"gboutry","email":"guillaume.boutry@canonical.com","username":"gboutry"},"change_message_id":"eeacac79e45211a9767e0b17ed8a7347bfc00cf5","unresolved":true,"context_lines":[{"line_number":606,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":607,"context_line":"        \"\"\"Determine whether service is paused.\"\"\""},{"line_number":608,"context_line":"        container \u003d self.charm.unit.get_container(self.container_name)"},{"line_number":609,"context_line":"        check \u003d container.get_check(\"up\")"},{"line_number":610,"context_line":"        return check.status \u003d\u003d ops.pebble.CheckStatus.INACTIVE"}],"source_content_type":"text/x-python","patch_set":4,"id":"9716a00c_1b93db59","line":609,"updated":"2026-01-19 15:37:27.000000000","message":"What happens here if no `up` check is defined?","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":false,"context_lines":[{"line_number":606,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":607,"context_line":"        \"\"\"Determine whether service is paused.\"\"\""},{"line_number":608,"context_line":"        container \u003d self.charm.unit.get_container(self.container_name)"},{"line_number":609,"context_line":"        check \u003d container.get_check(\"up\")"},{"line_number":610,"context_line":"        return check.status \u003d\u003d ops.pebble.CheckStatus.INACTIVE"}],"source_content_type":"text/x-python","patch_set":4,"id":"7d21283a_7c4ba55a","line":609,"in_reply_to":"1ff48e31_e591b7d3","updated":"2026-08-29 22:02:51.000000000","message":"Done","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":33536,"name":"Gabriel Angelo Sgarbi Cocenza","display_name":"Gabriel Cocenza","email":"gabriel.cocenza@canonical.com","username":"gabrielcocenza"},"change_message_id":"418d850112d51bc86e5d8aef6b23464d4e74ba46","unresolved":true,"context_lines":[{"line_number":606,"context_line":"    def is_service_paused(self) -\u003e bool:"},{"line_number":607,"context_line":"        \"\"\"Determine whether service is paused.\"\"\""},{"line_number":608,"context_line":"        container \u003d self.charm.unit.get_container(self.container_name)"},{"line_number":609,"context_line":"        check \u003d container.get_check(\"up\")"},{"line_number":610,"context_line":"        return check.status \u003d\u003d ops.pebble.CheckStatus.INACTIVE"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ff48e31_e591b7d3","line":609,"in_reply_to":"9716a00c_1b93db59","updated":"2026-03-11 20:49:26.000000000","message":"Logic now is checking in the peer relation or in _state to check if is paused or not, so I think we are fine","commit_id":"f2435ac4add72f1f8ee1a9ab23fb012a1ed4e8d0"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"39a86f55d0fcd176d69a398051238df2c92d1da3","unresolved":true,"context_lines":[{"line_number":362,"context_line":"            plan \u003d container.get_plan()"},{"line_number":363,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":364,"context_line":"                logger.debug(f\"Stopping healthcheck for {check_name}\")"},{"line_number":365,"context_line":"                container.stop_checks(\"up\")"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":368,"context_line":"            logger.error(\"Not able to stop the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bda3e5f3_5cfeffb4","line":365,"updated":"2026-08-21 07:21:59.000000000","message":"container.stop_checks(check_name)","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            plan \u003d container.get_plan()"},{"line_number":363,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":364,"context_line":"                logger.debug(f\"Stopping healthcheck for {check_name}\")"},{"line_number":365,"context_line":"                container.stop_checks(\"up\")"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":368,"context_line":"            logger.error(\"Not able to stop the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"6c7ace6a_53c3e03e","line":365,"in_reply_to":"598e298b_2c549ae2","updated":"2026-08-31 04:11:03.000000000","message":"Marked as resolved.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":true,"context_lines":[{"line_number":362,"context_line":"            plan \u003d container.get_plan()"},{"line_number":363,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":364,"context_line":"                logger.debug(f\"Stopping healthcheck for {check_name}\")"},{"line_number":365,"context_line":"                container.stop_checks(\"up\")"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":368,"context_line":"            logger.error(\"Not able to stop the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"598e298b_2c549ae2","line":365,"in_reply_to":"bda3e5f3_5cfeffb4","updated":"2026-08-29 22:02:51.000000000","message":"Addressed in PS17.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"39a86f55d0fcd176d69a398051238df2c92d1da3","unresolved":true,"context_lines":[{"line_number":375,"context_line":"            plan \u003d container.get_plan()"},{"line_number":376,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":377,"context_line":"                logger.debug(f\"Starting healthcheck for {check_name}\")"},{"line_number":378,"context_line":"                container.start_checks(\"up\")"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":381,"context_line":"            logger.error(\"Not able to start the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9cd01435_d7105e70","line":378,"updated":"2026-08-21 07:21:59.000000000","message":"container.start_checks(check_name)","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"affe1e93aa8e8bfa07b2c921d3f2c326e947c6f3","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            plan \u003d container.get_plan()"},{"line_number":376,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":377,"context_line":"                logger.debug(f\"Starting healthcheck for {check_name}\")"},{"line_number":378,"context_line":"                container.start_checks(\"up\")"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":381,"context_line":"            logger.error(\"Not able to start the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"e26f6c97_599d0264","line":378,"in_reply_to":"7f2f825c_2813618a","updated":"2026-08-31 04:11:03.000000000","message":"Marked as resolved.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"},{"author":{"_account_id":38555,"name":"Iurii Kondrakov","display_name":"Yurii Kondrakov","email":"yurii.kondrakov@canonical.com","username":"deezzir"},"change_message_id":"60c6079d402e9907db373686ebe00bb6734875a5","unresolved":true,"context_lines":[{"line_number":375,"context_line":"            plan \u003d container.get_plan()"},{"line_number":376,"context_line":"            if plan.checks and check_name in plan.checks:"},{"line_number":377,"context_line":"                logger.debug(f\"Starting healthcheck for {check_name}\")"},{"line_number":378,"context_line":"                container.start_checks(\"up\")"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        except ops.pebble.ConnectionError as connect_error:"},{"line_number":381,"context_line":"            logger.error(\"Not able to start the %s healthcheck\", check_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7f2f825c_2813618a","line":378,"in_reply_to":"9cd01435_d7105e70","updated":"2026-08-29 22:02:51.000000000","message":"Addressed in PS17.","commit_id":"59026de5fbed5f77e3fc508613d28372a4dc5535"}]}
