Support requesting a db name
This commit is contained in:
parent
9cc1aa54a6
commit
19ec143509
@ -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(
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user