~openstack-charmers/charms/precise/cinder/active-active

« back to all changes in this revision

Viewing changes to unit_tests/test_cinder_hooks.py

  • Committer: Edward Hope-Morley
  • Date: 2014-03-27 12:26:49 UTC
  • mfrom: (27.2.5 cinder)
  • Revision ID: edward.hope-morley@canonical.com-20140327122649-n02r4o447bcbwapd
[hopem] updated from trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
1
from mock import MagicMock, patch, call
3
2
 
4
 
 
5
3
import cinder_utils as utils
6
4
 
7
5
from test_utils import (
42
40
    'set_ceph_env_variables',
43
41
    'CONFIGS',
44
42
    'CLUSTER_RES',
 
43
    'ceph_config_file',
45
44
    # charmhelpers.core.hookenv
46
45
    'config',
47
46
    'relation_get',
70
69
        self.config.side_effect = self.test_config.get_all
71
70
 
72
71
    def test_install_precise_distro(self):
73
 
        '''It redirects to cloud archive if setup to install precise+distro'''
 
72
        'It redirects to cloud archive if setup to install precise+distro'
74
73
        self.lsb_release.return_value = {'DISTRIB_CODENAME': 'precise'}
75
74
        hooks.hooks.execute(['hooks/install'])
76
75
        ca = 'cloud:precise-folsom'
77
76
        self.configure_installation_source.assert_called_with(ca)
78
77
 
79
78
    def test_correct_install_packages(self):
80
 
        '''It installs the correct packages based on what is determined'''
 
79
        'It installs the correct packages based on what is determined'
81
80
        self.determine_packages.return_value = ['foo', 'bar', 'baz']
82
81
        hooks.hooks.execute(['hooks/install'])
83
82
        self.apt_install.assert_called_with(['foo', 'bar', 'baz'], fatal=True)
84
83
 
85
84
    def test_storage_prepared(self):
86
 
        '''It prepares local storage if volume service enabled'''
 
85
        'It prepares local storage if volume service enabled'
87
86
        self.test_config.set('block-device', 'vdb')
88
87
        self.test_config.set('volume-group', 'cinder')
89
88
        self.test_config.set('overwrite', 'true')
94
93
        self.prepare_lvm_storage.assert_called_with('/dev/vdb', 'cinder')
95
94
 
96
95
    def test_storage_not_prepared(self):
97
 
        '''It does not prepare storage when not necessary'''
 
96
        'It does not prepare storage when not necessary'
98
97
        self.service_enabled.return_value = False
99
98
        hooks.hooks.execute(['hooks/install'])
100
99
        self.assertFalse(self.ensure_block_device.called)
105
104
            self.assertFalse(self.ensure_block_device.called)
106
105
 
107
106
    def test_storage_is_cleaned(self):
108
 
        '''It cleans storage when configured to do so'''
 
107
        'It cleans storage when configured to do so'
109
108
        self.ensure_block_device.return_value = '/dev/foo'
110
109
        for true in ['True', 'true', True]:
111
110
            self.test_config.set('overwrite', true)
113
112
            self.clean_storage.assert_called_with('/dev/foo')
114
113
 
115
114
    def test_storage_is_not_cleaned(self):
116
 
        '''It does not clean storage when not configured to'''
 
115
        'It does not clean storage when not configured to'
117
116
        self.ensure_block_device.return_value = '/dev/foo'
118
117
        for true in ['False', 'false', False]:
119
118
            self.test_config.set('overwrite', true)
140
139
 
141
140
    @patch.object(hooks, 'configure_https')
142
141
    def test_config_changed(self, conf_https):
143
 
        '''It writes out all config'''
 
142
        'It writes out all config'
144
143
        self.openstack_upgrade_available.return_value = False
145
144
        hooks.hooks.execute(['hooks/config-changed'])
146
145
        self.assertTrue(self.CONFIGS.write_all.called)
148
147
 
149
148
    @patch.object(hooks, 'configure_https')
150
149
    def test_config_changed_upgrade_available(self, conf_https):
151
 
        '''It writes out all config with an available OS upgrade'''
 
150
        'It writes out all config with an available OS upgrade'
152
151
        self.openstack_upgrade_available.return_value = True
153
152
        hooks.hooks.execute(['hooks/config-changed'])
154
153
        self.do_openstack_upgrade.assert_called_with(configs=self.CONFIGS)
155
154
 
156
155
    def test_db_changed(self):
157
 
        '''It writes out cinder.conf on db changed'''
 
156
        'It writes out cinder.conf on db changed'
158
157
        self.CONFIGS.complete_contexts.return_value = ['shared-db']
159
158
        hooks.hooks.execute(['hooks/shared-db-relation-changed'])
160
159
        self.CONFIGS.write.assert_called_with('/etc/cinder/cinder.conf')
161
160
        self.assertTrue(self.migrate_database.called)
162
161
 
163
162
    def test_db_changed_relation_incomplete(self):
164
 
        '''It does not write out cinder.conf with incomplete shared-db rel'''
 
163
        'It does not write out cinder.conf with incomplete shared-db rel'
165
164
        hooks.hooks.execute(['hooks/shared-db-relation-changed'])
166
165
        self.assertFalse(self.CONFIGS.write.called)
167
166
        self.assertFalse(self.migrate_database.called)
168
167
 
169
168
    def test_db_changed_not_leader(self):
170
 
        '''It does not migrate database when not leader'''
 
169
        'It does not migrate database when not leader'
171
170
        self.eligible_leader.return_value = False
172
171
        self.CONFIGS.complete_contexts.return_value = ['shared-db']
173
172
        hooks.hooks.execute(['hooks/shared-db-relation-changed'])
175
174
        self.assertFalse(self.migrate_database.called)
176
175
 
177
176
    def test_amqp_changed(self):
178
 
        '''It writes out cinder.conf on amqp changed with complete relation'''
 
177
        'It writes out cinder.conf on amqp changed with complete relation'
179
178
        self.CONFIGS.complete_contexts.return_value = ['amqp']
180
179
        hooks.hooks.execute(['hooks/amqp-relation-changed'])
181
180
        self.CONFIGS.write.assert_called_with('/etc/cinder/cinder.conf')
182
181
 
183
182
    def test_amqp_changed_incomplete(self):
184
 
        '''It does not write out cinder.conf with incomplete relation'''
 
183
        'It does not write out cinder.conf with incomplete relation'
185
184
        self.CONFIGS.complete_contexts.return_value = ['']
186
185
        hooks.hooks.execute(['hooks/amqp-relation-changed'])
187
186
        self.assertFalse(self.CONFIGS.write.called)
188
187
 
189
188
    @patch.object(hooks, 'configure_https')
190
189
    def test_identity_changed(self, conf_https):
191
 
        '''It writes out api-paste.ini on identity-service changed'''
 
190
        'It writes out api-paste.ini on identity-service changed'
192
191
        self.CONFIGS.complete_contexts.return_value = ['identity-service']
193
192
        hooks.hooks.execute(['hooks/identity-service-relation-changed'])
194
193
        self.CONFIGS.write.assert_called_with('/etc/cinder/api-paste.ini')
195
194
        self.assertTrue(conf_https.called)
196
195
 
197
196
    def test_identity_changed_incomplete(self):
198
 
        '''It doesn't write api-paste.ini with incomplete identity-service'''
 
197
        'It does not write api-paste.ini with incomplete identity-service'
199
198
        hooks.hooks.execute(['hooks/identity-service-relation-changed'])
200
199
        self.assertFalse(self.CONFIGS.write.called)
201
200
 
202
201
    @patch.object(hooks, 'identity_joined')
203
202
    def test_configure_https_enable(self, identity_joined):
204
 
        '''It enables https from hooks when we have https data'''
 
203
        'It enables https from hooks when we have https data'
205
204
        self.CONFIGS.complete_contexts.return_value = ['https']
206
205
        self.relation_ids.return_value = ['identity-service:0']
207
206
        hooks.configure_https()
211
210
 
212
211
    @patch.object(hooks, 'identity_joined')
213
212
    def test_configure_https_disable(self, identity_joined):
214
 
        '''It enables https from hooks when we have https data'''
 
213
        'It enables https from hooks when we have https data'
215
214
        self.CONFIGS.complete_contexts.return_value = []
216
215
        self.relation_ids.return_value = ['identity-service:0']
217
216
        hooks.configure_https()
220
219
        identity_joined.assert_called_with(rid='identity-service:0')
221
220
 
222
221
    def test_image_service_changed(self):
223
 
        ''' Ensure all configuration files written if image service changes '''
 
222
        'Ensure all configuration files written if image service changes'
224
223
        hooks.hooks.execute(['hooks/image-service-relation-changed'])
225
224
        self.CONFIGS.write.assert_called_with('/etc/cinder/cinder.conf')
226
225
 
227
226
    def test_relation_broken(self):
228
 
        ''' Ensure all configuration files written if image service changes '''
 
227
        'Ensure all configuration files written if image service changes'
229
228
        hooks.hooks.execute(['hooks/image-service-relation-broken'])
230
229
        self.assertTrue(self.CONFIGS.write_all.called)
231
230
 
236
235
        self.config.side_effect = self.test_config.get_all
237
236
 
238
237
    def test_db_joined(self):
239
 
        '''It properly requests access to a shared-db service'''
 
238
        'It properly requests access to a shared-db service'
240
239
        self.unit_get.return_value = 'cindernode1'
241
240
        hooks.hooks.execute(['hooks/shared-db-relation-joined'])
242
241
        expected = {'username': 'cinder',
244
243
        self.relation_set.assert_called_with(**expected)
245
244
 
246
245
    def test_amqp_joined(self):
247
 
        '''It properly requests access to an amqp service'''
 
246
        'It properly requests access to an amqp service'
248
247
        hooks.hooks.execute(['hooks/amqp-relation-joined'])
249
248
        self.relation_set.assert_called_with(username='cinder',
250
249
                                             vhost='openstack',
251
250
                                             relation_id=None)
252
251
 
253
252
    def test_amqp_joined_passes_relation_id(self):
254
 
        ''' Ensures relation_id correct passed to relation_set for out of
255
 
            hook execution '''
 
253
        '''Ensures relation_id correct passed to relation_set for out of
 
254
            hook execution
 
255
        '''
256
256
        hooks.amqp_joined(relation_id='amqp:1')
257
257
        self.relation_set.assert_called_with(username='cinder',
258
258
                                             vhost='openstack',
259
259
                                             relation_id='amqp:1')
260
260
 
261
261
    def test_identity_service_joined(self):
262
 
        '''It properly requests unclustered endpoint via identity-service'''
 
262
        'It properly requests unclustered endpoint via identity-service'
263
263
        self.unit_get.return_value = 'cindernode1'
264
264
        self.canonical_url.return_value = 'http://cindernode1'
265
265
        hooks.hooks.execute(['hooks/identity-service-relation-joined'])
274
274
        self.relation_set.assert_called_with(**expected)
275
275
 
276
276
    def test_identity_service_joined_no_leadership(self):
277
 
        '''It does nothing on identity-joined when not eligible leader'''
 
277
        'It does nothing on identity-joined when not eligible leader'
278
278
        self.eligible_leader.return_value = False
279
279
        hooks.hooks.execute(['hooks/identity-service-relation-joined'])
280
280
        self.assertFalse(self.relation_set.called)
281
281
 
282
282
    @patch('os.mkdir')
283
283
    def test_ceph_joined(self, mkdir):
284
 
        '''It correctly prepares for a ceph changed hook'''
 
284
        'It correctly prepares for a ceph changed hook'
285
285
        with patch('os.path.isdir') as isdir:
286
286
            isdir.return_value = False
287
287
            hooks.hooks.execute(['hooks/ceph-relation-joined'])
289
289
        self.apt_install.assert_called_with('ceph-common', fatal=True)
290
290
 
291
291
    def test_ceph_changed_no_key(self):
292
 
        '''It does nothing when ceph key is not available'''
 
292
        'It does nothing when ceph key is not available'
293
293
        self.CONFIGS.complete_contexts.return_value = ['']
294
294
        hooks.hooks.execute(['hooks/ceph-relation-changed'])
295
295
        m = 'ceph relation incomplete. Peer not ready?'
296
296
        self.juju_log.assert_called_with(m)
297
297
 
298
298
    def test_ceph_changed(self):
299
 
        '''It ensures ceph assets created on ceph changed'''
 
299
        'It ensures ceph assets created on ceph changed'
300
300
        self.CONFIGS.complete_contexts.return_value = ['ceph']
301
301
        self.service_name.return_value = 'cinder'
302
302
        self.ensure_ceph_keyring.return_value = True
 
303
        self.ceph_config_file.return_value = '/var/lib/charm/cinder/ceph.conf'
303
304
        hooks.hooks.execute(['hooks/ceph-relation-changed'])
304
305
        self.ensure_ceph_keyring.assert_called_with(service='cinder',
305
306
                                                    user='cinder',
306
307
                                                    group='cinder')
307
308
        self.ensure_ceph_pool.assert_called_with(service='cinder', replicas=2)
308
 
        for c in [call('/etc/ceph/ceph.conf'),
 
309
        for c in [call('/var/lib/charm/cinder/ceph.conf'),
309
310
                  call('/etc/cinder/cinder.conf')]:
310
311
            self.assertIn(c, self.CONFIGS.write.call_args_list)
311
312
        self.set_ceph_env_variables.assert_called_with(service='cinder')
312
313
 
313
314
    def test_ceph_changed_no_keys(self):
314
 
        '''It ensures ceph assets created on ceph changed'''
 
315
        'It ensures ceph assets created on ceph changed'
315
316
        self.CONFIGS.complete_contexts.return_value = ['ceph']
316
317
        self.service_name.return_value = 'cinder'
317
318
        self.ensure_ceph_keyring.return_value = False