From 13d4dc9c859536f0da2991e8e3df33193242cce4 Mon Sep 17 00:00:00 2001 From: shayancanonical <99665202+shayancanonical@users.noreply.github.com> Date: Sun, 31 Mar 2024 14:59:57 -0400 Subject: [PATCH] Create config for database name (#27) * Create config for database name * Address lint warnings --- config.yaml | 4 ++++ src/charm.py | 23 ++++++++++++++++++----- src/literals.py | 1 - src/relations/legacy_mysql.py | 8 +++++--- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/config.yaml b/config.yaml index cdf972a..f86068d 100644 --- a/config.yaml +++ b/config.yaml @@ -6,3 +6,7 @@ options: description: "Whether to auto start continuous writes on relation events." type: boolean default: true + database_name: + description: "Name of database to direct continuous writes to" + type: string + default: "continuous_writes_database" diff --git a/src/charm.py b/src/charm.py index aabe76b..ca40f6c 100755 --- a/src/charm.py +++ b/src/charm.py @@ -16,6 +16,7 @@ from typing import Dict, Optional from charms.data_platform_libs.v0.data_interfaces import DatabaseRequires +from ops import EventBase from ops.charm import ActionEvent, CharmBase from ops.main import main from ops.model import ActiveStatus, Relation, WaitingStatus @@ -24,7 +25,6 @@ from connector import MySQLConnector # isort: skip from literals import ( CONTINUOUS_WRITE_TABLE_NAME, - DATABASE_NAME, DATABASE_RELATION, LEGACY_MYSQL_RELATION, PEER, @@ -45,6 +45,7 @@ def __init__(self, *args): # Charm events self.framework.observe(self.on.start, self._on_start) + self.framework.observe(self.on.config_changed, self._on_config_changed) self.framework.observe(self.on[PEER].relation_changed, self._on_peer_relation_changed) self.framework.observe(self.on.update_status, self._on_update_status) @@ -75,7 +76,9 @@ def __init__(self, *args): ) # Database related events - self.database = DatabaseRequires(self, "database", DATABASE_NAME) + self.database = DatabaseRequires( + self, relation_name="database", database_name=self.database_name + ) self.framework.observe( getattr(self.database.on, "database_created"), self._on_database_created ) @@ -119,6 +122,11 @@ def unit_peer_data(self) -> Dict: return self._peers.data[self.unit] + @property + def database_name(self) -> str: + """Returns the database name for the continuous writes.""" + return self.config["database_name"] + @property def _database_config(self): """Returns the database config to use to connect to the MySQL cluster.""" @@ -144,7 +152,7 @@ def _database_config(self): config = { "user": username, "password": password, - "database": DATABASE_NAME, + "database": self.database_name, } if endpoints.startswith("file://"): config["unix_socket"] = endpoints[7:] @@ -221,7 +229,7 @@ def _max_written_value(self) -> int: with MySQLConnector(self._database_config) as cursor: cursor.execute( - f"SELECT MAX(number) FROM `{DATABASE_NAME}`.`{CONTINUOUS_WRITE_TABLE_NAME}`;" + f"SELECT MAX(number) FROM `{self.database_name}`.`{CONTINUOUS_WRITE_TABLE_NAME}`;" ) return cursor.fetchone()[0] @@ -268,6 +276,10 @@ def _write_random_value(self) -> str: # ============== # Handlers # ============== + def _on_config_changed(self, event: EventBase) -> None: + """Handle config changes, especially database_name.""" + logger.warning("Please unrelate and re-relate after updating the database_name config") + def _on_start(self, _) -> None: """Handle the start event.""" self.unit.set_workload_version("0.0.2") @@ -275,6 +287,7 @@ def _on_start(self, _) -> None: self.unit.status = ActiveStatus() else: self.unit.status = WaitingStatus() + self.app_peer_data["initialized"] = "true" def _on_clear_continuous_writes_action(self, _) -> None: """Handle the clear continuous writes action event.""" @@ -284,7 +297,7 @@ def _on_clear_continuous_writes_action(self, _) -> None: self._stop_continuous_writes() with MySQLConnector(self._database_config) as cursor: cursor.execute( - f"DROP TABLE IF EXISTS `{DATABASE_NAME}`.`{CONTINUOUS_WRITE_TABLE_NAME}`;" + f"DROP TABLE IF EXISTS `{self.database_name}`.`{CONTINUOUS_WRITE_TABLE_NAME}`;" ) def _on_start_continuous_writes_action(self, _) -> None: diff --git a/src/literals.py b/src/literals.py index 866ce08..2acbe5e 100644 --- a/src/literals.py +++ b/src/literals.py @@ -4,7 +4,6 @@ """Test application literals.""" CONTINUOUS_WRITE_TABLE_NAME = "data" -DATABASE_NAME = "continuous_writes_database" DATABASE_RELATION = "database" LEGACY_MYSQL_RELATION = "mysql" # MariaDB legacy relation PEER = "application-peers" diff --git a/src/relations/legacy_mysql.py b/src/relations/legacy_mysql.py index 5ce5ebc..6f3d737 100644 --- a/src/relations/legacy_mysql.py +++ b/src/relations/legacy_mysql.py @@ -5,7 +5,7 @@ import logging -from literals import DATABASE_NAME, LEGACY_MYSQL_RELATION +from literals import LEGACY_MYSQL_RELATION from ops import Object, RelationChangedEvent from ops.model import BlockedStatus @@ -59,8 +59,10 @@ def _on_relation_joined(self, event): return database_name = relation_data["database"] - if database_name != DATABASE_NAME: - logger.error(f"Database name must be set to `{DATABASE_NAME}`. Modify the test.") + if database_name != self.charm.database_name: + logger.error( + f"Database name must be set to `{self.charm.database_name}`. Modify the test." + ) self.charm.unit.status = BlockedStatus("Wrong database name") return