Merge lp:~ddellav/charms/trusty/glance/upgrade-action into lp:~openstack-charmers-archive/charms/trusty/glance/next

Proposed by David Della Vecchia on 2015-07-22
Status: Merged
Merged at revision: 133
Proposed branch: lp:~ddellav/charms/trusty/glance/upgrade-action
Merge into: lp:~openstack-charmers-archive/charms/trusty/glance/next
Diff against target: 250 lines (+201/-1)
6 files modified
actions.yaml (+2/-0)
actions/openstack_upgrade.py (+62/-0)
config.yaml (+10/-0)
hooks/glance_relations.py (+1/-1)
unit_tests/test_actions_openstack_upgrade.py (+117/-0)
unit_tests/test_glance_relations.py (+9/-0)
To merge this branch: bzr merge lp:~ddellav/charms/trusty/glance/upgrade-action
Reviewer Review Type Date Requested Status
Corey Bryant Approve on 2015-08-14
James Page 2015-07-22 Needs Fixing on 2015-08-04
Review via email: mp+265592@code.launchpad.net

Description of the Change

This branch adds the openstack_upgrade action, action_managed_upgrade config option, and related unit_tests to the glance charm.

This action will upgrade the charm to the openstack version specified in the openstack-origin config option provided the action_managed_upgrade config option is set to a truthy value (it defaults to False to maintain backwards compatibility).

If the charm was installed from source (git_install) the upgrade action will gracefully fail.

The openstack_upgrade action utilizes the pre-existing do_openstack_upgrade function code so the unit-tests added only cover the possible action execution paths and not the full upgrade process (as that is covered elsewhere).

To post a comment you must log in.

charm_lint_check #6635 glance-next for ddellav mp265592
    LINT FAIL: lint-test failed

LINT Results (max last 2 lines):
make: *** [lint] Error 1
ERROR:root:Make target returned non-zero.

Full lint test output: http://paste.ubuntu.com/11922190/
Build: http://10.245.162.77:8080/job/charm_lint_check/6635/

charm_unit_test #6262 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6262/

charm_lint_check #6637 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/6637/

charm_unit_test #6264 glance-next for ddellav mp265592
    UNIT FAIL: unit-test failed

UNIT Results (max last 2 lines):
make: *** [test] Error 1
ERROR:root:Make target returned non-zero.

Full unit test output: http://paste.ubuntu.com/11922470/
Build: http://10.245.162.77:8080/job/charm_unit_test/6264/

charm_lint_check #6638 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/6638/

charm_unit_test #6265 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6265/

charm_amulet_test #5265 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [functional_test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/11922596/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5265/

charm_amulet_test #5267 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [functional_test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/11922845/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5267/

charm_amulet_test #5268 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [functional_test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/11922911/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5268/

charm_amulet_test #5269 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/11923590/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5269/

charm_lint_check #6733 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/6733/

charm_unit_test #6360 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6360/

charm_amulet_test #5275 glance-next for ddellav mp265592
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5275/

James Page (james-page) :
review: Needs Fixing

charm_lint_check #7485 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7485/

charm_unit_test #6942 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6942/

charm_amulet_test #5607 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [functional_test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/11998771/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5607/

James Page (james-page) :
review: Needs Fixing
James Page (james-page) wrote :

I note some amulet tests failures as well - pls take a look

charm_lint_check #7583 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7583/

charm_unit_test #7023 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/7023/

charm_amulet_test #5645 glance-next for ddellav mp265592
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5645/

charm_lint_check #7738 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7738/

charm_unit_test #7165 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/7165/

charm_amulet_test #5677 glance-next for ddellav mp265592
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [functional_test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/12049127/
Build: http://10.245.162.77:8080/job/charm_amulet_test/5677/

charm_lint_check #7863 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7863/

charm_unit_test #7284 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/7284/

charm_amulet_test #5700 glance-next for ddellav mp265592
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5700/

Corey Bryant (corey.bryant) wrote :

Looking good DDV. I deployed your charm and successfully ran a few tests including an upgrade. I did see a formatting issue with the output of 'juju get' (see below). Also while you're in there you might want to make the invalid config message more explicit as mentioned below..

Corey Bryant (corey.bryant) wrote :

One more minor suggestion in the config.yaml description

136. By David Della Vecchia on 2015-08-14

Fixes formatting issue in config.yaml. Updated error message output to be more specific and helpful in action code.

charm_lint_check #8046 glance-next for ddellav mp265592
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/8046/

charm_unit_test #7457 glance-next for ddellav mp265592
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/7457/

Corey Bryant (corey.bryant) wrote :

Looks and works good, and all of James' and my comments have been handled. I think this is ready to land. Thanks DDV!

review: Approve

charm_amulet_test #5790 glance-next for ddellav mp265592
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5790/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'actions.yaml'
2--- actions.yaml 2015-03-21 01:36:16 +0000
3+++ actions.yaml 2015-08-14 15:55:41 +0000
4@@ -1,2 +1,4 @@
5 git-reinstall:
6 description: Reinstall glance from the openstack-origin-git repositories.
7+openstack-upgrade:
8+ description: Perform openstack upgrades. Config option action-managed-upgrade must be set to True.
9
10=== added symlink 'actions/openstack-upgrade'
11=== target is u'openstack_upgrade.py'
12=== added file 'actions/openstack_upgrade.py'
13--- actions/openstack_upgrade.py 1970-01-01 00:00:00 +0000
14+++ actions/openstack_upgrade.py 2015-08-14 15:55:41 +0000
15@@ -0,0 +1,62 @@
16+#!/usr/bin/python
17+import sys
18+import traceback
19+
20+sys.path.append('hooks/')
21+
22+from charmhelpers.core.hookenv import (
23+ action_set,
24+ action_fail,
25+ config
26+)
27+
28+from glance_relations import config_changed
29+
30+from charmhelpers.contrib.openstack.utils import (
31+ juju_log,
32+ git_install_requested,
33+ openstack_upgrade_available
34+)
35+
36+from glance_utils import (
37+ do_openstack_upgrade,
38+ register_configs
39+)
40+
41+
42+CONFIGS = register_configs()
43+
44+
45+def openstack_upgrade():
46+ """Upgrade packages to config-set Openstack version.
47+
48+ If the charm was installed from source we cannot upgrade it.
49+ For backwards compatibility a config flag must be set for this
50+ code to run, otherwise a full service level upgrade will fire
51+ on config-changed."""
52+
53+ if git_install_requested():
54+ action_set({'outcome': 'installed from source, skipped upgrade.'})
55+ else:
56+ if openstack_upgrade_available('glance-common'):
57+ if config('action-managed-upgrade'):
58+ juju_log('Upgrading OpenStack release')
59+
60+ try:
61+ do_openstack_upgrade(CONFIGS)
62+ action_set({'outcome': 'success, upgrade completed.'})
63+ except:
64+ action_set({'outcome': 'upgrade failed, see traceback.'})
65+ action_set({'traceback': traceback.format_exc()})
66+ action_fail('do_openstack_upgrade resulted in an '
67+ 'unexpected error')
68+
69+ config_changed()
70+ else:
71+ action_set({'outcome': 'action-managed-upgrade config is '
72+ 'False, skipped upgrade.'})
73+ else:
74+ action_set({'outcome': 'no upgrade available.'})
75+
76+if __name__ == '__main__':
77+ openstack_upgrade()
78
79=== modified file 'config.yaml'
80--- config.yaml 2015-07-10 14:14:20 +0000
81+++ config.yaml 2015-08-14 15:55:41 +0000
82@@ -233,3 +233,13 @@
83 description: |
84 A comma-separated list of nagios servicegroups.
85 If left empty, the nagios_context will be used as the servicegroup
86+ action-managed-upgrade:
87+ type: boolean
88+ default: False
89+ description: |
90+ If True enables openstack upgrades for this charm via juju actions.
91+ You will still need to set the config variable for the openstack version
92+ but instead of an upgrade running automatically across all units, it will
93+ wait for you to execute the openstack-upgrade action for this charm on each
94+ unit. If False it will revert to existing behavior of upgrading all units on
95+ config change.
96
97=== modified file 'hooks/glance_relations.py'
98--- hooks/glance_relations.py 2015-05-11 07:28:22 +0000
99+++ hooks/glance_relations.py 2015-08-14 15:55:41 +0000
100@@ -333,7 +333,7 @@
101 if git_install_requested():
102 if config_value_changed('openstack-origin-git'):
103 git_install(config('openstack-origin-git'))
104- else:
105+ elif not config('action-managed-upgrade'):
106 if openstack_upgrade_available('glance-common'):
107 juju_log('Upgrading OpenStack release')
108 do_openstack_upgrade(CONFIGS)
109
110=== added file 'unit_tests/test_actions_openstack_upgrade.py'
111--- unit_tests/test_actions_openstack_upgrade.py 1970-01-01 00:00:00 +0000
112+++ unit_tests/test_actions_openstack_upgrade.py 2015-08-14 15:55:41 +0000
113@@ -0,0 +1,117 @@
114+from mock import patch
115+import os
116+
117+os.environ['JUJU_UNIT_NAME'] = 'glance'
118+
119+with patch('glance_utils.register_configs') as register_configs:
120+ import openstack_upgrade
121+
122+from test_utils import (
123+ CharmTestCase
124+)
125+
126+TO_PATCH = [
127+ 'config'
128+]
129+
130+
131+class TestGlanceUpgradeActions(CharmTestCase):
132+
133+ def setUp(self):
134+ super(TestGlanceUpgradeActions, self).setUp(openstack_upgrade,
135+ TO_PATCH)
136+ self.config.side_effect = self.test_config.get
137+
138+ @patch.object(openstack_upgrade, 'action_set')
139+ @patch.object(openstack_upgrade, 'action_fail')
140+ @patch.object(openstack_upgrade, 'do_openstack_upgrade')
141+ @patch.object(openstack_upgrade, 'openstack_upgrade_available')
142+ @patch.object(openstack_upgrade, 'config_changed')
143+ @patch('charmhelpers.contrib.openstack.utils.config')
144+ def test_openstack_upgrade(self, _config, config_changed,
145+ openstack_upgrade_available,
146+ do_openstack_upgrade, action_fail,
147+ action_set):
148+ _config.return_value = None
149+ openstack_upgrade_available.return_value = True
150+
151+ self.test_config.set('action-managed-upgrade', True)
152+
153+ openstack_upgrade.openstack_upgrade()
154+
155+ self.assertTrue(do_openstack_upgrade.called)
156+ self.assertTrue(config_changed.called)
157+ self.assertFalse(action_fail.called)
158+
159+ @patch.object(openstack_upgrade, 'action_set')
160+ @patch.object(openstack_upgrade, 'do_openstack_upgrade')
161+ @patch.object(openstack_upgrade, 'openstack_upgrade_available')
162+ @patch.object(openstack_upgrade, 'config_changed')
163+ @patch('charmhelpers.contrib.openstack.utils.config')
164+ def test_openstack_upgrade_not_configured(self, _config, config_changed,
165+ openstack_upgrade_available,
166+ do_openstack_upgrade,
167+ action_set):
168+ _config.return_value = None
169+ openstack_upgrade_available.return_value = True
170+
171+ openstack_upgrade.openstack_upgrade()
172+
173+ msg = ('action-managed-upgrade config is False, skipped upgrade.')
174+
175+ action_set.assert_called_with({'outcome': msg})
176+ self.assertFalse(do_openstack_upgrade.called)
177+
178+ @patch.object(openstack_upgrade, 'action_set')
179+ @patch.object(openstack_upgrade, 'do_openstack_upgrade')
180+ @patch.object(openstack_upgrade, 'openstack_upgrade_available')
181+ @patch.object(openstack_upgrade, 'config_changed')
182+ @patch('charmhelpers.contrib.openstack.utils.config')
183+ def test_openstack_upgrade_git_install(self, _config, config_changed,
184+ openstack_upgrade_available,
185+ do_openstack_upgrade,
186+ action_set):
187+
188+ self.test_config.set('action-managed-upgrade', True)
189+ self.test_config.set('openstack-origin-git', True)
190+
191+ openstack_upgrade.openstack_upgrade()
192+
193+ msg = ('installed from source, skipped upgrade.')
194+ action_set.assert_called_with({'outcome': msg})
195+ self.assertFalse(do_openstack_upgrade.called)
196+
197+ @patch.object(openstack_upgrade, 'action_set')
198+ @patch.object(openstack_upgrade, 'action_fail')
199+ @patch.object(openstack_upgrade, 'do_openstack_upgrade')
200+ @patch.object(openstack_upgrade, 'openstack_upgrade_available')
201+ @patch.object(openstack_upgrade, 'config_changed')
202+ @patch('traceback.format_exc')
203+ @patch('charmhelpers.contrib.openstack.utils.config')
204+ def test_openstack_upgrade_exception(self, _config, format_exc,
205+ config_changed,
206+ openstack_upgrade_available,
207+ do_openstack_upgrade,
208+ action_fail, action_set):
209+ _config.return_value = None
210+ self.test_config.set('action-managed-upgrade', True)
211+ openstack_upgrade_available.return_value = True
212+
213+ e = OSError('something bad happened')
214+ do_openstack_upgrade.side_effect = e
215+ traceback = (
216+ "Traceback (most recent call last):\n"
217+ " File \"actions/openstack_upgrade.py\", line 37, in openstack_upgrade\n" # noqa
218+ " openstack_upgrade(config(\'openstack-origin-git\'))\n"
219+ " File \"/usr/lib/python2.7/dist-packages/mock.py\", line 964, in __call__\n" # noqa
220+ " return _mock_self._mock_call(*args, **kwargs)\n"
221+ " File \"/usr/lib/python2.7/dist-packages/mock.py\", line 1019, in _mock_call\n" # noqa
222+ " raise effect\n"
223+ "OSError: something bad happened\n")
224+ format_exc.return_value = traceback
225+
226+ openstack_upgrade.openstack_upgrade()
227+
228+ msg = 'do_openstack_upgrade resulted in an unexpected error'
229+ action_fail.assert_called_with(msg)
230+ action_set.assert_called_with({'traceback': traceback})
231
232=== modified file 'unit_tests/test_glance_relations.py'
233--- unit_tests/test_glance_relations.py 2015-06-10 20:31:46 +0000
234+++ unit_tests/test_glance_relations.py 2015-08-14 15:55:41 +0000
235@@ -560,6 +560,15 @@
236 self.assertTrue(self.do_openstack_upgrade.called)
237 self.assertTrue(configure_https.called)
238
239+ @patch.object(relations, 'git_install_requested')
240+ def test_config_changed_with_openstack_upgrade_action(self, git_requested):
241+ git_requested.return_value = False
242+ self.openstack_upgrade_available.return_value = True
243+ self.test_config.set('action-managed-upgrade', True)
244+
245+ relations.config_changed()
246+ self.assertFalse(self.do_openstack_upgrade.called)
247+
248 @patch.object(relations, 'configure_https')
249 @patch.object(relations, 'git_install_requested')
250 @patch.object(relations, 'config_value_changed')

Subscribers

People subscribed via source and target branches