Skip to content

Commit f3f3756

Browse files
authored
[DPE-6259] pgbackrest config perms (#1036)
* Remove `-u _daemon_` from the docs * Remove read access to pgbackrest conf file * Unit tests * Update libs
1 parent 9b7e8b3 commit f3f3756

File tree

4 files changed

+35
-16
lines changed

4 files changed

+35
-16
lines changed

lib/charms/glauth_k8s/v0/ldap.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def _on_ldap_requested(self, event: LdapRequestedEvent) -> None:
147147

148148
# Increment this PATCH version before using `charmcraft publish-lib` or reset
149149
# to 0 if you are raising the major API version
150-
LIBPATCH = 10
150+
LIBPATCH = 11
151151

152152
PYDEPS = ["pydantic"]
153153

@@ -256,13 +256,11 @@ def load(
256256
cls,
257257
charm: CharmBase,
258258
label: str,
259-
*,
260-
content: Optional[dict[str, str]] = None,
261-
) -> "Secret":
259+
) -> Optional["Secret"]:
262260
try:
263261
secret = charm.model.get_secret(label=label)
264262
except SecretNotFoundError:
265-
secret = charm.app.add_secret(label=label, content=content)
263+
return None
266264

267265
return Secret(secret)
268266

@@ -411,7 +409,8 @@ def _on_relation_broken(self, event: RelationBrokenEvent) -> None:
411409
self.charm,
412410
label=BIND_ACCOUNT_SECRET_LABEL_TEMPLATE.substitute(relation_id=event.relation.id),
413411
)
414-
secret.remove()
412+
if secret:
413+
secret.remove()
415414

416415
def get_bind_password(self, relation_id: int) -> Optional[str]:
417416
"""Retrieve the bind account password for a given integration."""
@@ -490,15 +489,27 @@ def _on_ldap_relation_changed(self, event: RelationChangedEvent) -> None:
490489
"""Handle the event emitted when the LDAP related information is ready."""
491490
provider_app = event.relation.app
492491

493-
if not event.relation.data.get(provider_app):
492+
if not (provider_data := event.relation.data.get(provider_app)):
494493
return
495494

496-
self.on.ldap_ready.emit(event.relation)
495+
provider_data = dict(provider_data)
496+
if self._load_provider_data(provider_data):
497+
self.on.ldap_ready.emit(event.relation)
497498

498499
def _on_ldap_relation_broken(self, event: RelationBrokenEvent) -> None:
499500
"""Handle the event emitted when the LDAP integration is broken."""
500501
self.on.ldap_unavailable.emit(event.relation)
501502

503+
def _load_provider_data(self, provider_data: dict) -> Optional[LdapProviderData]:
504+
if secret_id := provider_data.get("bind_password_secret"):
505+
secret = self.charm.model.get_secret(id=secret_id)
506+
provider_data["bind_password"] = secret.get_content().get("password")
507+
508+
try:
509+
return LdapProviderData(**provider_data)
510+
except ValidationError:
511+
return None
512+
502513
def consume_ldap_relation_data(
503514
self,
504515
/,
@@ -513,10 +524,10 @@ def consume_ldap_relation_data(
513524
return None
514525

515526
provider_data = dict(relation.data.get(relation.app))
516-
if secret_id := provider_data.get("bind_password_secret"):
517-
secret = self.charm.model.get_secret(id=secret_id)
518-
provider_data["bind_password"] = secret.get_content().get("password")
519-
return LdapProviderData(**provider_data) if provider_data else None
527+
if not provider_data:
528+
return None
529+
530+
return self._load_provider_data(provider_data)
520531

521532
def _is_relation_active(self, relation: Relation) -> bool:
522533
"""Whether the relation is active based on contained data."""

lib/charms/tls_certificates_interface/v4/tls_certificates.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
# Increment this PATCH version before using `charmcraft publish-lib` or reset
5454
# to 0 if you are raising the major API version
55-
LIBPATCH = 19
55+
LIBPATCH = 20
5656

5757
PYDEPS = [
5858
"cryptography>=43.0.0",
@@ -1232,7 +1232,7 @@ def __init__(
12321232
for event in refresh_events:
12331233
self.framework.observe(event, self._configure)
12341234

1235-
def _configure(self, _: EventBase):
1235+
def _configure(self, _: Optional[EventBase] = None):
12361236
"""Handle TLS Certificates Relation Data.
12371237
12381238
This method is called during any TLS relation event.
@@ -1286,6 +1286,14 @@ def _on_secret_expired(self, event: SecretExpiredEvent) -> None:
12861286
self._renew_certificate_request(csr)
12871287
event.secret.remove_all_revisions()
12881288

1289+
def sync(self) -> None:
1290+
"""Sync TLS Certificates Relation Data.
1291+
1292+
This method allows the requirer to sync the TLS certificates relation data
1293+
without waiting for the refresh events to be triggered.
1294+
"""
1295+
self._configure()
1296+
12891297
def renew_certificate(self, certificate: ProviderCertificate) -> None:
12901298
"""Request the renewal of the provided certificate."""
12911299
certificate_signing_request = certificate.certificate_signing_request

src/backups.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1260,7 +1260,7 @@ def _render_pgbackrest_conf_file(self) -> bool:
12601260
process_max=max(os.cpu_count() - 2, 1),
12611261
)
12621262
# Render pgBackRest config file.
1263-
self.charm._patroni.render_file(f"{PGBACKREST_CONF_PATH}/pgbackrest.conf", rendered, 0o644)
1263+
self.charm._patroni.render_file(f"{PGBACKREST_CONF_PATH}/pgbackrest.conf", rendered, 0o640)
12641264

12651265
# Render the logrotate configuration file.
12661266
with open("templates/pgbackrest.logrotate.j2") as file:

tests/unit/test_backups.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1744,7 +1744,7 @@ def test_render_pgbackrest_conf_file(harness, tls_ca_chain_filename):
17441744
call(
17451745
"/var/snap/charmed-postgresql/current/etc/pgbackrest/pgbackrest.conf",
17461746
expected_content,
1747-
0o644,
1747+
0o640,
17481748
),
17491749
call(
17501750
"/etc/logrotate.d/pgbackrest.logrotate",

0 commit comments

Comments
 (0)