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 = 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(
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user