From 19ec143509ad9358d7ac61847e09a2130ccb46f6 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Thu, 14 Oct 2021 12:17:54 +0100 Subject: [PATCH] Support requesting a db name --- .../advanced_sunbeam_openstack/charm.py | 3 +- .../relation_handlers.py | 12 +++- ops-sunbeam/lib/charms/mysql/v1/mysql.py | 63 +++++++++++++++++-- ops-sunbeam/unit_tests/test_core.py | 3 +- 4 files changed, 73 insertions(+), 8 deletions(-) diff --git a/ops-sunbeam/advanced_sunbeam_openstack/charm.py b/ops-sunbeam/advanced_sunbeam_openstack/charm.py index 7e9b4afa..f9ee63d6 100644 --- a/ops-sunbeam/advanced_sunbeam_openstack/charm.py +++ b/ops-sunbeam/advanced_sunbeam_openstack/charm.py @@ -89,7 +89,8 @@ class OSBaseOperatorCharm(ops.charm.CharmBase): self.db = sunbeam_rhandlers.DBHandler( self, db_svc, - self.configure_charm) + self.configure_charm, + [self.service_name.replace('-', '_')]) handlers.append(self.db) if self.can_add_handler('ingress', handlers): self.ingress = sunbeam_rhandlers.IngressHandler( diff --git a/ops-sunbeam/advanced_sunbeam_openstack/relation_handlers.py b/ops-sunbeam/advanced_sunbeam_openstack/relation_handlers.py index 81763530..d6c9b91d 100644 --- a/ops-sunbeam/advanced_sunbeam_openstack/relation_handlers.py +++ b/ops-sunbeam/advanced_sunbeam_openstack/relation_handlers.py @@ -137,13 +137,23 @@ class IngressHandler(RelationHandler): class DBHandler(RelationHandler): """Handler for DB relations""" + def __init__( + self, + charm: ops.charm.CharmBase, + relation_name: str, + callback_f, + databases=None + ): + self.databases = databases + super().__init__(charm, relation_name, callback_f) + def setup_event_handler(self) -> ops.charm.Object: """Configure event handlers for a MySQL relation.""" logger.debug('Setting up DB event handler') db = mysql.MySQLConsumer( self.charm, self.relation_name, - {"mysql": ">=8"}) + databases=self.databases) _rname = self.relation_name.replace('-', '_') db_relation_event = getattr( self.charm.on, diff --git a/ops-sunbeam/lib/charms/mysql/v1/mysql.py b/ops-sunbeam/lib/charms/mysql/v1/mysql.py index 6502bd22..84e14095 100644 --- a/ops-sunbeam/lib/charms/mysql/v1/mysql.py +++ b/ops-sunbeam/lib/charms/mysql/v1/mysql.py @@ -35,24 +35,69 @@ to get the relevant information from the relation data. import json import uuid import logging - from ops.relation import ConsumerBase +from ops.framework import ( + StoredState, + EventBase, + ObjectEvents, + EventSource, + Object, +) + LIBID = "abcdef1234" # Will change when uploding the charm to charmhub LIBAPI = 1 LIBPATCH = 0 logger = logging.getLogger(__name__) +class DatabaseConnectedEvent(EventBase): + """Database connected Event.""" -class MySQLConsumer(ConsumerBase): + pass + + +class DatabaseReadyEvent(EventBase): + """Database ready for use Event.""" + + pass + + +class DatabaseGoneAwayEvent(EventBase): + """Database relation has gone-away Event""" + + pass + + +class DatabaseServerEvents(ObjectEvents): + """Events class for `on`""" + + connected = EventSource(DatabaseConnectedEvent) + ready = EventSource(DatabaseReadyEvent) + goneaway = EventSource(DatabaseGoneAwayEvent) + + +class MySQLConsumer(Object): """ MySQLConsumer lib class """ - def __init__(self, charm, name, consumes, multi=False): - super().__init__(charm, name, consumes, multi) + on = DatabaseServerEvents() + + def __init__(self, charm, relation_name: str, databases: list): + super().__init__(charm, relation_name) self.charm = charm - self.relation_name = name + self.relation_name = relation_name + self.request_databases = databases + self.framework.observe( + self.charm.on[relation_name].relation_joined, + self._on_database_relation_joined, + ) + + def _on_database_relation_joined(self, event): + """AMQP relation joined.""" + logging.debug("DatabaseRequires on_joined") + self.on.connected.emit() + self.request_access(self.request_databases) def databases(self, rel_id=None) -> list: """ @@ -103,3 +148,11 @@ class MySQLConsumer(ConsumerBase): dbs = json.loads(dbs) if dbs else [] dbs.append(db_name) rel.data[self.charm.app]["databases"] = json.dumps(dbs) + + def request_access(self, databases: list) -> None: + """Request access to the AMQP server.""" + if self.model.unit.is_leader(): + logging.debug("Requesting AMQP user and vhost") + if databases: + rel = self.framework.model.get_relation(self.relation_name) + rel.data[self.charm.app]["databases"] = json.dumps(databases) diff --git a/ops-sunbeam/unit_tests/test_core.py b/ops-sunbeam/unit_tests/test_core.py index f45a6a3d..1a6fd317 100644 --- a/ops-sunbeam/unit_tests/test_core.py +++ b/ops-sunbeam/unit_tests/test_core.py @@ -145,7 +145,8 @@ class TestOSBaseOperatorAPICharm(test_utils.CharmTestCase): db_rel_id, 'my-service') requested_db = json.loads(rel_data['databases'])[0] - self.assertRegex(requested_db, r'^db_.*my_service$') + # self.assertRegex(requested_db, r'^db_.*my_service$') + self.assertEqual(requested_db, 'my_service') def test_contexts(self): self.harness.set_leader()