Skip to content

Commit 727f514

Browse files
try reverting unit test and snap.py changes
1 parent 8dc9ead commit 727f514

File tree

2 files changed

+64
-80
lines changed

2 files changed

+64
-80
lines changed

src/snap.py

Lines changed: 57 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121

2222
logger = logging.getLogger(__name__)
2323

24+
_snap_name = charm_refresh.snap_name()
25+
_snap = snap_lib.SnapCache()[_snap_name]
26+
_installed_by_unit = pathlib.Path(
27+
"/var/snap", _snap_name, "common", "installed_by_mysql_router_charm_unit"
28+
)
2429
_UNIX_USERNAME = "snap_daemon"
2530

2631

@@ -33,60 +38,48 @@ def _raise_if_snap_installed_not_by_this_charm(*, unit: ops.Unit, model_uuid: st
3338
3439
Assumes snap is installed
3540
"""
36-
snap_name = charm_refresh.snap_name()
37-
installed_by_unit = pathlib.Path(
38-
"/var/snap", snap_name, "common", "installed_by_mysql_router_charm_unit"
39-
)
40-
4141
if not (
42-
installed_by_unit.exists()
43-
and installed_by_unit.read_text() == _unique_unit_name(unit=unit, model_uuid=model_uuid)
42+
_installed_by_unit.exists()
43+
and _installed_by_unit.read_text() == _unique_unit_name(unit=unit, model_uuid=model_uuid)
4444
):
4545
# The snap could be in use by another charm (e.g. MySQL Server charm, a different MySQL
4646
# Router charm).
4747
logger.debug(
48-
f"{installed_by_unit.exists() and installed_by_unit.read_text()=} "
49-
f"{_unique_unit_name(unit=unit, model_uuid=model_uuid)=}"
48+
f"{_installed_by_unit.exists() and _installed_by_unit.read_text()=} {_unique_unit_name(unit=unit, model_uuid=model_uuid)=}"
5049
)
51-
logger.error(f"{snap_name} snap already installed on machine. Installation aborted")
52-
raise Exception(f"Multiple {snap_name} snap installs not supported on one machine")
50+
logger.error(f"{_snap_name} snap already installed on machine. Installation aborted")
51+
raise Exception(f"Multiple {_snap_name} snap installs not supported on one machine")
5352

5453

5554
def uninstall():
5655
"""Uninstall snap if installed"""
57-
snap_name = charm_refresh.snap_name()
58-
snap = snap_lib.SnapCache()[snap_name]
59-
60-
logger.debug(f"Ensuring {snap_name=} is uninstalled")
61-
snap.ensure(state=snap_lib.SnapState.Absent)
62-
logger.debug(f"Ensured {snap_name=} is uninstalled")
56+
logger.debug(f"Ensuring {_snap_name=} is uninstalled")
57+
_snap.ensure(state=snap_lib.SnapState.Absent)
58+
logger.debug(f"Ensured {_snap_name=} is uninstalled")
6359

6460

6561
class _Path(pathlib.PosixPath, container.Path):
6662
def __new__(cls, *args, **kwargs):
6763
path = super().__new__(cls, *args, **kwargs)
68-
snap_name = charm_refresh.snap_name()
69-
7064
if args and isinstance(args[0], cls) and (parent_ := args[0]._container_parent):
7165
path._container_parent = parent_
7266
else:
7367
if str(path).startswith("/etc/mysqlrouter") or str(path).startswith(
7468
"/var/lib/mysqlrouter"
7569
):
76-
parent = f"/var/snap/{snap_name}/current"
70+
parent = f"/var/snap/{_snap_name}/current"
7771
elif str(path).startswith("/run/mysqlrouter") or str(path).startswith(
7872
"/var/log/mysqlrouter"
7973
):
80-
parent = f"/var/snap/{snap_name}/common"
74+
parent = f"/var/snap/{_snap_name}/common"
8175
elif str(path).startswith("/tmp"):
82-
parent = f"/tmp/snap-private-tmp/snap.{snap_name}"
76+
parent = f"/tmp/snap-private-tmp/snap.{_snap_name}"
8377
else:
8478
parent = None
8579
if parent:
8680
assert str(path).startswith("/")
8781
path = super().__new__(cls, parent, path.relative_to("/"), **kwargs)
8882
path._container_parent = parent
89-
9083
return path
9184

9285
def __truediv__(self, other):
@@ -135,51 +128,42 @@ class Snap(container.Container):
135128
_EXPORTER_SERVICE_NAME = "mysqlrouter-exporter"
136129

137130
def __init__(self, *, unit_name: str) -> None:
138-
self._snap_name = charm_refresh.snap_name()
139-
self._installed_by_unit = pathlib.Path(
140-
"/var/snap", self._snap_name, "common", "installed_by_mysql_router_charm_unit"
141-
)
142-
143131
super().__init__(
144-
mysql_router_command=f"{self._snap_name}.mysqlrouter",
145-
mysql_shell_command=f"{self._snap_name}.mysqlsh",
146-
mysql_router_password_command=f"{self._snap_name}.mysqlrouter-passwd",
132+
mysql_router_command=f"{_snap_name}.mysqlrouter",
133+
mysql_shell_command=f"{_snap_name}.mysqlsh",
134+
mysql_router_password_command=f"{_snap_name}.mysqlrouter-passwd",
147135
unit_name=unit_name,
148136
)
149137

150-
@property
151-
def _snap(self):
152-
return snap_lib.SnapCache()[self._snap_name]
153-
154138
@property
155139
def ready(self) -> bool:
156140
return True
157141

158142
@property
159143
def mysql_router_service_enabled(self) -> bool:
160-
return self._snap.services[self._SERVICE_NAME]["active"]
144+
return _snap.services[self._SERVICE_NAME]["active"]
161145

162146
@property
163147
def mysql_router_exporter_service_enabled(self) -> bool:
164-
return self._snap.services[self._EXPORTER_SERVICE_NAME]["active"]
148+
return _snap.services[self._EXPORTER_SERVICE_NAME]["active"]
165149

166150
def update_mysql_router_service(self, *, enabled: bool, tls: bool = None) -> None:
167151
super().update_mysql_router_service(enabled=enabled, tls=tls)
168152

169153
if tls:
170-
self._snap.set({"mysqlrouter.extra-options": f"--extra-config {self.tls_config_file}"})
154+
_snap.set({"mysqlrouter.extra-options": f"--extra-config {self.tls_config_file}"})
171155
else:
172-
self._snap.unset("mysqlrouter.extra-options")
156+
_snap.unset("mysqlrouter.extra-options")
173157

174-
router_is_running = self._snap.services[self._SERVICE_NAME]["active"]
158+
router_is_running = _snap.services[self._SERVICE_NAME]["active"]
175159

176160
if enabled:
177161
if router_is_running:
178-
self._snap.restart([self._SERVICE_NAME])
162+
_snap.restart([self._SERVICE_NAME])
179163
else:
180-
self._snap.start([self._SERVICE_NAME], enable=True)
164+
_snap.start([self._SERVICE_NAME], enable=True)
181165
else:
182-
self._snap.stop([self._SERVICE_NAME], disable=True)
166+
_snap.stop([self._SERVICE_NAME], disable=True)
183167

184168
def update_mysql_router_exporter_service(
185169
self,
@@ -201,42 +185,38 @@ def update_mysql_router_exporter_service(
201185
)
202186

203187
if enabled:
204-
self._snap.set({
188+
_snap.set({
205189
"mysqlrouter-exporter.listen-port": config.listen_port,
206190
"mysqlrouter-exporter.user": config.username,
207191
"mysqlrouter-exporter.password": config.password,
208192
"mysqlrouter-exporter.url": config.url,
209193
"mysqlrouter-exporter.service-name": self._unit_name.replace("/", "-"),
210194
})
211195
if tls:
212-
self._snap.set({
196+
_snap.set({
213197
"mysqlrouter.tls-cacert-path": certificate_authority_filename,
214198
"mysqlrouter.tls-cert-path": certificate_filename,
215199
"mysqlrouter.tls-key-path": key_filename,
216200
})
217201
else:
218-
self._snap.unset("mysqlrouter.tls-cacert-path")
219-
self._snap.unset("mysqlrouter.tls-cert-path")
220-
self._snap.unset("mysqlrouter.tls-key-path")
221-
self._snap.start([self._EXPORTER_SERVICE_NAME], enable=True)
202+
_snap.unset("mysqlrouter.tls-cacert-path")
203+
_snap.unset("mysqlrouter.tls-cert-path")
204+
_snap.unset("mysqlrouter.tls-key-path")
205+
_snap.start([self._EXPORTER_SERVICE_NAME], enable=True)
222206
else:
223-
self._snap.stop([self._EXPORTER_SERVICE_NAME], disable=True)
224-
self._snap.unset("mysqlrouter-exporter.listen-port")
225-
self._snap.unset("mysqlrouter-exporter.user")
226-
self._snap.unset("mysqlrouter-exporter.password")
227-
self._snap.unset("mysqlrouter-exporter.url")
228-
self._snap.unset("mysqlrouter-exporter.service-name")
229-
self._snap.unset("mysqlrouter.tls-cacert-path")
230-
self._snap.unset("mysqlrouter.tls-cert-path")
231-
self._snap.unset("mysqlrouter.tls-key-path")
232-
207+
_snap.stop([self._EXPORTER_SERVICE_NAME], disable=True)
208+
_snap.unset("mysqlrouter-exporter.listen-port")
209+
_snap.unset("mysqlrouter-exporter.user")
210+
_snap.unset("mysqlrouter-exporter.password")
211+
_snap.unset("mysqlrouter-exporter.url")
212+
_snap.unset("mysqlrouter-exporter.service-name")
213+
_snap.unset("mysqlrouter.tls-cacert-path")
214+
_snap.unset("mysqlrouter.tls-cert-path")
215+
_snap.unset("mysqlrouter.tls-key-path")
216+
217+
@staticmethod
233218
def install(
234-
self,
235-
*,
236-
unit: ops.Unit,
237-
model_uuid: str,
238-
snap_revision: str,
239-
refresh: charm_refresh.Machines,
219+
*, unit: ops.Unit, model_uuid: str, snap_revision: str, refresh: charm_refresh.Machines
240220
) -> None:
241221
"""Ensure snap is installed by this charm
242222
@@ -246,7 +226,7 @@ def install(
246226
Automatically retries if snap installation fails
247227
"""
248228
unique_unit_name = f"{model_uuid}_{unit.name}"
249-
if self._snap.present:
229+
if _snap.present:
250230
_raise_if_snap_installed_not_by_this_charm(unit=unit, model_uuid=model_uuid)
251231
return
252232
# Install snap
@@ -266,15 +246,16 @@ def _set_retry_status(_) -> None:
266246
reraise=True,
267247
):
268248
with attempt:
269-
self._snap.ensure(state=snap_lib.SnapState.Present, revision=snap_revision)
249+
_snap.ensure(state=snap_lib.SnapState.Present, revision=snap_revision)
270250
refresh.update_snap_revision()
271-
self._snap.hold()
272-
self._installed_by_unit.write_text(unique_unit_name)
273-
logger.debug(f"Wrote {unique_unit_name=} to {self._installed_by_unit.name=}")
251+
_snap.hold()
252+
_installed_by_unit.write_text(unique_unit_name)
253+
logger.debug(f"Wrote {unique_unit_name=} to {_installed_by_unit.name=}")
274254
logger.info(f"Installed snap revision {repr(snap_revision)}")
275255

256+
@classmethod
276257
def refresh(
277-
self,
258+
cls,
278259
*,
279260
unit: ops.Unit,
280261
model_uuid: str,
@@ -287,24 +268,24 @@ def refresh(
287268
288269
Does not automatically retry if snap installation fails
289270
"""
290-
if not self._snap.present:
291-
self.install(
271+
if not _snap.present:
272+
cls.install(
292273
unit=unit, model_uuid=model_uuid, snap_revision=snap_revision, refresh=refresh
293274
)
294275
return
295276
_raise_if_snap_installed_not_by_this_charm(unit=unit, model_uuid=model_uuid)
296277

297-
revision_before_refresh = self._snap.revision
278+
revision_before_refresh = _snap.revision
298279
if revision_before_refresh == snap_revision:
299280
raise ValueError(f"Cannot refresh snap; {snap_revision=} is already installed")
300281

301282
logger.info(f"Refreshing snap to revision {repr(snap_revision)}")
302283
unit.status = ops.MaintenanceStatus("Refreshing snap")
303284
try:
304-
self._snap.ensure(state=snap_lib.SnapState.Present, revision=snap_revision)
285+
_snap.ensure(state=snap_lib.SnapState.Present, revision=snap_revision)
305286
except (snap_lib.SnapError, snap_lib.SnapAPIError):
306287
logger.exception("Snap refresh failed")
307-
if self._snap.revision == revision_before_refresh:
288+
if _snap.revision == revision_before_refresh:
308289
raise container.RefreshFailed
309290
else:
310291
refresh.update_snap_revision()

tests/unit/conftest.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright 2023 Canonical Ltd.
22
# See LICENSE file for licensing details.
3-
43
import pathlib
54
import platform
65

@@ -9,6 +8,8 @@
98
import tomli
109
from charms.tempo_coordinator_k8s.v0.charm_tracing import charm_tracing_disabled
1110

11+
import snap
12+
1213

1314
@pytest.fixture(autouse=True)
1415
def disable_tenacity_retry(monkeypatch):
@@ -122,10 +123,12 @@ def restart(self, services: list[str] = []):
122123
if "mysqlrouter-exporter" in services:
123124
self.services["mysqlrouter-exporter"]["active"] = True
124125

125-
monkeypatch.setattr("snap.Snap._snap", Snap())
126+
monkeypatch.setattr(snap, "_snap", Snap())
126127

127-
# Use "null" for `json.loads()`
128-
monkeypatch.setattr("snap.Snap._run_command", lambda *args, **kwargs: "null")
128+
monkeypatch.setattr(
129+
"snap.Snap._run_command",
130+
lambda *args, **kwargs: "null", # Use "null" for `json.loads()`
131+
)
129132
monkeypatch.setattr("snap.Snap.install", lambda *args, **kwargs: None)
130133
monkeypatch.setattr("snap._Path.read_text", lambda *args, **kwargs: "")
131134
monkeypatch.setattr("snap._Path.write_text", lambda *args, **kwargs: None)

0 commit comments

Comments
 (0)