Merge lp:~hopem/charms/trusty/cinder/lp1493931-stable into lp:~openstack-charmers-archive/charms/trusty/cinder/trunk

Proposed by Edward Hope-Morley
Status: Merged
Merged at revision: 99
Proposed branch: lp:~hopem/charms/trusty/cinder/lp1493931-stable
Merge into: lp:~openstack-charmers-archive/charms/trusty/cinder/trunk
Diff against target: 292 lines (+252/-2)
3 files modified
hooks/cinder_contexts.py (+45/-1)
hooks/cinder_utils.py (+1/-1)
unit_tests/test_cinder_contexts.py (+206/-0)
To merge this branch: bzr merge lp:~hopem/charms/trusty/cinder/lp1493931-stable
Reviewer Review Type Date Requested Status
Liam Young (community) Approve
Review via email: mp+271296@code.launchpad.net
To post a comment you must log in.
Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #10185 cinder for hopem mp271296
    LINT OK: passed

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

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #9343 cinder for hopem mp271296
    UNIT OK: passed

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

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_amulet_test #6474 cinder for hopem mp271296
    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/12437382/
Build: http://10.245.162.77:8080/job/charm_amulet_test/6474/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #10423 cinder for hopem mp271296
    LINT OK: passed

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

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #9616 cinder for hopem mp271296
    UNIT OK: passed

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

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_amulet_test #6570 cinder for hopem mp271296
    AMULET OK: passed

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

Revision history for this message
Liam Young (gnuoy) wrote :

Approve

review: Approve
Revision history for this message
Liam Young (gnuoy) wrote :

Approve

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'hooks/cinder_contexts.py'
--- hooks/cinder_contexts.py 2014-11-25 10:19:07 +0000
+++ hooks/cinder_contexts.py 2015-09-16 12:59:43 +0000
@@ -3,12 +3,15 @@
3 relation_ids,3 relation_ids,
4 service_name,4 service_name,
5 related_units,5 related_units,
6 relation_get6 relation_get,
7 log,
8 WARNING,
7)9)
810
9from charmhelpers.contrib.openstack.context import (11from charmhelpers.contrib.openstack.context import (
10 OSContextGenerator,12 OSContextGenerator,
11 ApacheSSLContext as SSLContext,13 ApacheSSLContext as SSLContext,
14 SubordinateConfigContext,
12)15)
1316
14from charmhelpers.contrib.openstack.utils import (17from charmhelpers.contrib.openstack.utils import (
@@ -110,3 +113,44 @@
110113
111 def __call__(self):114 def __call__(self):
112 return {'debug': config('debug'), 'verbose': config('verbose')}115 return {'debug': config('debug'), 'verbose': config('verbose')}
116
117
118class CinderSubordinateConfigContext(SubordinateConfigContext):
119
120 def __call__(self):
121 ctxt = super(CinderSubordinateConfigContext, self).__call__()
122
123 # If all backends are stateless we can allow host setting to be set
124 # across hosts/units to allow for HA volume failover but otherwise we
125 # have to leave it as unique (LP: #1493931).
126 rids = []
127 for interface in self.interfaces:
128 rids.extend(relation_ids(interface))
129
130 stateless = None
131 any_stateless = False
132 for rid in rids:
133 for unit in related_units(rid):
134 val = relation_get('stateless', rid=rid, unit=unit) or ""
135 if val.lower() == 'true':
136 if stateless is None:
137 stateless = True
138 else:
139 stateless = stateless and True
140 else:
141 stateless = False
142
143 any_stateless = any_stateless or stateless
144
145 if stateless:
146 if 'DEFAULT' in ctxt['sections']:
147 ctxt['sections']['DEFAULT'].append(('host', service_name()))
148 else:
149 ctxt['sections']['DEFAULT'] = [('host', service_name())]
150
151 elif any_stateless:
152 log("One or more stateless backends configured but unable to "
153 "set host param since there appear to also be stateful "
154 "backends configured.", level=WARNING)
155
156 return ctxt
113157
=== modified file 'hooks/cinder_utils.py'
--- hooks/cinder_utils.py 2015-08-10 16:34:04 +0000
+++ hooks/cinder_utils.py 2015-09-16 12:59:43 +0000
@@ -172,7 +172,7 @@
172 cinder_contexts.CephContext(),172 cinder_contexts.CephContext(),
173 cinder_contexts.HAProxyContext(),173 cinder_contexts.HAProxyContext(),
174 cinder_contexts.ImageServiceContext(),174 cinder_contexts.ImageServiceContext(),
175 context.SubordinateConfigContext(175 cinder_contexts.CinderSubordinateConfigContext(
176 interface='storage-backend',176 interface='storage-backend',
177 service='cinder',177 service='cinder',
178 config_file=CINDER_CONF),178 config_file=CINDER_CONF),
179179
=== modified file 'unit_tests/test_cinder_contexts.py'
--- unit_tests/test_cinder_contexts.py 2014-10-01 22:07:44 +0000
+++ unit_tests/test_cinder_contexts.py 2015-09-16 12:59:43 +0000
@@ -135,3 +135,209 @@
135 'namespace': 'cinder'})135 'namespace': 'cinder'})
136 self.assertTrue(mock_https.called)136 self.assertTrue(mock_https.called)
137 mock_unit_get.assert_called_with('private-address')137 mock_unit_get.assert_called_with('private-address')
138
139 @patch('%s.relation_get' % (mod_ch_context))
140 @patch('%s.related_units' % (mod_ch_context))
141 @patch('%s.relation_ids' % (mod_ch_context))
142 @patch('%s.log' % (mod_ch_context), lambda *args, **kwargs: None)
143 def test_subordinate_config_context_stateless(self, mock_rel_ids,
144 mock_rel_units,
145 mock_rel_get):
146 mock_rel_ids.return_value = ['storage-backend:0']
147 self.relation_ids.return_value = ['storage-backend:0']
148
149 mock_rel_units.return_value = ['cinder-ceph/0']
150 self.related_units.return_value = ['cinder-ceph/0']
151
152 self.service_name.return_value = 'cinder'
153
154 settings = \
155 {'backend_name': 'cinder-ceph',
156 'private-address': '10.5.8.191',
157 'stateless': 'True',
158 'subordinate_configuration':
159 '{"cinder": '
160 '{"/etc/cinder/cinder.conf": '
161 '{"sections": '
162 '{"cinder-ceph": '
163 '[["volume_backend_name", '
164 '"cinder-ceph"], '
165 '["volume_driver", '
166 '"cinder.volume.drivers.rbd.RBDDriver"], '
167 '["rbd_pool", '
168 '"cinder-ceph"], '
169 '["rbd_user", '
170 '"cinder-ceph"]]}}}}'}
171
172 def fake_rel_get(attribute=None, unit=None, rid=None):
173 return settings.get(attribute)
174
175 mock_rel_get.side_effect = fake_rel_get
176 self.relation_get.side_effect = fake_rel_get
177
178 ctxt = contexts.CinderSubordinateConfigContext(
179 interface='storage-backend',
180 service='cinder',
181 config_file='/etc/cinder/cinder.conf')()
182
183 exp = {'sections': {'DEFAULT': [('host', 'cinder')],
184 u'cinder-ceph': [[u'volume_backend_name', u'cinder-ceph'],
185 [u'volume_driver',
186 u'cinder.volume.drivers.rbd.RBDDriver'],
187 [u'rbd_pool', u'cinder-ceph'],
188 [u'rbd_user', u'cinder-ceph']]}}
189
190 self.assertEquals(ctxt, exp)
191
192 @patch('%s.relation_get' % (mod_ch_context))
193 @patch('%s.related_units' % (mod_ch_context))
194 @patch('%s.relation_ids' % (mod_ch_context))
195 @patch('%s.log' % (mod_ch_context), lambda *args, **kwargs: None)
196 def test_subordinate_config_context_statefull(self, mock_rel_ids,
197 mock_rel_units,
198 mock_rel_get):
199 mock_rel_ids.return_value = ['storage-backend:0']
200 self.relation_ids.return_value = ['storage-backend:0']
201
202 mock_rel_units.return_value = ['cinder-ceph/0']
203 self.related_units.return_value = ['cinder-ceph/0']
204
205 self.service_name.return_value = 'cinder'
206
207 settings = \
208 {'backend_name': 'cinder-ceph',
209 'private-address': '10.5.8.191',
210 'stateless': 'False',
211 'subordinate_configuration':
212 '{"cinder": '
213 '{"/etc/cinder/cinder.conf": '
214 '{"sections": '
215 '{"cinder-ceph": '
216 '[["volume_backend_name", '
217 '"cinder-ceph"], '
218 '["volume_driver", '
219 '"cinder.volume.drivers.rbd.RBDDriver"], '
220 '["rbd_pool", '
221 '"cinder-ceph"], '
222 '["rbd_user", '
223 '"cinder-ceph"]]}}}}'}
224
225 def fake_rel_get(attribute=None, unit=None, rid=None):
226 return settings.get(attribute)
227
228 mock_rel_get.side_effect = fake_rel_get
229 self.relation_get.side_effect = fake_rel_get
230
231 ctxt = contexts.CinderSubordinateConfigContext(
232 interface='storage-backend',
233 service='cinder',
234 config_file='/etc/cinder/cinder.conf')()
235
236 exp = {'sections':
237 {u'cinder-ceph': [[u'volume_backend_name',
238 u'cinder-ceph'],
239 [u'volume_driver',
240 u'cinder.volume.drivers.rbd.RBDDriver'],
241 [u'rbd_pool', u'cinder-ceph'],
242 [u'rbd_user', u'cinder-ceph']]}}
243
244 self.assertEquals(ctxt, exp)
245
246 del settings['stateless']
247
248 ctxt = contexts.CinderSubordinateConfigContext(
249 interface='storage-backend',
250 service='cinder',
251 config_file='/etc/cinder/cinder.conf')()
252
253 exp = {'sections':
254 {u'cinder-ceph': [[u'volume_backend_name',
255 u'cinder-ceph'],
256 [u'volume_driver',
257 u'cinder.volume.drivers.rbd.RBDDriver'],
258 [u'rbd_pool', u'cinder-ceph'],
259 [u'rbd_user', u'cinder-ceph']]}}
260
261 self.assertEquals(ctxt, exp)
262
263 @patch('%s.relation_get' % (mod_ch_context))
264 @patch('%s.related_units' % (mod_ch_context))
265 @patch('%s.relation_ids' % (mod_ch_context))
266 @patch.object(contexts, 'log', lambda *args, **kwargs: None)
267 @patch('%s.log' % (mod_ch_context), lambda *args, **kwargs: None)
268 def test_subordinate_config_context_mixed(self, mock_rel_ids,
269 mock_rel_units,
270 mock_rel_get):
271 mock_rel_ids.return_value = ['storage-backend:0', 'storage-backend:1']
272 self.relation_ids.return_value = ['storage-backend:0',
273 'storage-backend:1']
274
275 def fake_rel_units(rid):
276 if rid == 'storage-backend:0':
277 return ['cinder-ceph/0']
278 else:
279 return ['cinder-other/0']
280
281 mock_rel_units.side_effect = fake_rel_units
282 self.related_units.side_effect = fake_rel_units
283
284 self.service_name.return_value = 'cinder'
285
286 cinder_ceph_settings = \
287 {'backend_name': 'cinder-ceph',
288 'private-address': '10.5.8.191',
289 'stateless': 'True',
290 'subordinate_configuration':
291 '{"cinder": '
292 '{"/etc/cinder/cinder.conf": '
293 '{"sections": '
294 '{"cinder-ceph": '
295 '[["volume_backend_name", '
296 '"cinder-ceph"], '
297 '["volume_driver", '
298 '"cinder.volume.drivers.rbd.RBDDriver"], '
299 '["rbd_pool", '
300 '"cinder-ceph"], '
301 '["rbd_user", '
302 '"cinder-ceph"]]}}}}'}
303
304 cinder_other_settings = \
305 {'backend_name': 'cinder-other',
306 'private-address': '10.5.8.192',
307 'subordinate_configuration':
308 '{"cinder": '
309 '{"/etc/cinder/cinder.conf": '
310 '{"sections": '
311 '{"cinder-other": '
312 '[["volume_backend_name", '
313 '"cinder-other"], '
314 '["volume_driver", '
315 '"cinder.volume.drivers.OtherDriver"]]}}}}'}
316
317 def fake_rel_get(attribute=None, unit=None, rid=None):
318 if unit == 'cinder-ceph/0':
319 return cinder_ceph_settings.get(attribute)
320 elif unit == 'cinder-other/0':
321 return cinder_other_settings.get(attribute)
322
323 mock_rel_get.side_effect = fake_rel_get
324 self.relation_get.side_effect = fake_rel_get
325
326 ctxt = contexts.CinderSubordinateConfigContext(
327 interface='storage-backend',
328 service='cinder',
329 config_file='/etc/cinder/cinder.conf')()
330
331 exp = {'sections':
332 {u'cinder-ceph': [[u'volume_backend_name',
333 u'cinder-ceph'],
334 [u'volume_driver',
335 u'cinder.volume.drivers.rbd.RBDDriver'],
336 [u'rbd_pool', u'cinder-ceph'],
337 [u'rbd_user', u'cinder-ceph']],
338 u'cinder-other': [[u'volume_backend_name',
339 u'cinder-other'],
340 [u'volume_driver',
341 u'cinder.volume.drivers.OtherDriver']]}}
342
343 self.assertEquals(ctxt, exp)

Subscribers

People subscribed via source and target branches