Skip to content

Commit c5e8b96

Browse files
author
Amanda H. L. de Andrade Katz
authored
Add Synapse NGINX pebble ready event handler (#108)
1 parent b5d0278 commit c5e8b96

9 files changed

Lines changed: 55 additions & 41 deletions

File tree

src-docs/charm.py.md

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Unit that this execution is responsible for.
7575

7676
---
7777

78-
<a href="../src/charm.py#L101"><img align="right" style="float:right;" src="https://img.shields.io/badge/-source-cccccc?style=flat-square"></a>
78+
<a href="../src/charm.py#L95"><img align="right" style="float:right;" src="https://img.shields.io/badge/-source-cccccc?style=flat-square"></a>
7979

8080
### <kbd>function</kbd> `change_config`
8181

@@ -87,7 +87,7 @@ Change configuration.
8787

8888
---
8989

90-
<a href="../src/charm.py#L211"><img align="right" style="float:right;" src="https://img.shields.io/badge/-source-cccccc?style=flat-square"></a>
90+
<a href="../src/charm.py#L218"><img align="right" style="float:right;" src="https://img.shields.io/badge/-source-cccccc?style=flat-square"></a>
9191

9292
### <kbd>function</kbd> `get_admin_access_token`
9393

@@ -102,16 +102,4 @@ Get admin access token.
102102
**Returns:**
103103
admin access token or None if fails.
104104

105-
---
106-
107-
<a href="../src/charm.py#L91"><img align="right" style="float:right;" src="https://img.shields.io/badge/-source-cccccc?style=flat-square"></a>
108-
109-
### <kbd>function</kbd> `replan_nginx`
110-
111-
```python
112-
replan_nginx() → None
113-
```
114-
115-
Replan NGINX.
116-
117105

src/charm.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,42 +82,40 @@ def __init__(self, *args: typing.Any) -> None:
8282
self._mjolnir = Mjolnir(self, charm_state=self._charm_state)
8383
self.framework.observe(self.on.config_changed, self._on_config_changed)
8484
self.framework.observe(self.on.reset_instance_action, self._on_reset_instance_action)
85-
self.framework.observe(self.on.synapse_pebble_ready, self._on_pebble_ready)
85+
self.framework.observe(self.on.synapse_pebble_ready, self._on_synapse_pebble_ready)
86+
self.framework.observe(
87+
self.on.synapse_nginx_pebble_ready, self._on_synapse_nginx_pebble_ready
88+
)
8689
self.framework.observe(self.on.register_user_action, self._on_register_user_action)
8790
self.framework.observe(
8891
self.on.promote_user_admin_action, self._on_promote_user_admin_action
8992
)
9093
self.framework.observe(self.on.anonymize_user_action, self._on_anonymize_user_action)
9194

92-
def replan_nginx(self) -> None:
93-
"""Replan NGINX."""
94-
container = self.unit.get_container(synapse.SYNAPSE_NGINX_CONTAINER_NAME)
95-
if not container.can_connect():
96-
self.unit.status = ops.MaintenanceStatus("Waiting for pebble")
97-
return
98-
self.model.unit.status = ops.MaintenanceStatus("Configuring Synapse NGINX")
99-
self.pebble_service.replan_nginx(container)
100-
self.model.unit.status = ops.ActiveStatus()
101-
10295
def change_config(self) -> None:
10396
"""Change configuration."""
10497
container = self.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
10598
if not container.can_connect():
106-
self.unit.status = ops.MaintenanceStatus("Waiting for pebble")
99+
self.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
107100
return
108101
self.model.unit.status = ops.MaintenanceStatus("Configuring Synapse")
109102
try:
110103
self.pebble_service.change_config(container)
111104
except PebbleServiceError as exc:
112105
self.model.unit.status = ops.BlockedStatus(str(exc))
113106
return
114-
self.replan_nginx()
107+
container = self.unit.get_container(synapse.SYNAPSE_NGINX_CONTAINER_NAME)
108+
if not container.can_connect():
109+
self.unit.status = ops.MaintenanceStatus("Waiting for Synapse NGINX pebble")
110+
return
111+
self.pebble_service.replan_nginx(container)
112+
self.model.unit.status = ops.ActiveStatus()
115113

116114
def _set_workload_version(self) -> None:
117115
"""Set workload version with Synapse version."""
118116
container = self.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
119117
if not container.can_connect():
120-
self.unit.status = ops.MaintenanceStatus("Waiting for pebble")
118+
self.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
121119
return
122120
try:
123121
synapse_version = synapse.get_version()
@@ -130,10 +128,18 @@ def _on_config_changed(self, _: ops.HookEvent) -> None:
130128
self.change_config()
131129
self._set_workload_version()
132130

133-
def _on_pebble_ready(self, _: ops.HookEvent) -> None:
134-
"""Handle pebble ready event."""
131+
def _on_synapse_pebble_ready(self, _: ops.HookEvent) -> None:
132+
"""Handle synapse pebble ready event."""
135133
self.change_config()
136134

135+
def _on_synapse_nginx_pebble_ready(self, _: ops.HookEvent) -> None:
136+
"""Handle synapse nginx pebble ready event."""
137+
container = self.unit.get_container(synapse.SYNAPSE_NGINX_CONTAINER_NAME)
138+
if not container.can_connect():
139+
self.unit.status = ops.MaintenanceStatus("Waiting for Synapse NGINX pebble")
140+
return
141+
self.pebble_service.replan_nginx(container)
142+
137143
def _on_reset_instance_action(self, event: ActionEvent) -> None:
138144
"""Reset instance and report action result.
139145

src/database_observer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def _change_config(self) -> None:
6262
"""Change the configuration."""
6363
container = self._charm.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
6464
if not container.can_connect() or self._pebble_service is None:
65-
self._charm.unit.status = ops.MaintenanceStatus("Waiting for pebble")
65+
self._charm.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
6666
return
6767
try:
6868
self._pebble_service.change_config(container)

src/mjolnir.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def _on_collect_status(self, event: ops.CollectStatusEvent) -> None:
7373
return
7474
container = self._charm.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
7575
if not container.can_connect():
76-
self._charm.unit.status = ops.MaintenanceStatus("Waiting for pebble")
76+
self._charm.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
7777
return
7878
mjolnir_service = container.get_services(MJOLNIR_SERVICE_NAME)
7979
if mjolnir_service:
@@ -151,7 +151,7 @@ def enable_mjolnir(self, admin_access_token: str) -> None:
151151
"""
152152
container = self._charm.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
153153
if not container.can_connect():
154-
self._charm.unit.status = ops.MaintenanceStatus("Waiting for pebble")
154+
self._charm.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
155155
return
156156
self._charm.model.unit.status = ops.MaintenanceStatus("Configuring Mjolnir")
157157
mjolnir_user = actions.register_user(

src/saml_observer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _enable_saml(self) -> None:
5454
"""Enable SAML."""
5555
container = self._charm.unit.get_container(synapse.SYNAPSE_CONTAINER_NAME)
5656
if not container.can_connect() or self._pebble_service is None:
57-
self._charm.unit.status = ops.MaintenanceStatus("Waiting for pebble")
57+
self._charm.unit.status = ops.MaintenanceStatus("Waiting for Synapse pebble")
5858
return
5959
try:
6060
self._pebble_service.enable_saml(container)

src/synapse/workload.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def check_nginx_ready() -> ops.pebble.CheckDict:
121121
check = Check(CHECK_NGINX_READY_NAME)
122122
check.override = "replace"
123123
check.level = "ready"
124-
check.tcp = {"port": SYNAPSE_NGINX_PORT}
124+
check.http = {"url": f"http://localhost:{SYNAPSE_NGINX_PORT}/health"}
125125
return check.to_dict()
126126

127127

@@ -339,9 +339,10 @@ def enable_federation_domain_whitelist(container: ops.Container, charm_state: Ch
339339
config = container.pull(SYNAPSE_CONFIG_PATH).read()
340340
current_yaml = yaml.safe_load(config)
341341
if charm_state.synapse_config.federation_domain_whitelist is not None:
342-
current_yaml[
343-
"federation_domain_whitelist"
344-
] = charm_state.synapse_config.federation_domain_whitelist.split(",")
342+
current_yaml["federation_domain_whitelist"] = [
343+
item.strip()
344+
for item in charm_state.synapse_config.federation_domain_whitelist.split(",")
345+
]
345346
container.push(SYNAPSE_CONFIG_PATH, yaml.safe_dump(current_yaml))
346347
except ops.pebble.PathError as exc:
347348
raise WorkloadError(str(exc)) from exc

tests/integration/conftest.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,11 @@ async def grafana_app_fixture(
270270
"""Deploy grafana."""
271271
async with ops_test.fast_forward():
272272
app = await model.deploy(
273-
"grafana-k8s",
273+
grafana_app_name,
274274
application_name=grafana_app_name,
275275
channel="stable",
276+
series="focal",
277+
revision=82, # last one compatible with Juju 2
276278
trust=True,
277279
)
278280
await model.wait_for_idle(raise_on_blocked=True, status=ACTIVE_STATUS_NAME)
@@ -295,9 +297,11 @@ async def deploy_prometheus_fixture(
295297
"""Deploy prometheus."""
296298
async with ops_test.fast_forward():
297299
app = await model.deploy(
298-
"prometheus-k8s",
300+
prometheus_app_name,
299301
application_name=prometheus_app_name,
300302
channel="stable",
303+
series="focal",
304+
revision=129, # last one compatible with Juju 2
301305
trust=True,
302306
)
303307
await model.wait_for_idle(raise_on_blocked=True, status=ACTIVE_STATUS_NAME)

tests/unit/test_charm.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,3 +418,18 @@ def test_disable_password_config_is_called(
418418
harness.charm.pebble_service.change_config(container=MagicMock())
419419

420420
disable_password_config_mock.assert_called_once()
421+
422+
423+
def test_nginx_replan(harness: Harness, monkeypatch: pytest.MonkeyPatch) -> None:
424+
"""
425+
arrange: start the Synapse charm, mock replan_nginx call.
426+
act: fire that NGINX container is ready.
427+
assert: Pebble Service replan NGINX is called.
428+
"""
429+
harness.begin()
430+
replan_nginx_mock = MagicMock()
431+
monkeypatch.setattr(harness.charm.pebble_service, "replan_nginx", replan_nginx_mock)
432+
433+
harness.container_pebble_ready(synapse.SYNAPSE_NGINX_CONTAINER_NAME)
434+
435+
replan_nginx_mock.assert_called_once()

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ commands =
115115
[testenv:integration]
116116
description = Run integration tests
117117
deps =
118-
juju==2.9.42.4
118+
juju==2.9.45.0
119119
pytest
120120
pytest-asyncio
121121
pytest-operator

0 commit comments

Comments
 (0)