diff --git a/single_kernel_mongo/events/database.py b/single_kernel_mongo/events/database.py index e205c110..c3a46111 100644 --- a/single_kernel_mongo/events/database.py +++ b/single_kernel_mongo/events/database.py @@ -22,6 +22,7 @@ UpgradeInProgressError, ) from single_kernel_mongo.lib.charms.data_platform_libs.v0.data_interfaces import DatabaseProvides +from single_kernel_mongo.utils.event_helpers import defer_event_with_info_log if TYPE_CHECKING: from single_kernel_mongo.core.operator import OperatorProtocol @@ -64,6 +65,9 @@ def _on_relation_event(self, event: RelationEvent): """ relation_departing = False relation_changed = False + # TODO : Handle the Mongos VM case + # (https://github.com/canonical/mongos-operator/blob/6/edge/lib/charms/mongos/v0/mongos_client_interface.py) + # for interface unification. try: if not self.pass_hook_checks(event): logger.info(f"Skipping {type(event)}: Hook checks did not pass") @@ -79,7 +83,19 @@ def _on_relation_event(self, event: RelationEvent): if isinstance(event, RelationBrokenEvent): relation_departing = True # TODO: Checks - + if not self.dependent.state.has_departed_run(event.relation.id): + defer_event_with_info_log( + logger, + event, + "relation broken", + "must wait for relation departed hook to decide if relation should be removed.", + ) + return + if self.dependent.state.is_scaling_down(event.relation.id): + logger.info( + "Relation broken event due to scale down, do not proceed to remove users." + ) + return logger.info("Relation broken event due to relation removal, proceed to remove user.") if isinstance(event, RelationChangedEvent): relation_changed = True diff --git a/single_kernel_mongo/managers/mongo.py b/single_kernel_mongo/managers/mongo.py index bf541c12..5a835688 100644 --- a/single_kernel_mongo/managers/mongo.py +++ b/single_kernel_mongo/managers/mongo.py @@ -43,7 +43,7 @@ from single_kernel_mongo.workload.mongodb_workload import MongoDBWorkload if TYPE_CHECKING: - from single_kernel_mongo.abstract_charm import AbstractMongoCharm + from single_kernel_mongo.core.operator import OperatorProtocol logger = logging.getLogger(__name__) @@ -53,13 +53,13 @@ class MongoManager(Object): def __init__( self, - charm: AbstractMongoCharm, + dependent: OperatorProtocol, workload: MongoDBWorkload, state: CharmState, substrate: Substrates, ) -> None: - super().__init__(parent=charm, key="managers") - self.charm = charm + super().__init__(parent=dependent, key="managers") + self.charm = dependent.charm self.workload = workload self.state = state self.substrate = substrate @@ -179,6 +179,8 @@ def update_diff(self, relation: Relation): Args: relation: The relation to update the databag from. """ + if not self.charm.unit.is_leader(): + return data_interface = DatabaseProviderData( self.model, relation.name, @@ -274,6 +276,10 @@ def remove_user(self, relation: Relation): def update_app_relation_data(self, relation: Relation) -> None: """Helper function to update this application relation data.""" + if not self.charm.unit.is_leader(): + return + if not self.state.db_initialised: + return data_interface = DatabaseProviderData(self.model, relation.name) if not data_interface.fetch_relation_field(relation.id, "database"): return diff --git a/single_kernel_mongo/managers/mongodb_operator.py b/single_kernel_mongo/managers/mongodb_operator.py index 8d5ecac8..1364c262 100644 --- a/single_kernel_mongo/managers/mongodb_operator.py +++ b/single_kernel_mongo/managers/mongodb_operator.py @@ -97,7 +97,7 @@ def __init__(self, charm: AbstractMongoCharm): # Managers self.backup_manager = BackupManager(self.charm, self.substrate, self.state, container) self.tls_manager = TLSManager(self, self.workload, self.state, self.substrate) - self.mongo_manager = MongoManager(self.charm, self.workload, self.state, self.substrate) + self.mongo_manager = MongoManager(self, self.workload, self.state, self.substrate) # Event Handlers self.password_actions = PasswordActionEvents(self)