Skip to content

Commit

Permalink
Prevent refresh by revision when the snap is already on that revision (
Browse files Browse the repository at this point in the history
  • Loading branch information
addyess authored May 24, 2024
1 parent 30e4f75 commit 522d54e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
9 changes: 6 additions & 3 deletions lib/charms/operator_libs_linux/v2/snap.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@

# Increment this PATCH version before using `charmcraft publish-lib` or reset
# to 0 if you are raising the major API version
LIBPATCH = 5
LIBPATCH = 6


# Regex to locate 7-bit C1 ANSI sequences
Expand Down Expand Up @@ -584,13 +584,16 @@ def ensure(
"Installing snap %s, revision %s, tracking %s", self._name, revision, channel
)
self._install(channel, cohort, revision)
else:
logger.info("The snap installation completed successfully")
elif revision is None or revision != self._revision:
# The snap is installed, but we are changing it (e.g., switching channels).
logger.info(
"Refreshing snap %s, revision %s, tracking %s", self._name, revision, channel
)
self._refresh(channel=channel, cohort=cohort, revision=revision, devmode=devmode)
logger.info("The snap installation completed successfully")
logger.info("The snap refresh completed successfully")
else:
logger.info("Refresh of snap %s was unnecessary", self._name)

self._update_snap_apps()
self._state = state
Expand Down
19 changes: 19 additions & 0 deletions tests/unit/test_snap.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,25 @@ def test_cohort(self, mock_subprocess):
universal_newlines=True,
)

@patch("charms.operator_libs_linux.v2.snap.subprocess.check_output")
def test_revision_doesnt_refresh(self, mock_check_output):
snap.add("curl", revision="233", cohort="+")
mock_check_output.assert_called_with(
[
"snap",
"install",
"curl",
'--revision="233"',
'--cohort="+"',
],
universal_newlines=True,
)

mock_check_output.reset_mock()
# Ensure that calling refresh with the same revision doesn't subprocess out.
snap.ensure("curl", "latest", classic=True, revision="233", cohort="+")
mock_check_output.assert_not_called()

@patch("charms.operator_libs_linux.v2.snap.subprocess.check_output")
def test_can_ensure_states(self, mock_subprocess):
mock_subprocess.return_value = 0
Expand Down

0 comments on commit 522d54e

Please sign in to comment.