Skip version caching for subordinate charms

Caching the charm OpenStack version will cause undesired behaviors
if the charm is a subordinate. The charm local cache is firstly
populated during the charm install. If the charm is a subordinate,
the version will remain the same regardless of future OpenStack
upgrades because today, the hook that updates the cache to the new
version in only called for principal charms.

Related-bug: #1949074
Change-Id: I76abbd29ca910fe4c4d62da09e2d2dd3b5c798a6
This commit is contained in:
Erlon R. Cruz 2023-03-21 16:45:30 -03:00
parent 7a58988354
commit fd042afdf1
2 changed files with 29 additions and 2 deletions

View File

@ -1,4 +1,5 @@
import charmhelpers.contrib.openstack.utils as os_utils import charmhelpers.contrib.openstack.utils as os_utils
import charmhelpers.core.hookenv as hookenv
import charmhelpers.core.unitdata as unitdata import charmhelpers.core.unitdata as unitdata
import charms.reactive as reactive import charms.reactive as reactive
@ -97,7 +98,15 @@ def make_default_select_release_handler():
that it doesn't need to keep going and getting it from the package that it doesn't need to keep going and getting it from the package
information. information.
""" """
release_version = unitdata.kv().get(OPENSTACK_RELEASE_KEY, None) release_version = None
# Using the cached OpenStack version will cause undesired behaviors
# if the charm is a subordinate. The charm local cache is firstly
# populated during the charm install and after that, only during the
# openstack upgrades. If the charm is a subordinate, the version will
# always remain the same.
if not hookenv.is_subordinate():
release_version = unitdata.kv().get(OPENSTACK_RELEASE_KEY, None)
if release_version is None: if release_version is None:
try: try:
# First make an attempt of determining release from a charm # First make an attempt of determining release from a charm
@ -125,7 +134,11 @@ def make_default_select_release_handler():
pkg = 'dummy-package' pkg = 'dummy-package'
release_version = os_utils.os_release( release_version = os_utils.os_release(
pkg, source_key=singleton.source_config_key) pkg, source_key=singleton.source_config_key)
unitdata.kv().set(OPENSTACK_RELEASE_KEY, release_version)
# Skip caching the release if the charm is a subordinate.
if not hookenv.is_subordinate():
unitdata.kv().set(OPENSTACK_RELEASE_KEY, release_version)
return release_version return release_version

View File

@ -113,6 +113,7 @@ class TestDefaults(BaseOpenStackCharmTest):
singleton.source_config_key = 'fake-config-key' singleton.source_config_key = 'fake-config-key'
singleton.get_os_codename_package.return_value = None singleton.get_os_codename_package.return_value = None
self.patch_object(chm, 'get_charm_instance', return_value=singleton) self.patch_object(chm, 'get_charm_instance', return_value=singleton)
self.patch_object(chm.hookenv, 'is_subordinate', return_value=False)
# set a release # set a release
kv.get.return_value = 'one' kv.get.return_value = 'one'
release = h.map['function']() release = h.map['function']()
@ -153,6 +154,19 @@ class TestDefaults(BaseOpenStackCharmTest):
self.assertEqual(release, 'four') self.assertEqual(release, 'four')
singleton.get_os_codename_package.assert_called_once_with( singleton.get_os_codename_package.assert_called_once_with(
mock.ANY, mock.ANY, apt_cache_sufficient=True) mock.ANY, mock.ANY, apt_cache_sufficient=True)
# Test subordinate charm
kv.reset_mock()
kv.get.return_value = None
singleton.get_os_codename_package.reset_mock()
singleton.get_os_codename_package.return_value = 'five'
chm.hookenv.is_subordinate.reset_mock()
chm.hookenv.is_subordinate.return_value = True
self.os_release.reset_mock()
self.os_release.return_value = 'five'
release = h.map['function']()
self.assertEqual(release, 'five')
kv.set.assert_not_called()
kv.get.assert_not_called()
def test_default_select_package_type_handler(self): def test_default_select_package_type_handler(self):
self.assertIn('charm.default-select-package-type', self.assertIn('charm.default-select-package-type',