70
69
self.config.side_effect = self.test_config.get_all
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)
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)
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')
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)
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')
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)
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)
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)
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)
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)
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)
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')
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)
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)
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)
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()
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')
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')
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)
236
235
self.config.side_effect = self.test_config.get_all
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)
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)
253
252
def test_amqp_joined_passes_relation_id(self):
254
''' Ensures relation_id correct passed to relation_set for out of
253
'''Ensures relation_id correct passed to relation_set for out of
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')
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)
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)
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)
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)
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',
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')
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