Support requesting a db name

This commit is contained in:
Liam Young 2021-10-14 12:17:54 +01:00
parent 9cc1aa54a6
commit 19ec143509
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 = sunbeam_rhandlers.DBHandler(
self, self,
db_svc, db_svc,
self.configure_charm) self.configure_charm,
[self.service_name.replace('-', '_')])
handlers.append(self.db) handlers.append(self.db)
if self.can_add_handler('ingress', handlers): if self.can_add_handler('ingress', handlers):
self.ingress = sunbeam_rhandlers.IngressHandler( self.ingress = sunbeam_rhandlers.IngressHandler(

View File

@ -137,13 +137,23 @@ class IngressHandler(RelationHandler):
class DBHandler(RelationHandler): class DBHandler(RelationHandler):
"""Handler for DB relations""" """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: def setup_event_handler(self) -> ops.charm.Object:
"""Configure event handlers for a MySQL relation.""" """Configure event handlers for a MySQL relation."""
logger.debug('Setting up DB event handler') logger.debug('Setting up DB event handler')
db = mysql.MySQLConsumer( db = mysql.MySQLConsumer(
self.charm, self.charm,
self.relation_name, self.relation_name,
{"mysql": ">=8"}) databases=self.databases)
_rname = self.relation_name.replace('-', '_') _rname = self.relation_name.replace('-', '_')
db_relation_event = getattr( db_relation_event = getattr(
self.charm.on, self.charm.on,

View File

@ -35,24 +35,69 @@ to get the relevant information from the relation data.
import json import json
import uuid import uuid
import logging import logging
from ops.relation import ConsumerBase from ops.relation import ConsumerBase
from ops.framework import (
StoredState,
EventBase,
ObjectEvents,
EventSource,
Object,
)
LIBID = "abcdef1234" # Will change when uploding the charm to charmhub LIBID = "abcdef1234" # Will change when uploding the charm to charmhub
LIBAPI = 1 LIBAPI = 1
LIBPATCH = 0 LIBPATCH = 0
logger = logging.getLogger(__name__) 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 MySQLConsumer lib class
""" """
def __init__(self, charm, name, consumes, multi=False): on = DatabaseServerEvents()
super().__init__(charm, name, consumes, multi)
def __init__(self, charm, relation_name: str, databases: list):
super().__init__(charm, relation_name)
self.charm = charm 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: def databases(self, rel_id=None) -> list:
""" """
@ -103,3 +148,11 @@ class MySQLConsumer(ConsumerBase):
dbs = json.loads(dbs) if dbs else [] dbs = json.loads(dbs) if dbs else []
dbs.append(db_name) dbs.append(db_name)
rel.data[self.charm.app]["databases"] = json.dumps(dbs) 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, db_rel_id,
'my-service') 'my-service')
requested_db = json.loads(rel_data['databases'])[0] 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): def test_contexts(self):
self.harness.set_leader() self.harness.set_leader()