1
from mock import patch, MagicMock, call
3
from test_utils import CharmTestCase, patch_open
6
import nova_compute_utils as utils
12
'neutron_plugin_attribute',
19
'quantum-plugin-openvswitch-agent',
20
'openvswitch-datapath-dkms',
24
class NovaComputeUtilsTests(CharmTestCase):
26
super(NovaComputeUtilsTests, self).setUp(utils, TO_PATCH)
27
self.config.side_effect = self.test_config.get
29
@patch.object(utils, 'network_manager')
30
def test_determine_packages_nova_network(self, net_man):
31
net_man.return_value = 'flatdhcpmanager'
32
self.relation_ids.return_value = []
33
result = utils.determine_packages()
34
ex = utils.BASE_PACKAGES + [
39
self.assertEquals(ex, result)
41
@patch.object(utils, 'neutron_plugin')
42
@patch.object(utils, 'network_manager')
43
def test_determine_packages_quantum(self, net_man, n_plugin):
44
self.neutron_plugin_attribute.return_value = OVS_PKGS
45
net_man.return_value = 'quantum'
46
n_plugin.return_value = 'ovs'
47
self.relation_ids.return_value = []
48
result = utils.determine_packages()
49
ex = utils.BASE_PACKAGES + OVS_PKGS + ['nova-compute-kvm']
50
self.assertEquals(ex, result)
52
@patch.object(utils, 'neutron_plugin')
53
@patch.object(utils, 'network_manager')
54
def test_determine_packages_quantum_ceph(self, net_man, n_plugin):
55
self.neutron_plugin_attribute.return_value = OVS_PKGS
56
net_man.return_value = 'quantum'
57
n_plugin.return_value = 'ovs'
58
self.relation_ids.return_value = ['ceph:0']
59
result = utils.determine_packages()
60
ex = (utils.BASE_PACKAGES + OVS_PKGS +
61
['ceph-common', 'nova-compute-kvm'])
62
self.assertEquals(ex, result)
64
@patch.object(utils, 'network_manager')
65
def test_resource_map_nova_network_no_multihost(self, net_man):
66
self.skipTest('skipped until contexts are properly mocked')
67
self.test_config.set('multi-host', 'no')
68
net_man.return_value = 'FlatDHCPManager'
69
result = utils.resource_map()
71
'/etc/default/libvirt-bin': {
73
'services': ['libvirt-bin']
75
'/etc/libvirt/qemu.conf': {
77
'services': ['libvirt-bin']
79
'/etc/nova/nova-compute.conf': {
81
'services': ['nova-compute']
83
'/etc/nova/nova.conf': {
85
'services': ['nova-compute']
88
self.assertEquals(ex, result)
90
@patch.object(utils, 'network_manager')
91
def test_resource_map_nova_network(self, net_man):
93
self.skipTest('skipped until contexts are properly mocked')
94
net_man.return_value = 'FlatDHCPManager'
95
result = utils.resource_map()
97
'/etc/default/libvirt-bin': {
98
'contexts': [], 'services': ['libvirt-bin']
100
'/etc/libvirt/qemu.conf': {
102
'services': ['libvirt-bin']
104
'/etc/nova/nova-compute.conf': {
106
'services': ['nova-compute']
108
'/etc/nova/nova.conf': {
110
'services': ['nova-compute', 'nova-api', 'nova-network']
113
self.assertEquals(ex, result)
115
@patch.object(utils, 'neutron_plugin')
116
@patch.object(utils, 'network_manager')
117
def test_resource_map_quantum_ovs(self, net_man, _plugin):
118
self.skipTest('skipped until contexts are properly mocked.')
119
net_man.return_value = 'Quantum'
120
_plugin.return_value = 'ovs'
121
result = utils.resource_map()
123
'/etc/default/libvirt-bin': {
125
'services': ['libvirt-bin']
127
'/etc/libvirt/qemu.conf': {
129
'services': ['libvirt-bin']
131
'/etc/nova/nova-compute.conf': {
133
'services': ['nova-compute']
135
'/etc/nova/nova.conf': {
137
'services': ['nova-compute']
139
'/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini': {
141
'services': ['quantum-plugin-openvswitch-agent']
143
'/etc/quantum/quantum.conf': {
145
'services': ['quantum-plugin-openvswitch-agent']}
148
self.assertEquals(ex, result)
150
def fake_user(self, username='foo'):
152
user.pw_dir = '/home/' + username
155
@patch('__builtin__.open')
156
@patch('pwd.getpwnam')
157
def test_public_ssh_key_not_found(self, getpwnam, _open):
158
_open.side_effect = Exception
159
getpwnam.return_value = self.fake_user('foo')
160
self.assertEquals(None, utils.public_ssh_key())
162
@patch('pwd.getpwnam')
163
def test_public_ssh_key(self, getpwnam):
164
getpwnam.return_value = self.fake_user('foo')
165
with patch_open() as (_open, _file):
166
_file.read.return_value = 'mypubkey'
167
result = utils.public_ssh_key('foo')
168
self.assertEquals(result, 'mypubkey')
170
def test_import_authorized_keys_missing_data(self):
171
self.relation_get.return_value = None
172
with patch_open() as (_open, _file):
173
utils.import_authorized_keys(user='foo')
174
self.assertFalse(_open.called)
176
@patch('pwd.getpwnam')
177
def test_import_authorized_keys(self, getpwnam):
178
getpwnam.return_value = self.fake_user('foo')
179
self.relation_get.side_effect = [
180
'Zm9vX2tleQo=', # relation_get('known_hosts')
181
'Zm9vX2hvc3QK', # relation_get('authorized_keys')
185
call('/home/foo/.ssh/authorized_keys', 'wb'),
186
call('/home/foo/.ssh/known_hosts', 'wb')
193
with patch_open() as (_open, _file):
194
utils.import_authorized_keys(user='foo')
195
self.assertEquals(ex_open, _open.call_args_list)
196
self.assertEquals(ex_write, _file.write.call_args_list)
198
@patch('subprocess.check_call')
199
def test_import_keystone_cert_missing_data(self, check_call):
200
self.relation_get.return_value = None
201
with patch_open() as (_open, _file):
202
utils.import_keystone_ca_cert()
203
self.assertFalse(_open.called)
204
self.assertFalse(check_call.called)
206
@patch.object(utils, 'check_call')
207
def test_import_keystone_cert(self, check_call):
208
self.relation_get.return_value = 'Zm9vX2NlcnQK'
209
with patch_open() as (_open, _file):
210
utils.import_keystone_ca_cert()
211
_open.assert_called_with(utils.CA_CERT_PATH, 'wb')
212
_file.write.assert_called_with('foo_cert\n')
213
check_call.assert_called_with(['update-ca-certificates'])
215
@patch('charmhelpers.contrib.openstack.templating.OSConfigRenderer')
216
@patch.object(utils, 'quantum_enabled')
217
@patch.object(utils, 'resource_map')
218
def test_register_configs(self, resource_map, quantum, renderer):
219
quantum.return_value = False
220
self.os_release.return_value = 'havana'
221
fake_renderer = MagicMock()
222
fake_renderer.register = MagicMock()
223
renderer.return_value = fake_renderer
227
'/etc/nova/nova.conf': {
228
'services': ['nova-compute'],
231
'/etc/nova/nova-compute.conf': {
232
'services': ['nova-compute'],
236
resource_map.return_value = rsc_map
237
utils.register_configs()
238
renderer.assert_called_with(
239
openstack_release='havana', templates_dir='templates/')
241
call('/etc/nova/nova-compute.conf', [ctxt2]),
242
call('/etc/nova/nova.conf', [ctxt1])
244
self.assertEquals(fake_renderer.register.call_args_list, ex_reg)