Support requesting a db name

This commit is contained in:
Liam Young 2021-10-14 12:17:54 +01:00
parent 468343bfae
commit 03b442bcec
4 changed files with 73 additions and 8 deletions

View File

@ -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(

View File

@ -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,

View File

@ -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)

View File

@ -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()