1
from testtools import TestCase
2
from mock import patch, call
7
class ReverseProxyRelationTest(TestCase):
10
super(ReverseProxyRelationTest, self).setUp()
12
self.relations_of_type = self.patch_hook("relations_of_type")
13
self.get_config_services = self.patch_hook("get_config_services")
14
self.log = self.patch_hook("log")
15
self.write_service_config = self.patch_hook("write_service_config")
16
self.apply_peer_config = self.patch_hook("apply_peer_config")
17
self.apply_peer_config.side_effect = lambda value: value
19
def patch_hook(self, hook_name):
20
mock_controller = patch.object(hooks, hook_name)
21
mock = mock_controller.start()
22
self.addCleanup(mock_controller.stop)
25
def test_relation_data_returns_none(self):
26
self.get_config_services.return_value = {
28
"service_name": "service",
31
self.relations_of_type.return_value = []
32
self.assertIs(None, hooks.create_services())
33
self.log.assert_called_once_with("No backend servers, exiting.")
34
self.write_service_config.assert_not_called()
36
def test_relation_data_returns_no_relations(self):
37
self.get_config_services.return_value = {
39
"service_name": "service",
42
self.relations_of_type.return_value = []
43
self.assertIs(None, hooks.create_services())
44
self.log.assert_called_once_with("No backend servers, exiting.")
45
self.write_service_config.assert_not_called()
47
def test_relation_no_services(self):
48
self.get_config_services.return_value = {}
49
self.relations_of_type.return_value = [
52
"hostname": "backend.1",
53
"private-address": "1.2.3.4"},
55
self.assertIs(None, hooks.create_services())
56
self.log.assert_called_once_with("No services configured, exiting.")
57
self.write_service_config.assert_not_called()
59
def test_no_port_in_relation_data(self):
60
self.get_config_services.return_value = {
62
"service_name": "service",
65
self.relations_of_type.return_value = [
66
{"private-address": "1.2.3.4",
69
self.assertIs(None, hooks.create_services())
70
self.log.assert_has_calls([call.log(
71
"No port in relation data for 'foo/0', skipping.")])
72
self.write_service_config.assert_not_called()
74
def test_no_private_address_in_relation_data(self):
75
self.get_config_services.return_value = {
77
"service_name": "service",
80
self.relations_of_type.return_value = [
84
self.assertIs(None, hooks.create_services())
85
self.log.assert_has_calls([call.log(
86
"No private-address in relation data for 'foo/0', skipping.")])
87
self.write_service_config.assert_not_called()
89
def test_no_hostname_in_relation_data(self):
90
self.get_config_services.return_value = {
92
"service_name": "service",
95
self.relations_of_type.return_value = [
97
"private-address": "1.2.3.4",
100
self.assertIs(None, hooks.create_services())
101
self.log.assert_has_calls([call.log(
102
"No hostname in relation data for 'foo/0', skipping.")])
103
self.write_service_config.assert_not_called()
105
def test_relation_unknown_service(self):
106
self.get_config_services.return_value = {
108
"service_name": "service",
111
self.relations_of_type.return_value = [
113
"hostname": "backend.1",
114
"service_name": "invalid",
115
"private-address": "1.2.3.4",
116
"__unit__": "foo/0"},
118
self.assertIs(None, hooks.create_services())
119
self.log.assert_has_calls([call.log(
120
"Service 'invalid' does not exist.")])
121
self.write_service_config.assert_not_called()
123
def test_no_relation_but_has_servers_from_config(self):
124
self.get_config_services.return_value = {
126
"service_name": "service",
129
"service_name": "service",
131
("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]),
135
self.relations_of_type.return_value = []
139
'service_name': 'service',
141
("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]),
145
self.assertEqual(expected, hooks.create_services())
146
self.write_service_config.assert_called_with(expected)
148
def test_relation_default_service(self):
149
self.get_config_services.return_value = {
151
"service_name": "service",
154
"service_name": "service",
157
self.relations_of_type.return_value = [
159
"hostname": "backend.1",
160
"private-address": "1.2.3.4",
161
"__unit__": "foo/0"},
166
'service_name': 'service',
167
'servers': [('foo-0-4242', '1.2.3.4', 4242, [])],
170
self.assertEqual(expected, hooks.create_services())
171
self.write_service_config.assert_called_with(expected)
173
def test_with_service_options(self):
174
self.get_config_services.return_value = {
176
"service_name": "service",
179
"service_name": "service",
180
"server_options": ["maxconn 4"],
183
self.relations_of_type.return_value = [
185
"hostname": "backend.1",
186
"private-address": "1.2.3.4",
187
"__unit__": "foo/0"},
192
'service_name': 'service',
193
'server_options': ["maxconn 4"],
194
'servers': [('foo-0-4242', '1.2.3.4',
195
4242, ["maxconn 4"])],
198
self.assertEqual(expected, hooks.create_services())
199
self.write_service_config.assert_called_with(expected)
201
def test_with_service_name(self):
202
self.get_config_services.return_value = {
204
"service_name": "service",
207
"service_name": "foo_service",
208
"server_options": ["maxconn 4"],
211
self.relations_of_type.return_value = [
213
"hostname": "backend.1",
214
"service_name": "foo_service",
215
"private-address": "1.2.3.4",
216
"__unit__": "foo/0"},
221
'service_name': 'foo_service',
222
'server_options': ["maxconn 4"],
223
'servers': [('foo-0-4242', '1.2.3.4',
224
4242, ["maxconn 4"])],
227
self.assertEqual(expected, hooks.create_services())
228
self.write_service_config.assert_called_with(expected)
230
def test_no_service_name_unit_name_match_service_name(self):
231
self.get_config_services.return_value = {
233
"service_name": "foo_service",
236
"service_name": "foo_service",
237
"server_options": ["maxconn 4"],
240
self.relations_of_type.return_value = [
242
"hostname": "backend.1",
243
"private-address": "1.2.3.4",
244
"__unit__": "foo/1"},
249
'service_name': 'foo_service',
250
'server_options': ["maxconn 4"],
251
'servers': [('foo-1-4242', '1.2.3.4',
252
4242, ["maxconn 4"])],
255
self.assertEqual(expected, hooks.create_services())
256
self.write_service_config.assert_called_with(expected)
258
def test_with_sitenames_match_service_name(self):
259
self.get_config_services.return_value = {
261
"service_name": "service",
264
"service_name": "foo_srv",
265
"server_options": ["maxconn 4"],
268
self.relations_of_type.return_value = [
270
"hostname": "backend.1",
271
"sitenames": "foo_srv bar_srv",
272
"private-address": "1.2.3.4",
273
"__unit__": "foo/0"},
278
'service_name': 'foo_srv',
279
'server_options': ["maxconn 4"],
280
'servers': [('foo-0-4242', '1.2.3.4',
281
4242, ["maxconn 4"])],
284
self.assertEqual(expected, hooks.create_services())
285
self.write_service_config.assert_called_with(expected)
287
def test_with_juju_services_match_service_name(self):
288
self.get_config_services.return_value = {
290
"service_name": "service",
293
"service_name": "foo_service",
294
"server_options": ["maxconn 4"],
297
self.relations_of_type.return_value = [
299
"hostname": "backend.1",
300
"private-address": "1.2.3.4",
301
"__unit__": "foo/1"},
306
'service_name': 'foo_service',
307
'server_options': ["maxconn 4"],
308
'servers': [('foo-1-4242', '1.2.3.4',
309
4242, ["maxconn 4"])],
313
result = hooks.create_services()
315
self.assertEqual(expected, result)
316
self.write_service_config.assert_called_with(expected)
318
def test_with_sitenames_no_match_but_unit_name(self):
319
self.get_config_services.return_value = {
321
"service_name": "service",
324
"service_name": "foo",
325
"server_options": ["maxconn 4"],
328
self.relations_of_type.return_value = [
330
"hostname": "backend.1",
331
"sitenames": "bar_service baz_service",
332
"private-address": "1.2.3.4",
333
"__unit__": "foo/0"},
338
'service_name': 'foo',
339
'server_options': ["maxconn 4"],
340
'servers': [('foo-0-4242', '1.2.3.4',
341
4242, ["maxconn 4"])],
344
self.assertEqual(expected, hooks.create_services())
345
self.write_service_config.assert_called_with(expected)