Merge lp:~gnuoy/charm-helpers/os-release-no-cache into lp:charm-helpers

Proposed by Liam Young
Status: Merged
Merged at revision: 648
Proposed branch: lp:~gnuoy/charm-helpers/os-release-no-cache
Merge into: lp:charm-helpers
Diff against target: 83 lines (+57/-1)
2 files modified
charmhelpers/contrib/openstack/utils.py (+13/-1)
tests/contrib/openstack/test_os_utils.py (+44/-0)
To merge this branch: bzr merge lp:~gnuoy/charm-helpers/os-release-no-cache
Reviewer Review Type Date Requested Status
James Page Approve
Review via email: mp+308033@code.launchpad.net
To post a comment you must log in.
648. By Liam Young

Allow the module cached version of os_release to be bypassed. Useful when doing a charm upgrade and the os_release has changed since the module was imported

649. By Liam Young

Move reseting os_release cache out into a seperate function as per mp feedback

650. By Liam Young

Fix missing full stop from comment

Revision history for this message
James Page (james-page) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmhelpers/contrib/openstack/utils.py'
2--- charmhelpers/contrib/openstack/utils.py 2016-10-07 15:20:20 +0000
3+++ charmhelpers/contrib/openstack/utils.py 2016-10-10 12:03:38 +0000
4@@ -410,14 +410,26 @@
5 os_rel = None
6
7
8-def os_release(package, base='essex'):
9+def reset_os_release():
10+ '''Unset the cached os_release version'''
11+ global os_rel
12+ os_rel = None
13+
14+
15+def os_release(package, base='essex', reset_cache=False):
16 '''
17 Returns OpenStack release codename from a cached global.
18+
19+ If reset_cache then unset the cached os_release version and return the
20+ freshly determined version.
21+
22 If the codename can not be determined from either an installed package or
23 the installation source, the earliest release supported by the charm should
24 be returned.
25 '''
26 global os_rel
27+ if reset_cache:
28+ reset_os_release()
29 if os_rel:
30 return os_rel
31 os_rel = (git_os_codename_install_source(config('openstack-origin-git')) or
32
33=== modified file 'tests/contrib/openstack/test_os_utils.py'
34--- tests/contrib/openstack/test_os_utils.py 2015-11-03 12:19:54 +0000
35+++ tests/contrib/openstack/test_os_utils.py 2016-10-10 12:03:38 +0000
36@@ -110,3 +110,47 @@
37 relation_id='neutron-plugin-api-subordinate:8',
38 relation_settings={'restart-trigger': 'uuid4'}
39 )
40+
41+ @mock.patch.object(utils, 'config')
42+ @mock.patch('charmhelpers.contrib.openstack.utils.'
43+ 'git_os_codename_install_source')
44+ @mock.patch('charmhelpers.contrib.openstack.utils.get_os_codename_package')
45+ @mock.patch('charmhelpers.contrib.openstack.utils.'
46+ 'get_os_codename_install_source')
47+ def test_os_release(self, mock_get_os_codename_install_source,
48+ mock_get_os_codename_package,
49+ mock_git_os_codename_install_source,
50+ mock_config):
51+ # Wipe the modules cached os_rel
52+ utils.os_rel = None
53+ mock_get_os_codename_install_source.return_value = None
54+ mock_get_os_codename_package.return_value = None
55+ mock_git_os_codename_install_source.return_value = None
56+ mock_config.return_value = 'cloud-pocket'
57+ self.assertEqual(utils.os_release('my-pkg'), 'essex')
58+ mock_get_os_codename_install_source.assert_called_once_with(
59+ 'cloud-pocket')
60+ mock_get_os_codename_package.assert_called_once_with(
61+ 'my-pkg', fatal=False)
62+ mock_git_os_codename_install_source.assert_called_once_with(
63+ 'cloud-pocket')
64+ # Next call to os_release should pickup cached version
65+ mock_get_os_codename_install_source.reset_mock()
66+ mock_get_os_codename_package.reset_mock()
67+ mock_git_os_codename_install_source.reset_mock()
68+ self.assertEqual(utils.os_release('my-pkg'), 'essex')
69+ self.assertFalse(mock_get_os_codename_install_source.called)
70+ self.assertFalse(mock_get_os_codename_package.called)
71+ self.assertFalse(mock_git_os_codename_install_source.called)
72+ # Call os_release and bypass cache
73+ mock_get_os_codename_install_source.reset_mock()
74+ mock_get_os_codename_package.reset_mock()
75+ mock_git_os_codename_install_source.reset_mock()
76+ self.assertEqual(utils.os_release('my-pkg', reset_cache=True),
77+ 'essex')
78+ mock_get_os_codename_install_source.assert_called_once_with(
79+ 'cloud-pocket')
80+ mock_get_os_codename_package.assert_called_once_with(
81+ 'my-pkg', fatal=False)
82+ mock_git_os_codename_install_source.assert_called_once_with(
83+ 'cloud-pocket')

Subscribers

People subscribed via source and target branches