Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement DEPRECATED mysql-shared interface #49

Merged
merged 28 commits into from
Jul 3, 2023
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
07709b8
Implement DEPRECATED `mysql-shared` interface
carlcsaposs-canonical Jun 28, 2023
37d054d
update comments
carlcsaposs-canonical Jun 28, 2023
e5941d7
try enabling `integration-shared-db` test
carlcsaposs-canonical Jun 28, 2023
f427247
Delete attribute to try fixing ops RuntimeError
carlcsaposs-canonical Jun 29, 2023
183887b
move peer app databag to property
carlcsaposs-canonical Jun 29, 2023
013706a
make deprecated relation interface ops.Object to register event handlers
carlcsaposs-canonical Jun 29, 2023
f6b049e
fix integration test
carlcsaposs-canonical Jun 29, 2023
29604bd
fix assertion
carlcsaposs-canonical Jun 29, 2023
b4a0ecf
raise incompletedatabag exception if units empty
carlcsaposs-canonical Jun 29, 2023
6e4f747
format
carlcsaposs-canonical Jun 29, 2023
8adc950
update libjuju & fix channels
carlcsaposs-canonical Jun 29, 2023
c02f0cb
exclude shared-db jammy
carlcsaposs-canonical Jun 29, 2023
4d07477
don't raise on blocked
carlcsaposs-canonical Jun 29, 2023
eabd452
fixup! don't raise on blocked
carlcsaposs-canonical Jun 29, 2023
5804951
update
carlcsaposs-canonical Jun 29, 2023
600e485
fixup
carlcsaposs-canonical Jun 29, 2023
abe96de
keystone yoga/stable
carlcsaposs-canonical Jun 29, 2023
28e9b57
format
carlcsaposs-canonical Jun 29, 2023
f633d0d
delete databag fix
carlcsaposs-canonical Jun 29, 2023
d9629b8
add log prefix
carlcsaposs-canonical Jun 29, 2023
0caa40a
format
carlcsaposs-canonical Jun 29, 2023
d7a5123
fixup
carlcsaposs-canonical Jun 29, 2023
b30f4dc
revert ci
carlcsaposs-canonical Jun 30, 2023
62b0f88
fix comment
carlcsaposs-canonical Jun 30, 2023
c9541a1
arg order
carlcsaposs-canonical Jun 30, 2023
069bcbe
fix
carlcsaposs-canonical Jun 30, 2023
5abb5ed
Rename endpoint from `deprecated-shared-db` to `shared-db`
carlcsaposs-canonical Jun 30, 2023
e538aa0
Update wait_timeout
carlcsaposs-canonical Jul 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ summary: |
Enables effective access to a MySQL cluster with Group Replication.
subordinate: true
provides:
# TODO: re-implement legacy relation
# shared-db:
# interface: mysql-shared
# scope: container
database:
interface: mysql_client
scope: container
# DEPRECATED shared-db: Legacy "mysql-shared" interface
deprecated-shared-db:
carlcsaposs-canonical marked this conversation as resolved.
Show resolved Hide resolved
interface: mysql-shared
scope: container
requires:
backend-database:
interface: mysql_client
Expand All @@ -29,7 +29,10 @@ requires:
juju-info:
interface: juju-info
scope: container
peers:
# TODO TLS VM: re-enable peer relation
#peers:
# mysql-router-peers:
# interface: mysql_router_peers
# DEPRECATED shared-db: Workaround for legacy "mysql-shared" interface using unit databags instead of app databag
deprecated-shared-db-credentials:
interface: _deprecated_shared_db_peers
5 changes: 5 additions & 0 deletions src/machine_charm.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import ops

import abstract_charm
import relations.database_providers_wrapper
import snap
import socket_workload

Expand All @@ -23,6 +24,10 @@ class MachineSubordinateRouterCharm(abstract_charm.MySQLRouterCharm):

def __init__(self, *args) -> None:
super().__init__(*args)
# DEPRECATED shared-db: Enable legacy "mysql-shared" interface
del self._database_provides
self._database_provides = relations.database_providers_wrapper.RelationEndpoint(self)

self._authenticated_workload_type = socket_workload.AuthenticatedSocketWorkload
self.framework.observe(self.on.install, self._on_install)
self.framework.observe(self.on.remove, self._on_remove)
Expand Down
82 changes: 82 additions & 0 deletions src/relations/database_providers_wrapper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Copyright 2023 Canonical Ltd.
# See LICENSE file for licensing details.

"""Relation(s) to one or more application charms

Wraps modern interface (database_provides.py) and DEPRECATED legacy interface
(deprecated_shared_db_database_provides.py)
"""

import typing

import ops

import mysql_shell
import relations.database_provides

# `as` used to fix type checking circular import
import relations.deprecated_shared_db_database_provides as deprecated_shared_db_database_provides

if typing.TYPE_CHECKING:
import abstract_charm


class RelationEndpoint:
"""Relation endpoints for application charm(s)

Wraps modern interface (database_provides.py) endpoint and DEPRECATED legacy interface
(deprecated_shared_db_database_provides.py) endpoint
"""

def __init__(self, charm_: "abstract_charm.MySQLRouterCharm") -> None:
self._database_provides = relations.database_provides.RelationEndpoint(charm_)
self._deprecated_shared_db = deprecated_shared_db_database_provides.RelationEndpoint(
charm_
)

def reconcile_users(
self,
*,
event,
router_read_write_endpoint: str,
router_read_only_endpoint: str,
shell: mysql_shell.Shell,
) -> None:
"""Create requested users and delete inactive users.

When the relation to the MySQL charm is broken, the MySQL charm will delete all users
created by this charm. Therefore, this charm does not need to delete users when that
relation is broken.
"""
self._database_provides.reconcile_users(
event=event,
router_read_write_endpoint=router_read_write_endpoint,
router_read_only_endpoint=router_read_only_endpoint,
shell=shell,
)
self._deprecated_shared_db.reconcile_users(event=event, shell=shell)

def delete_all_databags(self) -> None:
"""Remove connection information from all databags.

Called when relation with MySQL is breaking

When the MySQL relation is re-established, it could be a different MySQL cluster—new users
will need to be created.
"""
self._database_provides.delete_all_databags()
self._deprecated_shared_db.delete_all_databags()

def get_status(self, event) -> typing.Optional[ops.StatusBase]:
"""Report non-active status."""
database_provides_status = self._database_provides.get_status(event)
deprecated_shared_db_status = self._deprecated_shared_db.get_status(event)
if (
isinstance(deprecated_shared_db_status, ops.ActiveStatus)
and isinstance(database_provides_status, ops.BlockedStatus)
and database_provides_status.message.startswith("Missing relation:")
):
return deprecated_shared_db_status
if database_provides_status:
return database_provides_status
return deprecated_shared_db_status
Loading
Loading