Skip to content

Commit acc0d26

Browse files
authored
[DPE-3202] Architecture specific snap revision (#345)
* Arm tweaks * Bump snap revision * Snap version bump * Tweak plugins test * Architecture based snap revision * Try to set channel * Revert conftest * Remove string revision check
1 parent c2017c7 commit acc0d26

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

src/charm.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import logging
88
import os
9+
import platform
910
import subprocess
1011
import time
1112
from typing import Dict, List, Literal, Optional, Set, get_args
@@ -965,12 +966,9 @@ def _setup_exporter(self) -> None:
965966
cache = snap.SnapCache()
966967
postgres_snap = cache[POSTGRESQL_SNAP_NAME]
967968

968-
if (
969-
postgres_snap.revision
970-
!= list(
971-
filter(lambda snap_package: snap_package[0] == POSTGRESQL_SNAP_NAME, SNAP_PACKAGES)
972-
)[0][1]["revision"]
973-
):
969+
if postgres_snap.revision != list(
970+
filter(lambda snap_package: snap_package[0] == POSTGRESQL_SNAP_NAME, SNAP_PACKAGES)
971+
)[0][1]["revision"].get(platform.machine()):
974972
logger.debug(
975973
"Early exit _setup_exporter: snap was not refreshed to the right version yet"
976974
)
@@ -1274,9 +1272,15 @@ def _install_snap_packages(self, packages: List[str], refresh: bool = False) ->
12741272
snap_package = snap_cache[snap_name]
12751273

12761274
if not snap_package.present or refresh:
1277-
if snap_version.get("revision"):
1275+
if revision := snap_version.get("revision"):
1276+
try:
1277+
revision = revision[platform.machine()]
1278+
except Exception:
1279+
logger.error("Unavailable snap architecture %s", platform.machine())
1280+
raise
1281+
channel = snap_version.get("channel", "")
12781282
snap_package.ensure(
1279-
snap.SnapState.Latest, revision=snap_version["revision"]
1283+
snap.SnapState.Latest, revision=revision, channel=channel
12801284
)
12811285
snap_package.hold()
12821286
else:

src/constants.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
# Snap constants.
3333
PGBACKREST_EXECUTABLE = "charmed-postgresql.pgbackrest"
3434
POSTGRESQL_SNAP_NAME = "charmed-postgresql"
35-
SNAP_PACKAGES = [(POSTGRESQL_SNAP_NAME, {"revision": "96"})]
35+
SNAP_PACKAGES = [
36+
(POSTGRESQL_SNAP_NAME, {"revision": {"aarch64": "97", "x86_64": "98"}, "channel": "14/stable"})
37+
]
3638

3739
SNAP_COMMON_PATH = "/var/snap/charmed-postgresql/common"
3840
SNAP_CURRENT_PATH = "/var/snap/charmed-postgresql/current"

tests/unit/test_charm.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright 2021 Canonical Ltd.
22
# See LICENSE file for licensing details.
33
import logging
4+
import platform
45
import subprocess
56
import unittest
67
from unittest.mock import MagicMock, Mock, PropertyMock, mock_open, patch
@@ -1025,31 +1026,56 @@ def test_install_snap_packages(self, _snap_cache):
10251026
_snap_cache.reset_mock()
10261027
_snap_package.reset_mock()
10271028
_snap_package.ensure.side_effect = None
1028-
self.charm._install_snap_packages([("postgresql", {"revision": 42})])
1029+
self.charm._install_snap_packages(
1030+
[("postgresql", {"revision": {platform.machine(): "42"}})]
1031+
)
10291032
_snap_cache.assert_called_once_with()
10301033
_snap_cache.return_value.__getitem__.assert_called_once_with("postgresql")
1031-
_snap_package.ensure.assert_called_once_with(snap.SnapState.Latest, revision=42)
1034+
_snap_package.ensure.assert_called_once_with(
1035+
snap.SnapState.Latest, revision="42", channel=""
1036+
)
10321037
_snap_package.hold.assert_called_once_with()
10331038

10341039
# Test with refresh
10351040
_snap_cache.reset_mock()
10361041
_snap_package.reset_mock()
10371042
_snap_package.present = True
1038-
self.charm._install_snap_packages([("postgresql", {"revision": 42})], refresh=True)
1043+
self.charm._install_snap_packages(
1044+
[("postgresql", {"revision": {platform.machine(): "42"}, "channel": "latest/test"})],
1045+
refresh=True,
1046+
)
10391047
_snap_cache.assert_called_once_with()
10401048
_snap_cache.return_value.__getitem__.assert_called_once_with("postgresql")
1041-
_snap_package.ensure.assert_called_once_with(snap.SnapState.Latest, revision=42)
1049+
_snap_package.ensure.assert_called_once_with(
1050+
snap.SnapState.Latest, revision="42", channel="latest/test"
1051+
)
10421052
_snap_package.hold.assert_called_once_with()
10431053

10441054
# Test without refresh
10451055
_snap_cache.reset_mock()
10461056
_snap_package.reset_mock()
1047-
self.charm._install_snap_packages([("postgresql", {"revision": 42})])
1057+
self.charm._install_snap_packages(
1058+
[("postgresql", {"revision": {platform.machine(): "42"}})]
1059+
)
10481060
_snap_cache.assert_called_once_with()
10491061
_snap_cache.return_value.__getitem__.assert_called_once_with("postgresql")
10501062
_snap_package.ensure.assert_not_called()
10511063
_snap_package.hold.assert_not_called()
10521064

1065+
# test missing architecture
1066+
_snap_cache.reset_mock()
1067+
_snap_package.reset_mock()
1068+
_snap_package.present = True
1069+
with self.assertRaises(KeyError):
1070+
self.charm._install_snap_packages(
1071+
[("postgresql", {"revision": {"missingarch": "42"}})],
1072+
refresh=True,
1073+
)
1074+
_snap_cache.assert_called_once_with()
1075+
_snap_cache.return_value.__getitem__.assert_called_once_with("postgresql")
1076+
assert not _snap_package.ensure.called
1077+
assert not _snap_package.hold.called
1078+
10531079
@patch(
10541080
"subprocess.check_call",
10551081
side_effect=[None, subprocess.CalledProcessError(1, "fake command")],

0 commit comments

Comments
 (0)