Skip to content

Commit 37026b7

Browse files
[LDAP] Early exit when snap not refreshed
1 parent 11da642 commit 37026b7

File tree

4 files changed

+58
-21
lines changed

4 files changed

+58
-21
lines changed

src/charm.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
from relations.postgresql_provider import PostgreSQLProvider
113113
from rotate_logs import RotateLogs
114114
from upgrade import PostgreSQLUpgrade, get_postgresql_dependencies_model
115-
from utils import new_password
115+
from utils import new_password, snap_refreshed
116116

117117
logger = logging.getLogger(__name__)
118118

@@ -753,7 +753,9 @@ def _start_stop_pgbackrest_service(self, event: HookEvent) -> None:
753753
self.backup.coordinate_stanza_fields()
754754

755755
if "exporter-started" not in self.unit_peer_data:
756-
self._setup_exporter()
756+
cache = snap.SnapCache()
757+
postgres_snap = cache[POSTGRESQL_SNAP_NAME]
758+
self._setup_exporter(postgres_snap)
757759

758760
def _update_new_unit_status(self) -> None:
759761
"""Update the status of a new unit that recently joined the cluster."""
@@ -1330,7 +1332,7 @@ def _restart_metrics_service(self) -> None:
13301332
return None
13311333

13321334
if snap_password != self.get_secret(APP_SCOPE, MONITORING_PASSWORD_KEY):
1333-
self._setup_exporter()
1335+
self._setup_exporter(postgres_snap)
13341336

13351337
def _restart_ldap_sync_service(self) -> None:
13361338
"""Restart the LDAP sync service in case any configuration changed."""
@@ -1352,37 +1354,26 @@ def _restart_ldap_sync_service(self) -> None:
13521354
return
13531355

13541356
if self.is_primary and self.is_ldap_enabled:
1355-
self._setup_ldap_sync()
1357+
self._setup_ldap_sync(postgres_snap)
13561358

1357-
def _setup_exporter(self) -> None:
1359+
def _setup_exporter(self, postgres_snap: snap.Snap) -> None:
13581360
"""Set up postgresql_exporter options."""
1359-
cache = snap.SnapCache()
1360-
postgres_snap = cache[POSTGRESQL_SNAP_NAME]
1361-
1362-
if postgres_snap.revision != next(
1363-
filter(lambda snap_package: snap_package[0] == POSTGRESQL_SNAP_NAME, SNAP_PACKAGES)
1364-
)[1]["revision"].get(platform.machine()):
1365-
logger.debug(
1366-
"Early exit _setup_exporter: snap was not refreshed to the right version yet"
1367-
)
1368-
return
1369-
13701361
postgres_snap.set({
13711362
"exporter.user": MONITORING_USER,
13721363
"exporter.password": self.get_secret(APP_SCOPE, MONITORING_PASSWORD_KEY),
13731364
})
1365+
13741366
if postgres_snap.services[MONITORING_SNAP_SERVICE]["active"] is False:
13751367
postgres_snap.start(services=[MONITORING_SNAP_SERVICE], enable=True)
13761368
else:
13771369
postgres_snap.restart(services=[MONITORING_SNAP_SERVICE])
1370+
13781371
self.unit_peer_data.update({"exporter-started": "True"})
13791372

1380-
def _setup_ldap_sync(self) -> None:
1373+
def _setup_ldap_sync(self, postgres_snap: snap.Snap) -> None:
13811374
"""Set up postgresql_ldap_sync options."""
1382-
cache = snap.SnapCache()
1383-
postgres_snap = cache[POSTGRESQL_SNAP_NAME]
1384-
13851375
ldap_params = self.get_ldap_parameters()
1376+
13861377
ldap_url = urlparse(ldap_params["ldapurl"])
13871378
ldap_host = ldap_url.hostname
13881379
ldap_port = ldap_url.port
@@ -2053,6 +2044,14 @@ def update_config(self, is_creating_backup: bool = False, no_peers: bool = False
20532044
})
20542045

20552046
self._handle_postgresql_restart_need(enable_tls)
2047+
2048+
cache = snap.SnapCache()
2049+
postgres_snap = cache[POSTGRESQL_SNAP_NAME]
2050+
2051+
if not snap_refreshed(postgres_snap.revision):
2052+
logger.debug("Early exit: snap was not refreshed to the right version yet")
2053+
return True
2054+
20562055
self._restart_metrics_service()
20572056
self._restart_ldap_sync_service()
20582057

src/utils.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33

44
"""A collection of utility functions that are used in the charm."""
55

6+
import platform
67
import secrets
78
import string
89

10+
from constants import (
11+
POSTGRESQL_SNAP_NAME,
12+
SNAP_PACKAGES,
13+
)
14+
915

1016
def new_password() -> str:
1117
"""Generate a random password string.
@@ -16,3 +22,16 @@ def new_password() -> str:
1622
choices = string.ascii_letters + string.digits
1723
password = "".join([secrets.choice(choices) for i in range(16)])
1824
return password
25+
26+
27+
def snap_refreshed(target_rev: str) -> bool:
28+
"""Whether the snap was refreshed to the target version."""
29+
arch = platform.machine()
30+
31+
for snap_package in SNAP_PACKAGES:
32+
snap_name = snap_package[0]
33+
snap_revs = snap_package[1]["revision"]
34+
if snap_name == POSTGRESQL_SNAP_NAME and target_rev != snap_revs.get(arch):
35+
return False
36+
37+
return True

tests/unit/test_charm.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,7 @@ def test_restart(harness):
12701270
def test_update_config(harness):
12711271
with (
12721272
patch("subprocess.check_output", return_value=b"C"),
1273+
patch("charm.snap_refreshed", return_value=True),
12731274
patch("charm.snap.SnapCache"),
12741275
patch(
12751276
"charm.PostgresqlOperatorCharm._handle_postgresql_restart_need"

tests/unit/test_utils.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
# See LICENSE file for licensing details.
33

44
import re
5+
from unittest.mock import patch
56

6-
from utils import new_password
7+
from constants import POSTGRESQL_SNAP_NAME
8+
from utils import new_password, snap_refreshed
79

810

911
def test_new_password():
@@ -16,3 +18,19 @@ def test_new_password():
1618
second_password = new_password()
1719
assert re.fullmatch("[a-zA-Z0-9\b]{16}$", second_password) is not None
1820
assert second_password != first_password
21+
22+
23+
def test_snap_refreshed():
24+
with patch(
25+
"utils.SNAP_PACKAGES",
26+
[(POSTGRESQL_SNAP_NAME, {"revision": {"aarch64": "100", "x86_64": "100"}})],
27+
):
28+
assert snap_refreshed("100") is True
29+
assert snap_refreshed("200") is False
30+
31+
with patch(
32+
"utils.SNAP_PACKAGES",
33+
[(POSTGRESQL_SNAP_NAME, {"revision": {}})],
34+
):
35+
assert snap_refreshed("100") is False
36+
assert snap_refreshed("200") is False

0 commit comments

Comments
 (0)