99import typing
1010
1111import ops
12- import psycopg2
1312from charms .nginx_ingress_integrator .v0 .nginx_route import require_nginx_route
1413from charms .traefik_k8s .v1 .ingress import IngressPerAppRequirer
1514from ops .charm import ActionEvent
1615from ops .main import main
1716
17+ import actions
1818from charm_state import CharmConfigInvalidError , CharmState
1919from constants import SYNAPSE_CONTAINER_NAME , SYNAPSE_PORT
20- from database_client import DatabaseClient
2120from database_observer import DatabaseObserver
22- from pebble import PebbleService
23- from synapse import CommandMigrateConfigError , ServerNameModifiedError , Synapse
21+ from pebble import PebbleService , PebbleServiceError
2422
2523logger = logging .getLogger (__name__ )
2624
@@ -41,8 +39,7 @@ def __init__(self, *args: typing.Any) -> None:
4139 except CharmConfigInvalidError as exc :
4240 self .model .unit .status = ops .BlockedStatus (exc .msg )
4341 return
44- self ._synapse = Synapse (charm_state = self ._charm_state )
45- self .pebble_service = PebbleService (synapse = self ._synapse )
42+ self .pebble_service = PebbleService (charm_state = self ._charm_state )
4643 # service-hostname is a required field so we're hardcoding to the same
4744 # value as service-name. service-hostname should be set via Nginx
4845 # Ingress Integrator charm config.
@@ -64,6 +61,7 @@ def __init__(self, *args: typing.Any) -> None:
6461 self .framework .observe (self .on .config_changed , self ._on_config_changed )
6562 self .framework .observe (self .on .reset_instance_action , self ._on_reset_instance_action )
6663 self .framework .observe (self .on .synapse_pebble_ready , self ._on_pebble_ready )
64+ self .framework .observe (self .on .register_user_action , self ._on_register_user_action )
6765
6866 def change_config (self , _ : ops .HookEvent ) -> None :
6967 """Change configuration."""
@@ -74,12 +72,7 @@ def change_config(self, _: ops.HookEvent) -> None:
7472 self .model .unit .status = ops .MaintenanceStatus ("Configuring Synapse" )
7573 try :
7674 self .pebble_service .change_config (container )
77- except (
78- CharmConfigInvalidError ,
79- CommandMigrateConfigError ,
80- ops .pebble .PathError ,
81- ServerNameModifiedError ,
82- ) as exc :
75+ except PebbleServiceError as exc :
8376 self .model .unit .status = ops .BlockedStatus (str (exc ))
8477 return
8578 self .model .unit .status = ops .ActiveStatus ()
@@ -120,24 +113,39 @@ def _on_reset_instance_action(self, event: ActionEvent) -> None:
120113 self .model .unit .status = ops .MaintenanceStatus ("Resetting Synapse instance" )
121114 self .pebble_service .reset_instance (container )
122115 datasource = self .database .get_relation_as_datasource ()
123- if datasource is not None :
124- logger .info ("Erase Synapse database" )
125- # Connecting to template1 to make it possible to erase the database.
126- # Otherwise PostgreSQL will prevent it if there are open connections.
127- db_client = DatabaseClient (datasource = datasource , alternative_database = "template1" )
128- db_client .erase ()
129- self ._synapse .execute_migrate_config (container )
130- logger .info ("Start Synapse database" )
116+ actions .reset_instance (
117+ container = container , charm_state = self ._charm_state , datasource = datasource
118+ )
119+ logger .info ("Start Synapse" )
131120 self .pebble_service .replan (container )
132121 results ["reset-instance" ] = True
133- except (psycopg2 . Error , ops . pebble . PathError , CommandMigrateConfigError ) as exc :
122+ except (PebbleServiceError , actions . ResetInstanceError ) as exc :
134123 self .model .unit .status = ops .BlockedStatus (str (exc ))
135124 event .fail (str (exc ))
136125 return
137- # results is a dict and set_results expects _SerializedData
138- event .set_results (results ) # type: ignore[arg-type]
126+ event .set_results (results )
139127 self .model .unit .status = ops .ActiveStatus ()
140128
129+ def _on_register_user_action (self , event : ActionEvent ) -> None :
130+ """Reset instance and report action result.
131+
132+ Args:
133+ event: Event triggering the reset instance action.
134+ """
135+ container = self .unit .get_container (SYNAPSE_CONTAINER_NAME )
136+ if not container .can_connect ():
137+ self .unit .status = ops .MaintenanceStatus ("Waiting for pebble" )
138+ return
139+ try :
140+ user = actions .register_user (
141+ container = container , username = event .params ["username" ], admin = event .params ["admin" ]
142+ )
143+ except actions .RegisterUserError as exc :
144+ event .fail (str (exc ))
145+ return
146+ results = {"register-user" : True , "user-password" : user .password }
147+ event .set_results (results )
148+
141149
142150if __name__ == "__main__" : # pragma: nocover
143151 main (SynapseCharm )
0 commit comments