~jamesj/charms/trusty/haproxy/xenial-support

« back to all changes in this revision

Viewing changes to hooks/tests/test_helpers.py

  • Committer: Christopher Glass
  • Date: 2015-02-20 09:42:24 UTC
  • mfrom: (86.2.15 ssl-crt-support)
  • Revision ID: christopher.glass@canonical.com-20150220094224-az770sf2ny2jnkax
Merge lp:~free.ekanayaka/charms/trusty/haproxy/ssl-crt-support [a=free.ekanayaka, r=tribaal]

This branch adds support for SSL termination if the installed HAproxy version
supports it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
class HelpersTest(TestCase):
15
15
 
 
16
    @patch('hooks.has_ssl_support')
16
17
    @patch('hooks.config_get')
17
 
    def test_creates_haproxy_globals(self, config_get):
 
18
    def test_creates_haproxy_globals(self, config_get, has_ssl_support):
18
19
        config_get.return_value = {
19
20
            'global_log': 'foo-log, bar-log',
20
21
            'global_maxconn': 123,
21
22
            'global_user': 'foo-user',
22
23
            'global_group': 'foo-group',
23
24
            'global_spread_checks': 234,
 
25
            'global_default_dh_param': 345,
24
26
            'global_debug': False,
25
27
            'global_quiet': False,
26
28
            'global_stats_socket': True,
27
29
        }
 
30
        has_ssl_support.return_value = True
28
31
        result = hooks.create_haproxy_globals()
29
32
 
30
33
        sock_path = "/var/run/haproxy/haproxy.sock"
36
39
            '    user foo-user',
37
40
            '    group foo-group',
38
41
            '    spread-checks 234',
 
42
            '    tune.ssl.default-dh-param 345',
39
43
            '    stats socket %s mode 0600' % sock_path,
40
44
        ])
41
45
        self.assertEqual(result, expected)
42
46
 
 
47
    @patch('hooks.has_ssl_support')
43
48
    @patch('hooks.config_get')
44
 
    def test_creates_haproxy_globals_quietly_with_debug(self, config_get):
 
49
    def test_creates_haproxy_globals_quietly_with_debug(
 
50
            self, config_get, has_ssl_support):
45
51
        config_get.return_value = {
46
52
            'global_log': 'foo-log, bar-log',
47
53
            'global_maxconn': 123,
48
54
            'global_user': 'foo-user',
49
55
            'global_group': 'foo-group',
50
56
            'global_spread_checks': 234,
 
57
            'global_default_dh_param': 345,
51
58
            'global_debug': True,
52
59
            'global_quiet': True,
53
60
            'global_stats_socket': False,
54
61
        }
 
62
        has_ssl_support.return_value = True
55
63
        result = hooks.create_haproxy_globals()
56
64
 
57
65
        expected = '\n'.join([
64
72
            '    debug',
65
73
            '    quiet',
66
74
            '    spread-checks 234',
 
75
            '    tune.ssl.default-dh-param 345',
 
76
        ])
 
77
        self.assertEqual(result, expected)
 
78
 
 
79
    @patch('hooks.has_ssl_support')
 
80
    @patch('hooks.config_get')
 
81
    def test_creates_haproxy_globals_no_ssl_support(
 
82
            self, config_get, has_ssl_support):
 
83
        config_get.return_value = {
 
84
            'global_log': 'foo-log, bar-log',
 
85
            'global_maxconn': 123,
 
86
            'global_user': 'foo-user',
 
87
            'global_group': 'foo-group',
 
88
            'global_spread_checks': 234,
 
89
            'global_debug': False,
 
90
            'global_quiet': False,
 
91
            'global_stats_socket': True,
 
92
        }
 
93
        has_ssl_support.return_value = False
 
94
        result = hooks.create_haproxy_globals()
 
95
 
 
96
        sock_path = "/var/run/haproxy/haproxy.sock"
 
97
        expected = '\n'.join([
 
98
            'global',
 
99
            '    log foo-log',
 
100
            '    log bar-log',
 
101
            '    maxconn 123',
 
102
            '    user foo-user',
 
103
            '    group foo-group',
 
104
            '    spread-checks 234',
 
105
            '    stats socket %s mode 0600' % sock_path,
67
106
        ])
68
107
        self.assertEqual(result, expected)
69
108
 
192
231
                         stanzas)
193
232
 
194
233
    @patch('hooks.load_haproxy_config')
 
234
    def test_get_listen_stanzas_with_ssl_frontend(self, load_haproxy_config):
 
235
        load_haproxy_config.return_value = '''
 
236
        frontend foo-2-123
 
237
            bind 1.2.3.4:123 ssl crt /foo/bar
 
238
            default_backend foo.internal
 
239
        frontend foo-2-234
 
240
            bind 1.2.3.5:234
 
241
            default_backend bar.internal
 
242
        '''
 
243
 
 
244
        stanzas = hooks.get_listen_stanzas()
 
245
 
 
246
        self.assertEqual((('foo.internal', '1.2.3.4', 123),
 
247
                          ('bar.internal', '1.2.3.5', 234)),
 
248
                         stanzas)
 
249
 
 
250
    @patch('hooks.load_haproxy_config')
195
251
    def test_get_empty_tuple_when_no_stanzas(self, load_haproxy_config):
196
252
        load_haproxy_config.return_value = '''
197
253
        '''
393
449
 
394
450
        self.assertEqual(expected, result)
395
451
 
 
452
    @patch.dict(os.environ, {"JUJU_UNIT_NAME": "haproxy/2"})
 
453
    def test_creates_a_listen_stanza_with_crts(self):
 
454
        service_name = 'foo'
 
455
        service_ip = '1.2.3.4'
 
456
        service_port = 443
 
457
        server_entries = [
 
458
            ('name-1', 'ip-1', 'port-1', ('foo1', 'bar1')),
 
459
        ]
 
460
        content = ("-----BEGIN CERTIFICATE-----\n"
 
461
                   "<data>\n"
 
462
                   "-----END CERTIFICATE-----\n")
 
463
        crts = [base64.b64encode(content)]
 
464
 
 
465
        result = hooks.create_listen_stanza(service_name, service_ip,
 
466
                                            service_port,
 
467
                                            server_entries=server_entries,
 
468
                                            service_crts=crts)
 
469
 
 
470
        expected = '\n'.join((
 
471
            'frontend haproxy-2-443',
 
472
            '    bind 1.2.3.4:443 ssl crt /var/lib/haproxy/service_foo/0.pem',
 
473
            '    default_backend foo',
 
474
            '',
 
475
            'backend foo',
 
476
            '    server name-1 ip-1:port-1 foo1 bar1',
 
477
        ))
 
478
 
 
479
        self.assertEqual(expected, result)
 
480
 
396
481
    def test_doesnt_create_listen_stanza_if_args_not_provided(self):
397
482
        self.assertIsNone(hooks.create_listen_stanza())
398
483